From 3f2f4fefca388bc62fc2a7d07cb6ef24197c84bd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 13 Mar 2020 13:07:31 +0100 Subject: [PATCH] bpo-39947: Move get_recursion_depth() to _testinternalcapi (GH-18974) Move get_recursion_depth() function from _testcapi to _testinternalcapi to avoid accessing PyThreadState attributes directly in _testcapi. --- Lib/test/test_exceptions.py | 2 +- Lib/test/test_sys.py | 2 +- Modules/_testcapimodule.c | 18 +++++------------- Modules/_testinternalcapi.c | 13 ++++++++++++- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 2d3a13a8f91..d6739f18660 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -994,7 +994,7 @@ class ExceptionTests(unittest.TestCase): # finalization of these locals. code = """if 1: import sys - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth class MyException(Exception): pass diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 027f87e0d4c..395725857b7 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -241,7 +241,7 @@ class SysModuleTest(unittest.TestCase): # mark". Otherwise, it may not be possible anymore to # reset the overflowed flag to 0. - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth def set_recursion_limit_at_depth(depth, limit): recursion_depth = get_recursion_depth() diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 3132f52158c..3cc558689b6 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5,9 +5,11 @@ * standard Python regression test, via Lib/test/test_capi.py. */ -/* The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE - define, but we only want to test the public C API, not the internal - C API. */ +/* This module tests the public (Include/ and Include/cpython/) C API. + The internal C API must not be used here: use _testinternalcapi for that. + + The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE + macro defined, but only the public C API must be tested here. */ #undef Py_BUILD_CORE_MODULE #define PY_SSIZE_T_CLEAN @@ -4523,15 +4525,6 @@ test_PyTime_AsMicroseconds(PyObject *self, PyObject *args) return _PyTime_AsNanosecondsObject(ms); } -static PyObject* -get_recursion_depth(PyObject *self, PyObject *args) -{ - PyThreadState *tstate = PyThreadState_Get(); - - /* subtract one to ignore the frame of the get_recursion_depth() call */ - return PyLong_FromLong(tstate->recursion_depth - 1); -} - static PyObject* pymem_buffer_overflow(PyObject *self, PyObject *args) { @@ -5486,7 +5479,6 @@ static PyMethodDef TestMethods[] = { #endif {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS}, {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS}, - {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS}, {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 3ea77e6934d..394b870e907 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -9,7 +9,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_initconfig.h" +#include "pycore_initconfig.h" // _Py_GetConfigsAsDict() static PyObject * @@ -19,8 +19,19 @@ get_configs(PyObject *self, PyObject *Py_UNUSED(args)) } +static PyObject* +get_recursion_depth(PyObject *self, PyObject *args) +{ + PyThreadState *tstate = PyThreadState_Get(); + + /* subtract one to ignore the frame of the get_recursion_depth() call */ + return PyLong_FromLong(tstate->recursion_depth - 1); +} + + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, + {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, {NULL, NULL} /* sentinel */ };