mirror of
https://github.com/python/cpython.git
synced 2025-12-05 00:52:25 +00:00
bpo-36635: Add _testinternalcapi module (GH-12841)
Add a new _testinternalcapi module to test the internal C API. Move _Py_GetConfigsAsDict() function to the internal C API: _testembed now uses _testinternalcapi to access the function.
This commit is contained in:
parent
11efd79076
commit
23bace26ec
13 changed files with 172 additions and 49 deletions
|
|
@ -408,11 +408,6 @@ typedef struct {
|
||||||
._init_main = 1}
|
._init_main = 1}
|
||||||
/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
|
/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
|
||||||
|
|
||||||
|
|
||||||
/* --- Function used for testing ---------------------------------- */
|
|
||||||
|
|
||||||
PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,11 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config,
|
||||||
const _PyArgv *args);
|
const _PyArgv *args);
|
||||||
PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config);
|
PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config);
|
||||||
|
|
||||||
|
|
||||||
|
/* --- Function used for testing ---------------------------------- */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -598,7 +598,7 @@ def collect_get_config(info_add):
|
||||||
# Dump global configuration variables, _PyCoreConfig
|
# Dump global configuration variables, _PyCoreConfig
|
||||||
# and _PyMainInterpreterConfig
|
# and _PyMainInterpreterConfig
|
||||||
try:
|
try:
|
||||||
from _testcapi import get_configs
|
from _testinternalcapi import get_configs
|
||||||
except ImportError:
|
except ImportError:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Add a new :mod:`_testinternalcapi` module to test the internal C API.
|
||||||
|
|
@ -173,6 +173,7 @@ _symtable symtablemodule.c
|
||||||
#_struct _struct.c # binary structure packing/unpacking
|
#_struct _struct.c # binary structure packing/unpacking
|
||||||
#_weakref _weakref.c # basic weak reference support
|
#_weakref _weakref.c # basic weak reference support
|
||||||
#_testcapi _testcapimodule.c # Python C API test module
|
#_testcapi _testcapimodule.c # Python C API test module
|
||||||
|
#_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module
|
||||||
#_random _randommodule.c # Random number generator
|
#_random _randommodule.c # Random number generator
|
||||||
#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
|
#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
|
||||||
#_pickle _pickle.c # pickle accelerator
|
#_pickle _pickle.c # pickle accelerator
|
||||||
|
|
|
||||||
|
|
@ -4736,13 +4736,6 @@ decode_locale_ex(PyObject *self, PyObject *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
get_configs(PyObject *self, PyObject *Py_UNUSED(args))
|
|
||||||
{
|
|
||||||
return _Py_GetConfigsAsDict();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef Py_REF_DEBUG
|
#ifdef Py_REF_DEBUG
|
||||||
static PyObject *
|
static PyObject *
|
||||||
negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
|
negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
|
||||||
|
|
@ -4990,7 +4983,6 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
|
{"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
|
||||||
{"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
|
{"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
|
||||||
{"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
|
{"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
|
||||||
{"get_configs", get_configs, METH_NOARGS},
|
|
||||||
#ifdef Py_REF_DEBUG
|
#ifdef Py_REF_DEBUG
|
||||||
{"negative_refcount", negative_refcount, METH_NOARGS},
|
{"negative_refcount", negative_refcount, METH_NOARGS},
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
45
Modules/_testinternalcapi.c
Normal file
45
Modules/_testinternalcapi.c
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* C Extension module to test Python internal C APIs (Include/internal).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE)
|
||||||
|
# error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PY_SSIZE_T_CLEAN
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
#include "pycore_coreconfig.h"
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
get_configs(PyObject *self, PyObject *Py_UNUSED(args))
|
||||||
|
{
|
||||||
|
return _Py_GetConfigsAsDict();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyMethodDef TestMethods[] = {
|
||||||
|
{"get_configs", get_configs, METH_NOARGS},
|
||||||
|
{NULL, NULL} /* sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct PyModuleDef _testcapimodule = {
|
||||||
|
PyModuleDef_HEAD_INIT,
|
||||||
|
"_testinternalcapi",
|
||||||
|
NULL,
|
||||||
|
-1,
|
||||||
|
TestMethods,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
PyInit__testinternalcapi(void)
|
||||||
|
{
|
||||||
|
return PyModule_Create(&_testcapimodule);
|
||||||
|
}
|
||||||
94
PCbuild/_testinternalcapi.vcxproj
Normal file
94
PCbuild/_testinternalcapi.vcxproj
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGInstrument|ARM">
|
||||||
|
<Configuration>PGInstrument</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGInstrument|Win32">
|
||||||
|
<Configuration>PGInstrument</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGInstrument|x64">
|
||||||
|
<Configuration>PGInstrument</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGUpdate|ARM">
|
||||||
|
<Configuration>PGUpdate</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGUpdate|Win32">
|
||||||
|
<Configuration>PGUpdate</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="PGUpdate|x64">
|
||||||
|
<Configuration>PGUpdate</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{900342D7-516A-4469-B1AD-59A66E49A25F}</ProjectGuid>
|
||||||
|
<RootNamespace>_testinternalcapi</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<SupportPGO>false</SupportPGO>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="python.props" />
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<CharacterSet>NotSet</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetExt>.pyd</TargetExt>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="pyproject.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\Modules\_testinternalcapi.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\PC\python_nt.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="pythoncore.vcxproj">
|
||||||
|
<Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
|
||||||
|
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
13
PCbuild/_testinternalcapi.vcxproj.filters
Normal file
13
PCbuild/_testinternalcapi.vcxproj.filters
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{136fc5eb-7fe4-4486-8c6d-b49f37a00199}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\Modules\_testinternalcapi.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
<ExtensionModules Include="@(ExternalModules->'%(Identity)')" Condition="$(IncludeExternals)" />
|
<ExtensionModules Include="@(ExternalModules->'%(Identity)')" Condition="$(IncludeExternals)" />
|
||||||
<Projects Include="@(ExtensionModules->'%(Identity).vcxproj')" Condition="$(IncludeExtensions)" />
|
<Projects Include="@(ExtensionModules->'%(Identity).vcxproj')" Condition="$(IncludeExtensions)" />
|
||||||
<!-- Test modules -->
|
<!-- Test modules -->
|
||||||
<TestModules Include="_ctypes_test;_testbuffer;_testcapi;_testembed;_testimportmultiple;_testmultiphase;_testconsole" />
|
<TestModules Include="_ctypes_test;_testbuffer;_testcapi;_testinternalcapi;_testembed;_testimportmultiple;_testmultiphase;_testconsole" />
|
||||||
<TestModules Include="xxlimited" Condition="'$(Configuration)' == 'Release'" />
|
<TestModules Include="xxlimited" Condition="'$(Configuration)' == 'Release'" />
|
||||||
<Projects Include="@(TestModules->'%(Identity).vcxproj')" Condition="$(IncludeTests)">
|
<Projects Include="@(TestModules->'%(Identity).vcxproj')" Condition="$(IncludeTests)">
|
||||||
<!-- Disable parallel build for test modules -->
|
<!-- Disable parallel build for test modules -->
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcxproj", "{C6
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testinternalcapi", "_testinternalcapi.vcxproj", "{900342D7-516A-4469-B1AD-59A66E49A25F}"
|
||||||
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testimportmultiple", "_testimportmultiple.vcxproj", "{36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testimportmultiple", "_testimportmultiple.vcxproj", "{36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcxproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcxproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
|
||||||
|
|
|
||||||
|
|
@ -298,42 +298,13 @@ static int test_initialize_pymain(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
dump_config_impl(void)
|
|
||||||
{
|
|
||||||
PyObject *config = _Py_GetConfigsAsDict();
|
|
||||||
if (config == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyObject *res;
|
|
||||||
PyObject *json = PyImport_ImportModule("json");
|
|
||||||
if (json) {
|
|
||||||
res = PyObject_CallMethod(json, "dumps", "O", config);
|
|
||||||
Py_DECREF(json);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
res = NULL;
|
|
||||||
}
|
|
||||||
Py_CLEAR(config);
|
|
||||||
if (res == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PySys_FormatStdout("%S\n", res);
|
|
||||||
Py_DECREF(res);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_config(void)
|
dump_config(void)
|
||||||
{
|
{
|
||||||
if (dump_config_impl() < 0) {
|
(void) PyRun_SimpleStringFlags(
|
||||||
fprintf(stderr, "failed to dump the configuration:\n");
|
"import _testinternalcapi, json; "
|
||||||
PyErr_Print();
|
"print(json.dumps(_testinternalcapi.get_configs()))",
|
||||||
}
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
4
setup.py
4
setup.py
|
|
@ -814,6 +814,10 @@ class PyBuildExt(build_ext):
|
||||||
self.add(Extension('_testcapi', ['_testcapimodule.c'],
|
self.add(Extension('_testcapi', ['_testcapimodule.c'],
|
||||||
depends=['testcapi_long.h']))
|
depends=['testcapi_long.h']))
|
||||||
|
|
||||||
|
# Python Internal C API test module
|
||||||
|
self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'],
|
||||||
|
extra_compile_args=['-D Py_BUILD_CORE_MODULE']))
|
||||||
|
|
||||||
# Python PEP-3118 (buffer protocol) test module
|
# Python PEP-3118 (buffer protocol) test module
|
||||||
self.add(Extension('_testbuffer', ['_testbuffer.c']))
|
self.add(Extension('_testbuffer', ['_testbuffer.c']))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue