From 7c0d8f292fd8705cdbb6d5440cbc9e380fc6d711 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 10 Nov 2021 07:39:07 -0500 Subject: [PATCH] fix: make this work on CPython 3.11 #1241 The fix for CTracer is egregious and will need to be updated when there's a supported way to do it. The fullcoverage skip is noted in https://github.com/nedbat/coveragepy/issues/1278 The raise_through_with skip is noted in https://github.com/nedbat/coveragepy/issues/1270 --- .github/workflows/coverage.yml | 1 + .github/workflows/kit.yml | 4 ++-- .github/workflows/testsuite.yml | 1 + coverage/ctracer/util.h | 8 +++++++- setup.py | 1 + tests/test_arcs.py | 2 ++ tests/test_process.py | 2 ++ tox.ini | 5 ++++- 8 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cbfd44ec8..3e12f01be 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -38,6 +38,7 @@ jobs: - "3.8" - "3.9" - "3.10" + - "3.11.0-alpha.2" - "pypy3" exclude: # Windows PyPy doesn't seem to work? diff --git a/.github/workflows/kit.yml b/.github/workflows/kit.yml index fc4548586..ec7685c75 100644 --- a/.github/workflows/kit.yml +++ b/.github/workflows/kit.yml @@ -197,7 +197,7 @@ jobs: prerel: name: "Build pre-rel ${{ matrix.os }} ${{ matrix.py }} wheels" - if: ${{ false }} # disable for now, since there are no pre-rel Python versions. + if: ${{ true }} # true when there are pre-rel, false when not. runs-on: "${{ matrix.os }}-latest" strategy: matrix: @@ -206,7 +206,7 @@ jobs: - windows - macos py: - - "3.10.0-rc.2" + - "3.11.0-alpha.2" fail-fast: false steps: diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index d42990740..6f31f48f7 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -37,6 +37,7 @@ jobs: - "3.8" - "3.9" - "3.10" + - "3.11.0-alpha.2" - "pypy3" exclude: # Windows PyPy doesn't seem to work? diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h index ff139329a..58fa1d490 100644 --- a/coverage/ctracer/util.h +++ b/coverage/ctracer/util.h @@ -12,9 +12,15 @@ #undef COLLECT_STATS /* Collect counters: stats are printed when tracer is stopped. */ #undef DO_NOTHING /* Define this to make the tracer do nothing. */ +#if PY_VERSION_HEX >= 0x030B00A0 +// 3.11 moved f_lasti into an internal structure. This is totally the wrong way +// to make this work, but it's all I've got until https://bugs.python.org/issue40421 +// is resolved. +#include +#define MyFrame_lasti(f) ((f)->f_frame->f_lasti * 2) +#elif PY_VERSION_HEX >= 0x030A00A7 // The f_lasti field changed meaning in 3.10.0a7. It had been bytes, but // now is instructions, so we need to adjust it to use it as a byte index. -#if PY_VERSION_HEX >= 0x030A00A7 #define MyFrame_lasti(f) ((f)->f_lasti * 2) #else #define MyFrame_lasti(f) ((f)->f_lasti) diff --git a/setup.py b/setup.py index 83553c922..b396a6dd6 100644 --- a/setup.py +++ b/setup.py @@ -44,6 +44,7 @@ def better_set_verbosity(v): Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 +Programming Language :: Python :: 3.11 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy Topic :: Software Development :: Quality Assurance diff --git a/tests/test_arcs.py b/tests/test_arcs.py index 6a65d4feb..349a560fc 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -279,6 +279,8 @@ def test_continue_through_with(self): arcz=arcz, ) + @pytest.mark.skipif(env.PYVERSION[:2] >= (3, 11), reason="avoid a 3.11 bug: 45709") + # https://github.com/nedbat/coveragepy/issues/1270 def test_raise_through_with(self): if env.PYBEHAVIOR.exit_through_with: arcz = ".1 12 27 78 8. 9A A. -23 34 45 53 6-2" diff --git a/tests/test_process.py b/tests/test_process.py index 1e6448648..83ca1febe 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -748,6 +748,8 @@ def f(): @pytest.mark.expensive @pytest.mark.skipif(env.METACOV, reason="Can't test fullcoverage when measuring ourselves") @pytest.mark.skipif(not env.C_TRACER, reason="fullcoverage only works with the C tracer.") + @pytest.mark.skipif(env.PYVERSION[:2] >= (3, 11), reason="this test needs work on 3.11") + # https://github.com/nedbat/coveragepy/issues/1278 def test_fullcoverage(self): # fullcoverage is a trick to get stdlib modules measured from # the very beginning of the process. Here we import os and diff --git a/tox.ini b/tox.ini index 3f39965d2..31162ac73 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ [tox] # When changing this list, be sure to check the [gh-actions] list below. -envlist = py{36,37,38,39,310}, pypy3, doc, lint +envlist = py{36,37,38,39,310,311}, pypy3, doc, lint skip_missing_interpreters = {env:COVERAGE_SKIP_MISSING_INTERPRETERS:True} toxworkdir = {env:TOXWORKDIR:.tox} @@ -32,6 +32,8 @@ setenv = # For some tests, we need .pyc files written in the current directory, # so override any local setting. PYTHONPYCACHEPREFIX= + # PyContracts can't do 3.11. + py311: COVERAGE_NO_CONTRACTS=1 commands = # Create tests/zipmods.zip @@ -95,4 +97,5 @@ python = 3.8: py38 3.9: py39 3.10: py310 + 3.11: py311 pypy3: pypy3