summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2022-04-29 14:18:08 (GMT)
committerGitHub <noreply@github.com>2022-04-29 14:18:08 (GMT)
commit83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df (patch)
treeaf3c0eaba50e7a3bb15824ee7b1d08178e186247
parent89c6b2b8f615a1c1827a92c4582c213b1a5027fb (diff)
downloadcpython-83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df.zip
cpython-83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df.tar.gz
cpython-83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df.tar.bz2
gh-91324: Convert the stable ABI manifest to TOML (GH-92026)
-rw-r--r--Lib/test/test_stable_abi_ctypes.py17
-rw-r--r--Makefile.pre.in4
-rw-r--r--Misc/stable_abi.toml2275
-rw-r--r--Misc/stable_abi.txt2284
-rwxr-xr-xTools/scripts/stable_abi.py249
5 files changed, 2413 insertions, 2416 deletions
diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py
index 311e216..18c8506 100644
--- a/Lib/test/test_stable_abi_ctypes.py
+++ b/Lib/test/test_stable_abi_ctypes.py
@@ -20,7 +20,8 @@ class TestStableABIAvailability(unittest.TestCase):
ctypes_test.pythonapi[symbol_name]
def test_feature_macros(self):
- self.assertEqual(set(get_feature_macros()), EXPECTED_IFDEFS)
+ self.assertEqual(
+ set(get_feature_macros()), EXPECTED_FEATURE_MACROS)
# The feature macros for Windows are used in creating the DLL
# definition, so they must be known on all platforms.
@@ -28,7 +29,7 @@ class TestStableABIAvailability(unittest.TestCase):
# the reality.
@unittest.skipIf(sys.platform != "win32", "Windows specific test")
def test_windows_feature_macros(self):
- for name, value in WINDOWS_IFDEFS.items():
+ for name, value in WINDOWS_FEATURE_MACROS.items():
if value != 'maybe':
with self.subTest(name):
self.assertEqual(feature_macros[name], value)
@@ -909,5 +910,13 @@ if feature_macros['Py_REF_DEBUG']:
'_Py_RefTotal',
)
-EXPECTED_IFDEFS = set(['HAVE_FORK', 'MS_WINDOWS', 'PY_HAVE_THREAD_NATIVE_ID', 'Py_REF_DEBUG', 'USE_STACKCHECK'])
-WINDOWS_IFDEFS = {'MS_WINDOWS': True, 'HAVE_FORK': False, 'USE_STACKCHECK': 'maybe', 'PY_HAVE_THREAD_NATIVE_ID': True, 'Py_REF_DEBUG': 'maybe'}
+EXPECTED_FEATURE_MACROS = set(['HAVE_FORK',
+ 'MS_WINDOWS',
+ 'PY_HAVE_THREAD_NATIVE_ID',
+ 'Py_REF_DEBUG',
+ 'USE_STACKCHECK'])
+WINDOWS_FEATURE_MACROS = {'HAVE_FORK': False,
+ 'MS_WINDOWS': True,
+ 'PY_HAVE_THREAD_NATIVE_ID': True,
+ 'Py_REF_DEBUG': 'maybe',
+ 'USE_STACKCHECK': 'maybe'}
diff --git a/Makefile.pre.in b/Makefile.pre.in
index c12305a..e45d4fe 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -1199,7 +1199,7 @@ regen-global-objects: $(srcdir)/Tools/scripts/generate_global_objects.py
# ABI
regen-limited-abi: all
- $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --generate-all $(srcdir)/Misc/stable_abi.txt
+ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --generate-all $(srcdir)/Misc/stable_abi.toml
############################################################################
# Regenerate all generated files
@@ -2476,7 +2476,7 @@ patchcheck: @DEF_MAKE_RULE@
$(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
check-limited-abi: all
- $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --all $(srcdir)/Misc/stable_abi.txt
+ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --all $(srcdir)/Misc/stable_abi.toml
.PHONY: update-config
update-config:
diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml
new file mode 100644
index 0000000..e34bfcd
--- /dev/null
+++ b/Misc/stable_abi.toml
@@ -0,0 +1,2275 @@
+# This file lists the contents of the Limited API and Stable ABI.
+# Please append new items at the end.
+
+# The syntax of this file is not fixed.
+# It is designed to be read only by Tools/stable_abi.py, which can change
+# without notice.
+
+# For the history of the stable ABI prior to this file,
+# see the history of PC/python3dll.c and before that, PC/python3.def,
+# and PC/pythonXYstub.def
+
+
+# The current format is TOML.
+
+# There are these kinds of top-level "items":
+# - struct: A C struct. Currently this file does not distinguish between:
+# - opaque structs, which the Limited API only handles via pointers
+# (so these can change at any time)
+# - structs where only certain members are part of the stable ABI (e.g.
+# PyObject)
+# - structs which must not be changed at all (e.g. PyType_Slot, which is
+# fully defined and used in arrays)
+# - function: A function that must be kept available (and exported, i.e. not
+# converted to a macro).
+# - const: A simple value, defined with `#define`.
+# - macro: A preprocessor macro more complex than a simple `const` value.
+# - data: An exported object, which must continue to be available but its exact
+# value may change.
+# - typedef: A C typedef which is used in other definitions in the limited API.
+# Its size/layout/signature must not change.
+# - feature_macro: Other items may be conditional on whether this macro
+# is defined or not.
+
+# Each top-level item can have details defined for it:
+# - added: The version in which the item was added to the stable ABI.
+# - ifdef: The item is only available if the given feature_macro is defined.
+# - abi_only: If present, the item is not part of the Limited API, but it *is*
+# part of the stable ABI. The item will not show up in user-facing docs.
+# Typically used for:
+# - private functions called by public macros, e.g. _Py_BuildValue_SizeT
+# - items that were part of the limited API in the past, and must remain part
+# of the stable ABI.
+# - a combination of the above (functions that were called by macros that
+# were public in the past)
+# - doc: for `feature_macro`, the blurb added in documentation
+# - windows: for `feature_macro`, this macro is defined on Windows.
+# (This info is used to generate the DLL manifest and needs to be available
+# on all platforms.)
+
+# Removing items from this file is generally not allowed, and additions should
+# be considered with that in mind. See the devguide for exact rules:
+# https://devguide.python.org/c-api/#limited-api
+
+# User-facing docs are at:
+# https://docs.python.org/3/c-api/stable.html#stable
+
+
+# Feature macros for optional functionality:
+
+[feature_macro.MS_WINDOWS]
+ doc = 'on Windows'
+ windows = true
+[feature_macro.HAVE_FORK]
+ doc = 'on platforms with fork()'
+[feature_macro.USE_STACKCHECK]
+ doc = 'on platforms with USE_STACKCHECK'
+ windows = 'maybe'
+[feature_macro.PY_HAVE_THREAD_NATIVE_ID]
+ doc = 'on platforms with native thread IDs'
+ windows = true
+[feature_macro.Py_REF_DEBUG]
+ doc = 'when Python is compiled in debug mode (with Py_REF_DEBUG)'
+ windows = 'maybe'
+
+
+# Mentioned in PEP 384:
+
+[struct.PyObject]
+ added = '3.2'
+ members = ['ob_refcnt', 'ob_type']
+ struct_abi_kind = 'members'
+[struct.PyVarObject]
+ added = '3.2'
+ members = ['ob_base', 'ob_size']
+ struct_abi_kind = 'members'
+[struct.PyMethodDef]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyMemberDef]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyGetSetDef]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyModuleDef_Base]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyModuleDef]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyStructSequence_Field]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyStructSequence_Desc]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyType_Slot]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyType_Spec]
+ added = '3.2'
+ struct_abi_kind = 'full-abi'
+[struct.PyThreadState]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.PyInterpreterState]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.PyFrameObject]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.symtable]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.PyWeakReference]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.PyLongObject]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+[struct.PyTypeObject]
+ added = '3.2'
+ struct_abi_kind = 'opaque'
+
+[function.PyType_FromSpec]
+ added = '3.2'
+
+[const.Py_tp_dealloc]
+ added = '3.2'
+[const.Py_tp_getattr]
+ added = '3.2'
+[const.Py_tp_setattr]
+ added = '3.2'
+[const.Py_tp_repr]
+ added = '3.2'
+[const.Py_tp_hash]
+ added = '3.2'
+[const.Py_tp_call]
+ added = '3.2'
+[const.Py_tp_str]
+ added = '3.2'
+[const.Py_tp_getattro]
+ added = '3.2'
+[const.Py_tp_setattro]
+ added = '3.2'
+[const.Py_tp_doc]
+ added = '3.2'
+[const.Py_tp_traverse]
+ added = '3.2'
+[const.Py_tp_clear]
+ added = '3.2'
+[const.Py_tp_richcompare]
+ added = '3.2'
+[const.Py_tp_iter]
+ added = '3.2'
+[const.Py_tp_iternext]
+ added = '3.2'
+[const.Py_tp_methods]
+ added = '3.2'
+[const.Py_tp_base]
+ added = '3.2'
+[const.Py_tp_descr_get]
+ added = '3.2'
+[const.Py_tp_descr_set]
+ added = '3.2'
+[const.Py_tp_init]
+ added = '3.2'
+[const.Py_tp_alloc]
+ added = '3.2'
+[const.Py_tp_new]
+ added = '3.2'
+[const.Py_tp_members]
+ added = '3.2'
+[const.Py_tp_getset]
+ added = '3.2'
+[const.Py_tp_free]
+ added = '3.2'
+[const.Py_tp_is_gc]
+ added = '3.2'
+[const.Py_tp_bases]
+ added = '3.2'
+[const.Py_tp_del]
+ added = '3.2'
+[const.Py_nb_add]
+ added = '3.2'
+[const.Py_nb_subtract]
+ added = '3.2'
+[const.Py_nb_multiply]
+ added = '3.2'
+[const.Py_nb_remainder]
+ added = '3.2'
+[const.Py_nb_divmod]
+ added = '3.2'
+[const.Py_nb_power]
+ added = '3.2'
+[const.Py_nb_negative]
+ added = '3.2'
+[const.Py_nb_positive]
+ added = '3.2'
+[const.Py_nb_absolute]
+ added = '3.2'
+[const.Py_nb_bool]
+ added = '3.2'
+[const.Py_nb_invert]
+ added = '3.2'
+[const.Py_nb_lshift]
+ added = '3.2'
+[const.Py_nb_rshift]
+ added = '3.2'
+[const.Py_nb_and]
+ added = '3.2'
+[const.Py_nb_xor]
+ added = '3.2'
+[const.Py_nb_or]
+ added = '3.2'
+[const.Py_nb_int]
+ added = '3.2'
+[const.Py_nb_float]
+ added = '3.2'
+[const.Py_nb_inplace_add]
+ added = '3.2'
+[const.Py_nb_inplace_subtract]
+ added = '3.2'
+[const.Py_nb_inplace_multiply]
+ added = '3.2'
+[const.Py_nb_inplace_remainder]
+ added = '3.2'
+[const.Py_nb_inplace_power]
+ added = '3.2'
+[const.Py_nb_inplace_lshift]
+ added = '3.2'
+[const.Py_nb_inplace_rshift]
+ added = '3.2'
+[const.Py_nb_inplace_and]
+ added = '3.2'
+[const.Py_nb_inplace_xor]
+ added = '3.2'
+[const.Py_nb_inplace_or]
+ added = '3.2'
+[const.Py_nb_floor_divide]
+ added = '3.2'
+[const.Py_nb_true_divide]
+ added = '3.2'
+[const.Py_nb_inplace_floor_divide]
+ added = '3.2'
+[const.Py_nb_inplace_true_divide]
+ added = '3.2'
+[const.Py_nb_index]
+ added = '3.2'
+[const.Py_sq_length]
+ added = '3.2'
+[const.Py_sq_concat]
+ added = '3.2'
+[const.Py_sq_repeat]
+ added = '3.2'
+[const.Py_sq_item]
+ added = '3.2'
+[const.Py_sq_ass_item]
+ added = '3.2'
+[const.Py_sq_contains]
+ added = '3.2'
+[const.Py_sq_inplace_concat]
+ added = '3.2'
+[const.Py_sq_inplace_repeat]
+ added = '3.2'
+[const.Py_mp_length]
+ added = '3.2'
+[const.Py_mp_subscript]
+ added = '3.2'
+[const.Py_mp_ass_subscript]
+ added = '3.2'
+
+[typedef.Py_uintptr_t]
+ added = '3.2'
+[typedef.Py_intptr_t]
+ added = '3.2'
+[typedef.Py_ssize_t]
+ added = '3.2'
+[typedef.unaryfunc]
+ added = '3.2'
+[typedef.binaryfunc]
+ added = '3.2'
+[typedef.ternaryfunc]
+ added = '3.2'
+[typedef.inquiry]
+ added = '3.2'
+[typedef.lenfunc]
+ added = '3.2'
+[typedef.ssizeargfunc]
+ added = '3.2'
+[typedef.ssizessizeargfunc]
+ added = '3.2'
+[typedef.ssizeobjargproc]
+ added = '3.2'
+[typedef.ssizessizeobjargproc]
+ added = '3.2'
+[typedef.objobjargproc]
+ added = '3.2'
+[typedef.objobjproc]
+ added = '3.2'
+[typedef.visitproc]
+ added = '3.2'
+[typedef.traverseproc]
+ added = '3.2'
+[typedef.destructor]
+ added = '3.2'
+[typedef.getattrfunc]
+ added = '3.2'
+[typedef.getattrofunc]
+ added = '3.2'
+[typedef.setattrfunc]
+ added = '3.2'
+[typedef.setattrofunc]
+ added = '3.2'
+[typedef.reprfunc]
+ added = '3.2'
+[typedef.hashfunc]
+ added = '3.2'
+[typedef.richcmpfunc]
+ added = '3.2'
+[typedef.getiterfunc]
+ added = '3.2'
+[typedef.iternextfunc]
+ added = '3.2'
+[typedef.descrgetfunc]
+ added = '3.2'
+[typedef.descrsetfunc]
+ added = '3.2'
+[typedef.initproc]
+ added = '3.2'
+[typedef.newfunc]
+ added = '3.2'
+[typedef.allocfunc]
+ added = '3.2'
+[typedef.PyCFunction]
+ added = '3.2'
+[typedef.PyCFunctionWithKeywords]
+ added = '3.2'
+[typedef.PyCapsule_Destructor]
+ added = '3.2'
+[typedef.getter]
+ added = '3.2'
+[typedef.setter]
+ added = '3.2'
+[typedef.PyOS_sighandler_t]
+ added = '3.2'
+[typedef.PyGILState_STATE]
+ added = '3.2'
+[typedef.Py_UCS4]
+ added = '3.2'
+
+[macro.Py_BEGIN_ALLOW_THREADS]
+ added = '3.2'
+[macro.Py_BLOCK_THREADS]
+ added = '3.2'
+[macro.Py_UNBLOCK_THREADS]
+ added = '3.2'
+[macro.Py_END_ALLOW_THREADS]
+ added = '3.2'
+
+# The following were added in PC/python3.def in the initial stable ABI commit,
+# 4d0d471a8031de90a2b1ce99c4ac4780e60b3bc9,
+# and later amendments in 3.2:
+# 0d012f284be829c6217f60523db0e1671b7db9d9
+# c83bc3c1fbed14d27a5de3032e24d2cf006a7c4b
+
+[function.PyArg_Parse]
+ added = '3.2'
+[function.PyArg_ParseTuple]
+ added = '3.2'
+[function.PyArg_ParseTupleAndKeywords]
+ added = '3.2'
+[function.PyArg_UnpackTuple]
+ added = '3.2'
+[function.PyArg_VaParse]
+ added = '3.2'
+[function.PyArg_VaParseTupleAndKeywords]
+ added = '3.2'
+[function.PyArg_ValidateKeywordArguments]
+ added = '3.2'
+[data.PyBaseObject_Type]
+ added = '3.2'
+[function.PyBool_FromLong]
+ added = '3.2'
+[data.PyBool_Type]
+ added = '3.2'
+[data.PyByteArrayIter_Type]
+ added = '3.2'
+[function.PyByteArray_AsString]
+ added = '3.2'
+[function.PyByteArray_Concat]
+ added = '3.2'
+[function.PyByteArray_FromObject]
+ added = '3.2'
+[function.PyByteArray_FromStringAndSize]
+ added = '3.2'
+[function.PyByteArray_Resize]
+ added = '3.2'
+[function.PyByteArray_Size]
+ added = '3.2'
+[data.PyByteArray_Type]
+ added = '3.2'
+[data.PyBytesIter_Type]
+ added = '3.2'
+[function.PyBytes_AsString]
+ added = '3.2'
+[function.PyBytes_AsStringAndSize]
+ added = '3.2'
+[function.PyBytes_Concat]
+ added = '3.2'
+[function.PyBytes_ConcatAndDel]
+ added = '3.2'
+[function.PyBytes_DecodeEscape]
+ added = '3.2'
+[function.PyBytes_FromFormat]
+ added = '3.2'
+[function.PyBytes_FromFormatV]
+ added = '3.2'
+[function.PyBytes_FromObject]
+ added = '3.2'
+[function.PyBytes_FromString]
+ added = '3.2'
+[function.PyBytes_FromStringAndSize]
+ added = '3.2'
+[function.PyBytes_Repr]
+ added = '3.2'
+[function.PyBytes_Size]
+ added = '3.2'
+[data.PyBytes_Type]
+ added = '3.2'
+[function.PyCFunction_Call]
+ added = '3.2'
+[function.PyCFunction_GetFlags]
+ added = '3.2'
+[function.PyCFunction_GetFunction]
+ added = '3.2'
+[function.PyCFunction_GetSelf]
+ added = '3.2'
+[function.PyCFunction_NewEx]
+ added = '3.2'
+[data.PyCFunction_Type]
+ added = '3.2'
+[function.PyCallIter_New]
+ added = '3.2'
+[data.PyCallIter_Type]
+ added = '3.2'
+[function.PyCallable_Check]
+ added = '3.2'
+[function.PyCapsule_GetContext]
+ added = '3.2'
+[function.PyCapsule_GetDestructor]
+ added = '3.2'
+[function.PyCapsule_GetName]
+ added = '3.2'
+[function.PyCapsule_GetPointer]
+ added = '3.2'
+[function.PyCapsule_Import]
+ added = '3.2'
+[function.PyCapsule_IsValid]
+ added = '3.2'
+[function.PyCapsule_New]
+ added = '3.2'
+[function.PyCapsule_SetContext]
+ added = '3.2'
+[function.PyCapsule_SetDestructor]
+ added = '3.2'
+[function.PyCapsule_SetName]
+ added = '3.2'
+[function.PyCapsule_SetPointer]
+ added = '3.2'
+[data.PyCapsule_Type]
+ added = '3.2'
+[data.PyClassMethodDescr_Type]
+ added = '3.2'
+[function.PyCodec_BackslashReplaceErrors]
+ added = '3.2'
+[function.PyCodec_Decode]
+ added = '3.2'
+[function.PyCodec_Decoder]
+ added = '3.2'
+[function.PyCodec_Encode]
+ added = '3.2'
+[function.PyCodec_Encoder]
+ added = '3.2'
+[function.PyCodec_IgnoreErrors]
+ added = '3.2'
+[function.PyCodec_IncrementalDecoder]
+ added = '3.2'
+[function.PyCodec_IncrementalEncoder]
+ added = '3.2'
+[function.PyCodec_KnownEncoding]
+ added = '3.2'
+[function.PyCodec_LookupError]
+ added = '3.2'
+[function.PyCodec_Register]
+ added = '3.2'
+[function.PyCodec_RegisterError]
+ added = '3.2'
+[function.PyCodec_ReplaceErrors]
+ added = '3.2'
+[function.PyCodec_StreamReader]
+ added = '3.2'
+[function.PyCodec_StreamWriter]
+ added = '3.2'
+[function.PyCodec_StrictErrors]
+ added = '3.2'
+[function.PyCodec_XMLCharRefReplaceErrors]
+ added = '3.2'
+[function.PyComplex_FromDoubles]
+ added = '3.2'
+[function.PyComplex_ImagAsDouble]
+ added = '3.2'
+[function.PyComplex_RealAsDouble]
+ added = '3.2'
+[data.PyComplex_Type]
+ added = '3.2'
+[function.PyDescr_NewClassMethod]
+ added = '3.2'
+[function.PyDescr_NewGetSet]
+ added = '3.2'
+[function.PyDescr_NewMember]
+ added = '3.2'
+[function.PyDescr_NewMethod]
+ added = '3.2'
+[data.PyDictItems_Type]
+ added = '3.2'
+[data.PyDictIterItem_Type]
+ added = '3.2'
+[data.PyDictIterKey_Type]
+ added = '3.2'
+[data.PyDictIterValue_Type]
+ added = '3.2'
+[data.PyDictKeys_Type]
+ added = '3.2'
+[function.PyDictProxy_New]
+ added = '3.2'
+[data.PyDictProxy_Type]
+ added = '3.2'
+[data.PyDictValues_Type]
+ added = '3.2'
+[function.PyDict_Clear]
+ added = '3.2'
+[function.PyDict_Contains]
+ added = '3.2'
+[function.PyDict_Copy]
+ added = '3.2'
+[function.PyDict_DelItem]
+ added = '3.2'
+[function.PyDict_DelItemString]
+ added = '3.2'
+[function.PyDict_GetItem]
+ added = '3.2'
+[function.PyDict_GetItemString]
+ added = '3.2'
+[function.PyDict_GetItemWithError]
+ added = '3.2'
+[function.PyDict_Items]
+ added = '3.2'
+[function.PyDict_Keys]
+ added = '3.2'
+[function.PyDict_Merge]
+ added = '3.2'
+[function.PyDict_MergeFromSeq2]
+ added = '3.2'
+[function.PyDict_New]
+ added = '3.2'
+[function.PyDict_Next]
+ added = '3.2'
+[function.PyDict_SetItem]
+ added = '3.2'
+[function.PyDict_SetItemString]
+ added = '3.2'
+[function.PyDict_Size]
+ added = '3.2'
+[data.PyDict_Type]
+ added = '3.2'
+[function.PyDict_Update]
+ added = '3.2'
+[function.PyDict_Values]
+ added = '3.2'
+[data.PyEllipsis_Type]
+ added = '3.2'
+[data.PyEnum_Type]
+ added = '3.2'
+[function.PyErr_BadArgument]
+ added = '3.2'
+[function.PyErr_BadInternalCall]
+ added = '3.2'
+[function.PyErr_CheckSignals]
+ added = '3.2'
+[function.PyErr_Clear]
+ added = '3.2'
+[function.PyErr_Display]
+ added = '3.2'
+[function.PyErr_ExceptionMatches]
+ added = '3.2'
+[function.PyErr_Fetch]
+ added = '3.2'
+[function.PyErr_Format]
+ added = '3.2'
+[function.PyErr_GivenExceptionMatches]
+ added = '3.2'
+[function.PyErr_NewException]
+ added = '3.2'
+[function.PyErr_NewExceptionWithDoc]
+ added = '3.2'
+[function.PyErr_NoMemory]
+ added = '3.2'
+[function.PyErr_NormalizeException]
+ added = '3.2'
+[function.PyErr_Occurred]
+ added = '3.2'
+[function.PyErr_Print]
+ added = '3.2'
+[function.PyErr_PrintEx]
+ added = '3.2'
+[function.PyErr_ProgramText]
+ added = '3.2'
+[function.PyErr_Restore]
+ added = '3.2'
+[function.PyErr_SetFromErrno]
+ added = '3.2'
+[function.PyErr_SetFromErrnoWithFilename]
+ added = '3.2'
+[function.PyErr_SetFromErrnoWithFilenameObject]
+ added = '3.2'
+[function.PyErr_SetInterrupt]
+ added = '3.2'
+[function.PyErr_SetNone]
+ added = '3.2'
+[function.PyErr_SetObject]
+ added = '3.2'
+[function.PyErr_SetString]
+ added = '3.2'
+[function.PyErr_SyntaxLocation]
+ added = '3.2'
+[function.PyErr_WarnEx]
+ added = '3.2'
+[function.PyErr_WarnExplicit]
+ added = '3.2'
+[function.PyErr_WarnFormat]
+ added = '3.2'
+[function.PyErr_WriteUnraisable]
+ added = '3.2'
+[function.PyEval_AcquireLock]
+ added = '3.2'
+[function.PyEval_AcquireThread]
+ added = '3.2'
+[function.PyEval_CallFunction]
+ added = '3.2'
+[function.PyEval_CallMethod]
+ added = '3.2'
+[function.PyEval_CallObjectWithKeywords]
+ added = '3.2'
+[function.PyEval_EvalCode]
+ added = '3.2'
+[function.PyEval_EvalCodeEx]
+ added = '3.2'
+[function.PyEval_EvalFrame]
+ added = '3.2'
+[function.PyEval_EvalFrameEx]
+ added = '3.2'
+[function.PyEval_GetBuiltins]
+ added = '3.2'
+[function.PyEval_GetFrame]
+ added = '3.2'
+[function.PyEval_GetFuncDesc]
+ added = '3.2'
+[function.PyEval_GetFuncName]
+ added = '3.2'
+[function.PyEval_GetGlobals]
+ added = '3.2'
+[function.PyEval_GetLocals]
+ added = '3.2'
+[function.PyEval_InitThreads]
+ added = '3.2'
+[function.PyEval_ReleaseLock]
+ added = '3.2'
+[function.PyEval_ReleaseThread]
+ added = '3.2'
+[function.PyEval_RestoreThread]
+ added = '3.2'
+[function.PyEval_SaveThread]
+ added = '3.2'
+[function.PyEval_ThreadsInitialized]
+ added = '3.2'
+[data.PyExc_ArithmeticError]
+ added = '3.2'
+[data.PyExc_AssertionError]
+ added = '3.2'
+[data.PyExc_AttributeError]
+ added = '3.2'
+[data.PyExc_BaseException]
+ added = '3.2'
+[data.PyExc_BaseExceptionGroup]
+ added = '3.11'
+[data.PyExc_BufferError]
+ added = '3.2'
+[data.PyExc_BytesWarning]
+ added = '3.2'
+[data.PyExc_DeprecationWarning]
+ added = '3.2'
+[data.PyExc_EOFError]
+ added = '3.2'
+[data.PyExc_EnvironmentError]
+ added = '3.2'
+[data.PyExc_Exception]
+ added = '3.2'
+[data.PyExc_FloatingPointError]
+ added = '3.2'
+[data.PyExc_FutureWarning]
+ added = '3.2'
+[data.PyExc_GeneratorExit]
+ added = '3.2'
+[data.PyExc_IOError]
+ added = '3.2'
+[data.PyExc_ImportError]
+ added = '3.2'
+[data.PyExc_ImportWarning]
+ added = '3.2'
+[data.PyExc_IndentationError]
+ added = '3.2'
+[data.PyExc_IndexError]
+ added = '3.2'
+[data.PyExc_KeyError]
+ added = '3.2'
+[data.PyExc_KeyboardInterrupt]
+ added = '3.2'
+[data.PyExc_LookupError]
+ added = '3.2'
+[data.PyExc_MemoryError]
+ added = '3.2'
+[data.PyExc_NameError]
+ added = '3.2'
+[data.PyExc_NotImplementedError]
+ added = '3.2'
+[data.PyExc_OSError]
+ added = '3.2'
+[data.PyExc_OverflowError]
+ added = '3.2'
+[data.PyExc_PendingDeprecationWarning]
+ added = '3.2'
+[data.PyExc_ReferenceError]
+ added = '3.2'
+[data.PyExc_RuntimeError]
+ added = '3.2'
+[data.PyExc_RuntimeWarning]
+ added = '3.2'
+[data.PyExc_StopIteration]
+ added = '3.2'
+[data.PyExc_SyntaxError]
+ added = '3.2'
+[data.PyExc_SyntaxWarning]
+ added = '3.2'
+[data.PyExc_SystemError]
+ added = '3.2'
+[data.PyExc_SystemExit]
+ added = '3.2'
+[data.PyExc_TabError]
+ added = '3.2'
+[data.PyExc_TypeError]
+ added = '3.2'
+[data.PyExc_UnboundLocalError]
+ added = '3.2'
+[data.PyExc_UnicodeDecodeError]
+ added = '3.2'
+[data.PyExc_UnicodeEncodeError]
+ added = '3.2'
+[data.PyExc_UnicodeError]
+ added = '3.2'
+[data.PyExc_UnicodeTranslateError]
+ added = '3.2'
+[data.PyExc_UnicodeWarning]
+ added = '3.2'
+[data.PyExc_UserWarning]
+ added = '3.2'
+[data.PyExc_ValueError]
+ added = '3.2'
+[data.PyExc_Warning]
+ added = '3.2'
+[data.PyExc_ZeroDivisionError]
+ added = '3.2'
+[function.PyException_GetCause]
+ added = '3.2'
+[function.PyException_GetContext]
+ added = '3.2'
+[function.PyException_GetTraceback]
+ added = '3.2'
+[function.PyException_SetCause]
+ added = '3.2'
+[function.PyException_SetContext]
+ added = '3.2'
+[function.PyException_SetTraceback]
+ added = '3.2'
+[function.PyFile_FromFd]
+ added = '3.2'
+[function.PyFile_GetLine]
+ added = '3.2'
+[function.PyFile_WriteObject]
+ added = '3.2'
+[function.PyFile_WriteString]
+ added = '3.2'
+[data.PyFilter_Type]
+ added = '3.2'
+[function.PyFloat_AsDouble]
+ added = '3.2'
+[function.PyFloat_FromDouble]
+ added = '3.2'
+[function.PyFloat_FromString]
+ added = '3.2'
+[function.PyFloat_GetInfo]
+ added = '3.2'
+[function.PyFloat_GetMax]
+ added = '3.2'
+[function.PyFloat_GetMin]
+ added = '3.2'
+[data.PyFloat_Type]
+ added = '3.2'
+[function.PyFrozenSet_New]
+ added = '3.2'
+[data.PyFrozenSet_Type]
+ added = '3.2'
+[function.PyGC_Collect]
+ added = '3.2'
+[function.PyGILState_Ensure]
+ added = '3.2'
+[function.PyGILState_GetThisThreadState]
+ added = '3.2'
+[function.PyGILState_Release]
+ added = '3.2'
+[data.PyGetSetDescr_Type]
+ added = '3.2'
+[function.PyImport_AddModule]
+ added = '3.2'
+[function.PyImport_AppendInittab]
+ added = '3.2'
+[function.PyImport_ExecCodeModule]
+ added = '3.2'
+[function.PyImport_ExecCodeModuleEx]
+ added = '3.2'
+[function.PyImport_ExecCodeModuleWithPathnames]
+ added = '3.2'
+[function.PyImport_GetImporter]
+ added = '3.2'
+[function.PyImport_GetMagicNumber]
+ added = '3.2'
+[function.PyImport_GetMagicTag]
+ added = '3.2'
+[function.PyImport_GetModuleDict]
+ added = '3.2'
+[function.PyImport_Import]
+ added = '3.2'
+[function.PyImport_ImportFrozenModule]
+ added = '3.2'
+[function.PyImport_ImportModule]
+ added = '3.2'
+[function.PyImport_ImportModuleLevel]
+ added = '3.2'
+[function.PyImport_ImportModuleNoBlock]
+ added = '3.2'
+[function.PyImport_ReloadModule]
+ added = '3.2'
+[function.PyInterpreterState_Clear]
+ added = '3.2'
+[function.PyInterpreterState_Delete]
+ added = '3.2'
+[function.PyInterpreterState_New]
+ added = '3.2'
+[function.PyIter_Next]
+ added = '3.2'
+[data.PyListIter_Type]
+ added = '3.2'
+[data.PyListRevIter_Type]
+ added = '3.2'
+[function.PyList_Append]
+ added = '3.2'
+[function.PyList_AsTuple]
+ added = '3.2'
+[function.PyList_GetItem]
+ added = '3.2'
+[function.PyList_GetSlice]
+ added = '3.2'
+[function.PyList_Insert]
+ added = '3.2'
+[function.PyList_New]
+ added = '3.2'
+[function.PyList_Reverse]
+ added = '3.2'
+[function.PyList_SetItem]
+ added = '3.2'
+[function.PyList_SetSlice]
+ added = '3.2'
+[function.PyList_Size]
+ added = '3.2'
+[function.PyList_Sort]
+ added = '3.2'
+[data.PyList_Type]
+ added = '3.2'
+[data.PyLongRangeIter_Type]
+ added = '3.2'
+[function.PyLong_AsDouble]
+ added = '3.2'
+[function.PyLong_AsLong]
+ added = '3.2'
+[function.PyLong_AsLongAndOverflow]
+ added = '3.2'
+[function.PyLong_AsLongLong]
+ added = '3.2'
+[function.PyLong_AsLongLongAndOverflow]
+ added = '3.2'
+[function.PyLong_AsSize_t]
+ added = '3.2'
+[function.PyLong_AsSsize_t]
+ added = '3.2'
+[function.PyLong_AsUnsignedLong]
+ added = '3.2'
+[function.PyLong_AsUnsignedLongLong]
+ added = '3.2'
+[function.PyLong_AsUnsignedLongLongMask]
+ added = '3.2'
+[function.PyLong_AsUnsignedLongMask]
+ added = '3.2'
+[function.PyLong_AsVoidPtr]
+ added = '3.2'
+[function.PyLong_FromDouble]
+ added = '3.2'
+[function.PyLong_FromLong]
+ added = '3.2'
+[function.PyLong_FromLongLong]
+ added = '3.2'
+[function.PyLong_FromSize_t]
+ added = '3.2'
+[function.PyLong_FromSsize_t]
+ added = '3.2'
+[function.PyLong_FromString]
+ added = '3.2'
+[function.PyLong_FromUnsignedLong]
+ added = '3.2'
+[function.PyLong_FromUnsignedLongLong]
+ added = '3.2'
+[function.PyLong_FromVoidPtr]
+ added = '3.2'
+[function.PyLong_GetInfo]
+ added = '3.2'
+[data.PyLong_Type]
+ added = '3.2'
+[data.PyMap_Type]
+ added = '3.2'
+[function.PyMapping_Check]
+ added = '3.2'
+[function.PyMapping_GetItemString]
+ added = '3.2'
+[function.PyMapping_HasKey]
+ added = '3.2'
+[function.PyMapping_HasKeyString]
+ added = '3.2'
+[function.PyMapping_Items]
+ added = '3.2'
+[function.PyMapping_Keys]
+ added = '3.2'
+[function.PyMapping_Length]
+ added = '3.2'
+[function.PyMapping_SetItemString]
+ added = '3.2'
+[function.PyMapping_Size]
+ added = '3.2'
+[function.PyMapping_Values]
+ added = '3.2'
+[function.PyMem_Free]
+ added = '3.2'
+[function.PyMem_Malloc]
+ added = '3.2'
+[function.PyMem_Realloc]
+ added = '3.2'
+[data.PyMemberDescr_Type]
+ added = '3.2'
+[function.PyMemoryView_FromObject]
+ added = '3.2'
+[function.PyMemoryView_GetContiguous]
+ added = '3.2'
+[data.PyMemoryView_Type]
+ added = '3.2'
+[data.PyMethodDescr_Type]
+ added = '3.2'
+[function.PyModule_AddIntConstant]
+ added = '3.2'
+[function.PyModule_AddObject]
+ added = '3.2'
+[function.PyModule_AddStringConstant]
+ added = '3.2'
+[function.PyModule_Create2]
+ added = '3.2'
+[function.PyModule_GetDef]
+ added = '3.2'
+[function.PyModule_GetDict]
+ added = '3.2'
+[function.PyModule_GetFilename]
+ added = '3.2'
+[function.PyModule_GetFilenameObject]
+ added = '3.2'
+[function.PyModule_GetName]
+ added = '3.2'
+[function.PyModule_GetState]
+ added = '3.2'
+[function.PyModule_New]
+ added = '3.2'
+[data.PyModule_Type]
+ added = '3.2'
+[function.PyNumber_Absolute]
+ added = '3.2'
+[function.PyNumber_Add]
+ added = '3.2'
+[function.PyNumber_And]
+ added = '3.2'
+[function.PyNumber_AsSsize_t]
+ added = '3.2'
+[function.PyNumber_Check]
+ added = '3.2'
+[function.PyNumber_Divmod]
+ added = '3.2'
+[function.PyNumber_Float]
+ added = '3.2'
+[function.PyNumber_FloorDivide]
+ added = '3.2'
+[function.PyNumber_InPlaceAdd]
+ added = '3.2'
+[function.PyNumber_InPlaceAnd]
+ added = '3.2'
+[function.PyNumber_InPlaceFloorDivide]
+ added = '3.2'
+[function.PyNumber_InPlaceLshift]
+ added = '3.2'
+[function.PyNumber_InPlaceMultiply]
+ added = '3.2'
+[function.PyNumber_InPlaceOr]
+ added = '3.2'
+[function.PyNumber_InPlacePower]
+ added = '3.2'
+[function.PyNumber_InPlaceRemainder]
+ added = '3.2'
+[function.PyNumber_InPlaceRshift]
+ added = '3.2'
+[function.PyNumber_InPlaceSubtract]
+ added = '3.2'
+[function.PyNumber_InPlaceTrueDivide]
+ added = '3.2'
+[function.PyNumber_InPlaceXor]
+ added = '3.2'
+[function.PyNumber_Index]
+ added = '3.2'
+[function.PyNumber_Invert]
+ added = '3.2'
+[function.PyNumber_Long]
+ added = '3.2'
+[function.PyNumber_Lshift]
+ added = '3.2'
+[function.PyNumber_Multiply]
+ added = '3.2'
+[function.PyNumber_Negative]
+ added = '3.2'
+[function.PyNumber_Or]
+ added = '3.2'
+[function.PyNumber_Positive]
+ added = '3.2'
+[function.PyNumber_Power]
+ added = '3.2'
+[function.PyNumber_Remainder]
+ added = '3.2'
+[function.PyNumber_Rshift]
+ added = '3.2'
+[function.PyNumber_Subtract]
+ added = '3.2'
+[function.PyNumber_ToBase]
+ added = '3.2'
+[function.PyNumber_TrueDivide]
+ added = '3.2'
+[function.PyNumber_Xor]
+ added = '3.2'
+[function.PyOS_AfterFork]
+ added = '3.2'
+ ifdef = 'HAVE_FORK'
+[data.PyOS_InputHook]
+ added = '3.2'
+[function.PyOS_InterruptOccurred]
+ added = '3.2'
+[function.PyOS_double_to_string]
+ added = '3.2'
+[function.PyOS_getsig]
+ added = '3.2'
+[function.PyOS_mystricmp]
+ added = '3.2'
+[function.PyOS_mystrnicmp]
+ added = '3.2'
+[function.PyOS_setsig]
+ added = '3.2'
+[function.PyOS_snprintf]
+ added = '3.2'
+[function.PyOS_string_to_double]
+ added = '3.2'
+[function.PyOS_strtol]
+ added = '3.2'
+[function.PyOS_strtoul]
+ added = '3.2'
+[function.PyOS_vsnprintf]
+ added = '3.2'
+[function.PyObject_ASCII]
+ added = '3.2'
+[function.PyObject_AsFileDescriptor]
+ added = '3.2'
+[function.PyObject_Bytes]
+ added = '3.2'
+[function.PyObject_Call]
+ added = '3.2'
+[function.PyObject_CallFunction]
+ added = '3.2'
+[function.PyObject_CallFunctionObjArgs]
+ added = '3.2'
+[function.PyObject_CallMethod]
+ added = '3.2'
+[function.PyObject_CallMethodObjArgs]
+ added = '3.2'
+[function.PyObject_CallObject]
+ added = '3.2'
+[function.PyObject_ClearWeakRefs]
+ added = '3.2'
+[function.PyObject_DelItem]
+ added = '3.2'
+[function.PyObject_DelItemString]
+ added = '3.2'
+[function.PyObject_Dir]
+ added = '3.2'
+[function.PyObject_Format]
+ added = '3.2'
+[function.PyObject_Free]
+ added = '3.2'
+[function.PyObject_GC_Del]
+ added = '3.2'
+[function.PyObject_GC_Track]
+ added = '3.2'
+[function.PyObject_GC_UnTrack]
+ added = '3.2'
+[function.PyObject_GenericGetAttr]
+ added = '3.2'
+[function.PyObject_GenericSetAttr]
+ added = '3.2'
+[function.PyObject_GetAttr]
+ added = '3.2'
+[function.PyObject_GetAttrString]
+ added = '3.2'
+[function.PyObject_GetItem]
+ added = '3.2'
+[function.PyObject_GetIter]
+ added = '3.2'
+[function.PyObject_HasAttr]
+ added = '3.2'
+[function.PyObject_HasAttrString]
+ added = '3.2'
+[function.PyObject_Hash]
+ added = '3.2'
+[function.PyObject_HashNotImplemented]
+ added = '3.2'
+[function.PyObject_Init]
+ added = '3.2'
+[function.PyObject_InitVar]
+ added = '3.2'
+[function.PyObject_IsInstance]
+ added = '3.2'
+[function.PyObject_IsSubclass]
+ added = '3.2'
+[function.PyObject_IsTrue]
+ added = '3.2'
+[function.PyObject_Length]
+ added = '3.2'
+[function.PyObject_Malloc]
+ added = '3.2'
+[function.PyObject_Not]
+ added = '3.2'
+[function.PyObject_Realloc]
+ added = '3.2'
+[function.PyObject_Repr]
+ added = '3.2'
+[function.PyObject_RichCompare]
+ added = '3.2'
+[function.PyObject_RichCompareBool]
+ added = '3.2'
+[function.PyObject_SelfIter]
+ added = '3.2'
+[function.PyObject_SetAttr]
+ added = '3.2'
+[function.PyObject_SetAttrString]
+ added = '3.2'
+[function.PyObject_SetItem]
+ added = '3.2'
+[function.PyObject_Size]
+ added = '3.2'
+[function.PyObject_Str]
+ added = '3.2'
+[function.PyObject_Type]
+ added = '3.2'
+[data.PyProperty_Type]
+ added = '3.2'
+[data.PyRangeIter_Type]
+ added = '3.2'
+[data.PyRange_Type]
+ added = '3.2'
+[data.PyReversed_Type]
+ added = '3.2'
+[function.PySeqIter_New]
+ added = '3.2'
+[data.PySeqIter_Type]
+ added = '3.2'
+[function.PySequence_Check]
+ added = '3.2'
+[function.PySequence_Concat]
+ added = '3.2'
+[function.PySequence_Contains]
+ added = '3.2'
+[function.PySequence_Count]
+ added = '3.2'
+[function.PySequence_DelItem]
+ added = '3.2'
+[function.PySequence_DelSlice]
+ added = '3.2'
+[function.PySequence_Fast]
+ added = '3.2'
+[function.PySequence_GetItem]
+ added = '3.2'
+[function.PySequence_GetSlice]
+ added = '3.2'
+[function.PySequence_In]
+ added = '3.2'
+[function.PySequence_InPlaceConcat]
+ added = '3.2'
+[function.PySequence_InPlaceRepeat]
+ added = '3.2'
+[function.PySequence_Index]
+ added = '3.2'
+[function.PySequence_Length]
+ added = '3.2'
+[function.PySequence_List]
+ added = '3.2'
+[function.PySequence_Repeat]
+ added = '3.2'
+[function.PySequence_SetItem]
+ added = '3.2'
+[function.PySequence_SetSlice]
+ added = '3.2'
+[function.PySequence_Size]
+ added = '3.2'
+[function.PySequence_Tuple]
+ added = '3.2'
+[data.PySetIter_Type]
+ added = '3.2'
+[function.PySet_Add]
+ added = '3.2'
+[function.PySet_Clear]
+ added = '3.2'
+[function.PySet_Contains]
+ added = '3.2'
+[function.PySet_Discard]
+ added = '3.2'
+[function.PySet_New]
+ added = '3.2'
+[function.PySet_Pop]
+ added = '3.2'
+[function.PySet_Size]
+ added = '3.2'
+[data.PySet_Type]
+ added = '3.2'
+[function.PySlice_GetIndices]
+ added = '3.2'
+[function.PySlice_GetIndicesEx]
+ added = '3.2'
+[function.PySlice_New]
+ added = '3.2'
+[data.PySlice_Type]
+ added = '3.2'
+[function.PyState_FindModule]
+ added = '3.2'
+[function.PyStructSequence_GetItem]
+ added = '3.2'
+[function.PyStructSequence_New]
+ added = '3.2'
+[function.PyStructSequence_NewType]
+ added = '3.2'
+[function.PyStructSequence_SetItem]
+ added = '3.2'
+[data.PySuper_Type]
+ added = '3.2'
+[function.PySys_AddWarnOption]
+ added = '3.2'
+[function.PySys_AddWarnOptionUnicode]
+ added = '3.2'
+[function.PySys_FormatStderr]
+ added = '3.2'
+[function.PySys_FormatStdout]
+ added = '3.2'
+[function.PySys_GetObject]
+ added = '3.2'
+[function.PySys_HasWarnOptions]
+ added = '3.2'
+[function.PySys_ResetWarnOptions]
+ added = '3.2'
+[function.PySys_SetArgv]
+ added = '3.2'
+[function.PySys_SetArgvEx]
+ added = '3.2'
+[function.PySys_SetObject]
+ added = '3.2'
+[function.PySys_SetPath]
+ added = '3.2'
+[function.PySys_WriteStderr]
+ added = '3.2'
+[function.PySys_WriteStdout]
+ added = '3.2'
+[function.PyThreadState_Clear]
+ added = '3.2'
+[function.PyThreadState_Delete]
+ added = '3.2'
+[function.PyThreadState_DeleteCurrent]
+ added = '3.2'
+ abi_only = true
+[function.PyThreadState_Get]
+ added = '3.2'
+[function.PyThreadState_GetDict]
+ added = '3.2'
+[function.PyThreadState_New]
+ added = '3.2'
+[function.PyThreadState_SetAsyncExc]
+ added = '3.2'
+[function.PyThreadState_Swap]
+ added = '3.2'
+[function.PyTraceBack_Here]
+ added = '3.2'
+[function.PyTraceBack_Print]
+ added = '3.2'
+[data.PyTraceBack_Type]
+ added = '3.2'
+[data.PyTupleIter_Type]
+ added = '3.2'
+[function.PyTuple_GetItem]
+ added = '3.2'
+[function.PyTuple_GetSlice]
+ added = '3.2'
+[function.PyTuple_New]
+ added = '3.2'
+[function.PyTuple_Pack]
+ added = '3.2'
+[function.PyTuple_SetItem]
+ added = '3.2'
+[function.PyTuple_Size]
+ added = '3.2'
+[data.PyTuple_Type]
+ added = '3.2'
+[function.PyType_ClearCache]
+ added = '3.2'
+[function.PyType_GenericAlloc]
+ added = '3.2'
+[function.PyType_GenericNew]
+ added = '3.2'
+[function.PyType_GetFlags]
+ added = '3.2'
+[function.PyType_IsSubtype]
+ added = '3.2'
+[function.PyType_Modified]
+ added = '3.2'
+[function.PyType_Ready]
+ added = '3.2'
+[data.PyType_Type]
+ added = '3.2'
+[function.PyUnicodeDecodeError_Create]
+ added = '3.2'
+[function.PyUnicodeDecodeError_GetEncoding]
+ added = '3.2'
+[function.PyUnicodeDecodeError_GetEnd]
+ added = '3.2'
+[function.PyUnicodeDecodeError_GetObject]
+ added = '3.2'
+[function.PyUnicodeDecodeError_GetReason]
+ added = '3.2'
+[function.PyUnicodeDecodeError_GetStart]
+ added = '3.2'
+[function.PyUnicodeDecodeError_SetEnd]
+ added = '3.2'
+[function.PyUnicodeDecodeError_SetReason]
+ added = '3.2'
+[function.PyUnicodeDecodeError_SetStart]
+ added = '3.2'
+[function.PyUnicodeEncodeError_GetEncoding]
+ added = '3.2'
+[function.PyUnicodeEncodeError_GetEnd]
+ added = '3.2'
+[function.PyUnicodeEncodeError_GetObject]
+ added = '3.2'
+[function.PyUnicodeEncodeError_GetReason]
+ added = '3.2'
+[function.PyUnicodeEncodeError_GetStart]
+ added = '3.2'
+[function.PyUnicodeEncodeError_SetEnd]
+ added = '3.2'
+[function.PyUnicodeEncodeError_SetReason]
+ added = '3.2'
+[function.PyUnicodeEncodeError_SetStart]
+ added = '3.2'
+[data.PyUnicodeIter_Type]
+ added = '3.2'
+[function.PyUnicodeTranslateError_GetEnd]
+ added = '3.2'
+[function.PyUnicodeTranslateError_GetObject]
+ added = '3.2'
+[function.PyUnicodeTranslateError_GetReason]
+ added = '3.2'
+[function.PyUnicodeTranslateError_GetStart]
+ added = '3.2'
+[function.PyUnicodeTranslateError_SetEnd]
+ added = '3.2'
+[function.PyUnicodeTranslateError_SetReason]
+ added = '3.2'
+[function.PyUnicodeTranslateError_SetStart]
+ added = '3.2'
+[function.PyUnicode_Append]
+ added = '3.2'
+[function.PyUnicode_AppendAndDel]
+ added = '3.2'
+[function.PyUnicode_AsASCIIString]
+ added = '3.2'
+[function.PyUnicode_AsCharmapString]
+ added = '3.2'
+[function.PyUnicode_AsDecodedObject]
+ added = '3.2'
+[function.PyUnicode_AsDecodedUnicode]
+ added = '3.2'
+[function.PyUnicode_AsEncodedObject]
+ added = '3.2'
+[function.PyUnicode_AsEncodedString]
+ added = '3.2'
+[function.PyUnicode_AsEncodedUnicode]
+ added = '3.2'
+[function.PyUnicode_AsLatin1String]
+ added = '3.2'
+[function.PyUnicode_AsRawUnicodeEscapeString]
+ added = '3.2'
+[function.PyUnicode_AsUTF16String]
+ added = '3.2'
+[function.PyUnicode_AsUTF32String]
+ added = '3.2'
+[function.PyUnicode_AsUTF8String]
+ added = '3.2'
+[function.PyUnicode_AsUnicodeEscapeString]
+ added = '3.2'
+[function.PyUnicode_AsWideChar]
+ added = '3.2'
+[function.PyUnicode_Compare]
+ added = '3.2'
+[function.PyUnicode_Concat]
+ added = '3.2'
+[function.PyUnicode_Contains]
+ added = '3.2'
+[function.PyUnicode_Count]
+ added = '3.2'
+[function.PyUnicode_Decode]
+ added = '3.2'
+[function.PyUnicode_DecodeASCII]
+ added = '3.2'
+[function.PyUnicode_DecodeCharmap]
+ added = '3.2'
+[function.PyUnicode_DecodeFSDefault]
+ added = '3.2'
+[function.PyUnicode_DecodeFSDefaultAndSize]
+ added = '3.2'
+[function.PyUnicode_DecodeLatin1]
+ added = '3.2'
+[function.PyUnicode_DecodeRawUnicodeEscape]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF16]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF16Stateful]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF32]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF32Stateful]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF8]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF8Stateful]
+ added = '3.2'
+[function.PyUnicode_DecodeUnicodeEscape]
+ added = '3.2'
+[function.PyUnicode_FSConverter]
+ added = '3.2'
+[function.PyUnicode_FSDecoder]
+ added = '3.2'
+[function.PyUnicode_Find]
+ added = '3.2'
+[function.PyUnicode_Format]
+ added = '3.2'
+[function.PyUnicode_FromEncodedObject]
+ added = '3.2'
+[function.PyUnicode_FromFormat]
+ added = '3.2'
+[function.PyUnicode_FromFormatV]
+ added = '3.2'
+[function.PyUnicode_FromObject]
+ added = '3.2'
+[function.PyUnicode_FromOrdinal]
+ added = '3.2'
+[function.PyUnicode_FromString]
+ added = '3.2'
+[function.PyUnicode_FromStringAndSize]
+ added = '3.2'
+[function.PyUnicode_FromWideChar]
+ added = '3.2'
+[function.PyUnicode_GetDefaultEncoding]
+ added = '3.2'
+[function.PyUnicode_GetSize]
+ added = '3.2'
+[function.PyUnicode_IsIdentifier]
+ added = '3.2'
+[function.PyUnicode_Join]
+ added = '3.2'
+[function.PyUnicode_Partition]
+ added = '3.2'
+[function.PyUnicode_RPartition]
+ added = '3.2'
+[function.PyUnicode_RSplit]
+ added = '3.2'
+[function.PyUnicode_Replace]
+ added = '3.2'
+[function.PyUnicode_Resize]
+ added = '3.2'
+[function.PyUnicode_RichCompare]
+ added = '3.2'
+[function.PyUnicode_Split]
+ added = '3.2'
+[function.PyUnicode_Splitlines]
+ added = '3.2'
+[function.PyUnicode_Tailmatch]
+ added = '3.2'
+[function.PyUnicode_Translate]
+ added = '3.2'
+[function.PyUnicode_BuildEncodingMap]
+ added = '3.2'
+[function.PyUnicode_CompareWithASCIIString]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF7]
+ added = '3.2'
+[function.PyUnicode_DecodeUTF7Stateful]
+ added = '3.2'
+[function.PyUnicode_EncodeFSDefault]
+ added = '3.2'
+[function.PyUnicode_InternFromString]
+ added = '3.2'
+[function.PyUnicode_InternImmortal]
+ added = '3.2'
+[function.PyUnicode_InternInPlace]
+ added = '3.2'
+[data.PyUnicode_Type]
+ added = '3.2'
+[function.PyWeakref_GetObject]
+ added = '3.2'
+[function.PyWeakref_NewProxy]
+ added = '3.2'
+[function.PyWeakref_NewRef]
+ added = '3.2'
+[data.PyWrapperDescr_Type]
+ added = '3.2'
+[function.PyWrapper_New]
+ added = '3.2'
+[data.PyZip_Type]
+ added = '3.2'
+[function.Py_AddPendingCall]
+ added = '3.2'
+[function.Py_AtExit]
+ added = '3.2'
+[function.Py_BuildValue]
+ added = '3.2'
+[function.Py_CompileString]
+ added = '3.2'
+[function.Py_DecRef]
+ added = '3.2'
+[function.Py_EndInterpreter]
+ added = '3.2'
+[function.Py_Exit]
+ added = '3.2'
+[function.Py_FatalError]
+ added = '3.2'
+[data.Py_FileSystemDefaultEncoding]
+ added = '3.2'
+[function.Py_Finalize]
+ added = '3.2'
+[function.Py_GetBuildInfo]
+ added = '3.2'
+[function.Py_GetCompiler]
+ added = '3.2'
+[function.Py_GetCopyright]
+ added = '3.2'
+[function.Py_GetExecPrefix]
+ added = '3.2'
+[function.Py_GetPath]
+ added = '3.2'
+[function.Py_GetPlatform]
+ added = '3.2'
+[function.Py_GetPrefix]
+ added = '3.2'
+[function.Py_GetProgramFullPath]
+ added = '3.2'
+[function.Py_GetProgramName]
+ added = '3.2'
+[function.Py_GetPythonHome]
+ added = '3.2'
+[function.Py_GetRecursionLimit]
+ added = '3.2'
+[function.Py_GetVersion]
+ added = '3.2'
+[data.Py_HasFileSystemDefaultEncoding]
+ added = '3.2'
+[function.Py_IncRef]
+ added = '3.2'
+[function.Py_Initialize]
+ added = '3.2'
+[function.Py_InitializeEx]
+ added = '3.2'
+[function.Py_IsInitialized]
+ added = '3.2'
+[function.Py_Main]
+ added = '3.2'
+[function.Py_MakePendingCalls]
+ added = '3.2'
+[function.Py_NewInterpreter]
+ added = '3.2'
+[function.Py_ReprEnter]
+ added = '3.2'
+[function.Py_ReprLeave]
+ added = '3.2'
+[function.Py_SetProgramName]
+ added = '3.2'
+[function.Py_SetPythonHome]
+ added = '3.2'
+[function.Py_SetRecursionLimit]
+ added = '3.2'
+[function.Py_VaBuildValue]
+ added = '3.2'
+
+[function._PyErr_BadInternalCall]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_CallFunction_SizeT]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_CallMethod_SizeT]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_GC_New]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_GC_NewVar]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_GC_Resize]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_New]
+ added = '3.2'
+ abi_only = true
+[function._PyObject_NewVar]
+ added = '3.2'
+ abi_only = true
+[function._PyState_AddModule]
+ added = '3.2'
+ abi_only = true
+[function._PyThreadState_Init]
+ added = '3.2'
+ abi_only = true
+[function._PyThreadState_Prealloc]
+ added = '3.2'
+ abi_only = true
+[data._PyWeakref_CallableProxyType]
+ added = '3.2'
+ abi_only = true
+[data._PyWeakref_ProxyType]
+ added = '3.2'
+ abi_only = true
+[data._PyWeakref_RefType]
+ added = '3.2'
+ abi_only = true
+[function._Py_BuildValue_SizeT]
+ added = '3.2'
+ abi_only = true
+[function._Py_CheckRecursiveCall]
+ added = '3.2'
+ abi_only = true
+[function._Py_Dealloc]
+ added = '3.2'
+ abi_only = true
+[data._Py_EllipsisObject]
+ added = '3.2'
+ abi_only = true
+[data._Py_FalseStruct]
+ added = '3.2'
+ abi_only = true
+[data._Py_NoneStruct]
+ added = '3.2'
+ abi_only = true
+[data._Py_NotImplementedStruct]
+ added = '3.2'
+ abi_only = true
+[data._Py_SwappedOp]
+ added = '3.2'
+ abi_only = true
+[data._Py_TrueStruct]
+ added = '3.2'
+ abi_only = true
+[function._Py_VaBuildValue_SizeT]
+ added = '3.2'
+ abi_only = true
+
+# Old buffer protocol support (deprecated)
+
+[function.PyObject_AsCharBuffer]
+ added = '3.2'
+[function.PyObject_AsReadBuffer]
+ added = '3.2'
+[function.PyObject_AsWriteBuffer]
+ added = '3.2'
+[function.PyObject_CheckReadBuffer]
+ added = '3.2'
+
+# Flags are implicitly part of the ABI:
+
+[const.Py_TPFLAGS_DEFAULT]
+ added = '3.2'
+[const.Py_TPFLAGS_BASETYPE]
+ added = '3.2'
+[const.Py_TPFLAGS_HAVE_GC]
+ added = '3.2'
+
+[const.METH_VARARGS]
+ added = '3.2'
+[const.METH_NOARGS]
+ added = '3.2'
+[const.METH_O]
+ added = '3.2'
+[const.METH_CLASS]
+ added = '3.2'
+[const.METH_STATIC]
+ added = '3.2'
+[const.METH_COEXIST]
+ added = '3.2'
+# METH_STACKLESS is undocumented
+# METH_FASTCALL is not part of limited API.
+
+# The following are defined in private headers, but historically
+# they were exported as part of the stable ABI.
+[function.PyMarshal_ReadObjectFromString]
+ added = '3.2'
+ abi_only = true
+[function.PyMarshal_WriteObjectToString]
+ added = '3.2'
+ abi_only = true
+[function.PyMember_GetOne]
+ added = '3.2'
+ abi_only = true
+[function.PyMember_SetOne]
+ added = '3.2'
+ abi_only = true
+
+# TLS api is deprecated; superseded by TSS API
+
+[function.PyThread_ReInitTLS]
+ added = '3.2'
+[function.PyThread_create_key]
+ added = '3.2'
+[function.PyThread_delete_key]
+ added = '3.2'
+[function.PyThread_set_key_value]
+ added = '3.2'
+[function.PyThread_get_key_value]
+ added = '3.2'
+[function.PyThread_delete_key_value]
+ added = '3.2'
+[function.PyThread_acquire_lock]
+ added = '3.2'
+[function.PyThread_acquire_lock_timed]
+ added = '3.2'
+[function.PyThread_allocate_lock]
+ added = '3.2'
+[function.PyThread_exit_thread]
+ added = '3.2'
+[function.PyThread_free_lock]
+ added = '3.2'
+[function.PyThread_get_stacksize]
+ added = '3.2'
+[function.PyThread_get_thread_ident]
+ added = '3.2'
+[function.PyThread_get_thread_native_id]
+ added = '3.2'
+ ifdef = 'PY_HAVE_THREAD_NATIVE_ID'
+[function.PyThread_init_thread]
+ added = '3.2'
+[function.PyThread_release_lock]
+ added = '3.2'
+[function.PyThread_set_stacksize]
+ added = '3.2'
+[function.PyThread_start_new_thread]
+ added = '3.2'
+
+# The following were added in PC/python3.def in Python 3.3:
+# 7800f75827b1be557be16f3b18f5170fbf9fae08
+# 9c56409d3353b8cd4cfc19e0467bbe23fd34fc92
+# 75aeaa9b18667219bbacbc58ba6efecccef9dfbd
+
+[function.PyState_AddModule]
+ added = '3.3'
+[function.PyState_RemoveModule]
+ added = '3.3'
+[function.PyType_FromSpecWithBases]
+ added = '3.3'
+[function._PyArg_Parse_SizeT]
+ added = '3.3'
+ abi_only = true
+[function._PyArg_ParseTuple_SizeT]
+ added = '3.3'
+ abi_only = true
+[function._PyArg_ParseTupleAndKeywords_SizeT]
+ added = '3.3'
+ abi_only = true
+[function._PyArg_VaParse_SizeT]
+ added = '3.3'
+ abi_only = true
+[function._PyArg_VaParseTupleAndKeywords_SizeT]
+ added = '3.3'
+ abi_only = true
+[function.PyThread_GetInfo]
+ added = '3.3'
+
+# The following were added in PC/python3.def in Python 3.4:
+# 3ba3a3ee56c142e93d6bbe20ff6bf939212a30f0
+
+[function.PyCFunction_New]
+ added = '3.4'
+[function.PyType_GetSlot]
+ added = '3.4'
+
+# The following were added in PC/python3.def in Python 3.5:
+# 11d7b1423fc44d764eba7065ea5eba58ed748b21
+# f3b73ad51da3097d7915796fdc62608b1ab90c0a
+
+[function.PyErr_FormatV]
+ added = '3.5'
+[function.PyModuleDef_Init]
+ added = '3.5'
+[data.PyModuleDef_Type]
+ added = '3.5'
+
+# New slots in 3.5:
+# d51374ed78a3e3145911a16cdf3b9b84b3ba7d15 - Matrix multiplication (PEP 465)
+# 7544508f0245173bff5866aa1598c8f6cce1fc5f - Async iterators (PEP 492)
+# 0969a9f8abcf98bb43ea77b1dd050426adcfb4f7 - tp_finalize
+
+[const.Py_nb_matrix_multiply]
+ added = '3.5'
+[const.Py_nb_inplace_matrix_multiply]
+ added = '3.5'
+[const.Py_am_await]
+ added = '3.5'
+[const.Py_am_aiter]
+ added = '3.5'
+[const.Py_am_anext]
+ added = '3.5'
+[const.Py_tp_finalize]
+ added = '3.5'
+
+# The following were added in PC/python3.def in Python 3.6:
+
+[function.Py_FinalizeEx]
+ added = '3.6'
+
+[function.PyOS_FSPath]
+ added = '3.6'
+[function.PyErr_ResourceWarning]
+ added = '3.6'
+[function.PyErr_SetImportErrorSubclass]
+ added = '3.6'
+[data.PyExc_ModuleNotFoundError]
+ added = '3.6'
+
+# The following were added in PC/python3.def in Python 3.6.1 and 3.5.3/3.5.4:
+
+[function.PyCodec_NameReplaceErrors]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_GetExcInfo]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_SetExcInfo]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_SetFromErrnoWithFilenameObjects]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_SetImportError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_SyntaxLocationEx]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_BlockingIOError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_BrokenPipeError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ChildProcessError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ConnectionAbortedError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ConnectionError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ConnectionRefusedError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ConnectionResetError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_FileExistsError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_FileNotFoundError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_InterruptedError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_IsADirectoryError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_NotADirectoryError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_PermissionError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ProcessLookupError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_RecursionError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_ResourceWarning]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_StopAsyncIteration]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[data.PyExc_TimeoutError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyImport_AddModuleObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyImport_ExecCodeModuleObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyImport_ImportFrozenModuleObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyImport_ImportModuleLevelObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyMem_Calloc]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyMemoryView_FromMemory]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_AddFunctions]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_ExecDef]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_FromDefAndSpec2]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_GetNameObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_NewObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyModule_SetDocString]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyNumber_InPlaceMatrixMultiply]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyNumber_MatrixMultiply]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyObject_Calloc]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyObject_GenericSetDict]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PySys_AddXOption]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PySys_GetXOptions]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_AsUCS4]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_AsUCS4Copy]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_AsWideCharString]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_DecodeLocale]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_DecodeLocaleAndSize]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_EncodeLocale]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_FindChar]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_GetLength]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_ReadChar]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_Substring]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyUnicode_WriteChar]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.Py_DecodeLocale]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.Py_EncodeLocale]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.Py_SetPath]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+[function.PyErr_SetExcFromWindowsErr]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyErr_SetExcFromWindowsErrWithFilename]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyErr_SetExcFromWindowsErrWithFilenameObject]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyErr_SetExcFromWindowsErrWithFilenameObjects]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyErr_SetFromWindowsErr]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyErr_SetFromWindowsErrWithFilename]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[data.PyExc_WindowsError]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyOS_CheckStack]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'USE_STACKCHECK'
+[function.PyUnicode_AsMBCSString]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyUnicode_DecodeCodePageStateful]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyUnicode_DecodeMBCS]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyUnicode_DecodeMBCSStateful]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+[function.PyUnicode_EncodeCodePage]
+ added = '3.7' # (and 3.6.1 and 3.5.3)
+ ifdef = 'MS_WINDOWS'
+
+# 3.5.4:
+[function.PySlice_AdjustIndices]
+ added = '3.7' # (and 3.6.1 and 3.5.4)
+[function.PySlice_Unpack]
+ added = '3.7' # (and 3.6.1 and 3.5.4)
+
+# The following were added in PC/python3.def in Python 3.7:
+
+[function.PyInterpreterState_GetID]
+ added = '3.7'
+[function.PyThread_tss_alloc]
+ added = '3.7'
+[function.PyThread_tss_create]
+ added = '3.7'
+[function.PyThread_tss_delete]
+ added = '3.7'
+[function.PyThread_tss_free]
+ added = '3.7'
+[function.PyThread_tss_get]
+ added = '3.7'
+[function.PyThread_tss_is_created]
+ added = '3.7'
+[function.PyThread_tss_set]
+ added = '3.7'
+[function.PyOS_BeforeFork]
+ added = '3.7'
+ ifdef = 'HAVE_FORK'
+[function.PyOS_AfterFork_Parent]
+ added = '3.7'
+ ifdef = 'HAVE_FORK'
+[function.PyOS_AfterFork_Child]
+ added = '3.7'
+ ifdef = 'HAVE_FORK'
+
+# New method flags in 3.7 (PEP 590):
+
+[const.METH_FASTCALL]
+ added = '3.7'
+[const.METH_METHOD]
+ added = '3.7'
+
+# The following were added in PC/python3.def in Python 3.8:
+
+[function.PyImport_GetModule]
+ added = '3.8'
+[data.Py_UTF8Mode]
+ added = '3.8'
+[function.PyExceptionClass_Name]
+ added = '3.8'
+[function.PyIndex_Check]
+ added = '3.8'
+[function.PyIter_Check]
+ added = '3.8'
+[data.PyDictRevIterItem_Type]
+ added = '3.8'
+[data.PyDictRevIterKey_Type]
+ added = '3.8'
+[data.PyDictRevIterValue_Type]
+ added = '3.8'
+[function.PyInterpreterState_GetDict]
+ added = '3.8'
+[function.Py_BytesMain]
+ added = '3.8'
+
+# New type flag (PEP 590):
+
+[const.Py_TPFLAGS_METHOD_DESCRIPTOR]
+ added = '3.8'
+
+# The following were added in PC/python3.def in Python 3.9:
+
+[function.Py_EnterRecursiveCall]
+ added = '3.9'
+[function.Py_LeaveRecursiveCall]
+ added = '3.9'
+[function.Py_GenericAlias]
+ added = '3.9'
+[data.Py_GenericAliasType]
+ added = '3.9'
+[function.PyCMethod_New]
+ added = '3.9'
+[function.PyInterpreterState_Get]
+ added = '3.9'
+[function.PyObject_GC_IsFinalized]
+ added = '3.9'
+[function.PyObject_GC_IsTracked]
+ added = '3.9'
+
+# The following were added in PC/python3.def in Python 3.10:
+
+[function.Py_GetArgcArgv]
+ added = '3.10'
+ abi_only = true
+[function.PyIter_Send]
+ added = '3.10'
+[function.PyUnicode_AsUTF8AndSize]
+ added = '3.10'
+[function.PyObject_GenericGetDict]
+ added = '3.10'
+[function.Py_NewRef]
+ added = '3.10'
+[function.Py_XNewRef]
+ added = '3.10'
+[function.PyModule_AddType]
+ added = '3.10'
+[function.PyType_FromModuleAndSpec]
+ added = '3.10'
+[function.PyType_GetModule]
+ added = '3.10'
+[function.PyType_GetModuleState]
+ added = '3.10'
+[function.PyFrame_GetLineNumber]
+ added = '3.10'
+[function.PyFrame_GetCode]
+ added = '3.10'
+[function.PyObject_CallNoArgs]
+ added = '3.10'
+[function.PyThreadState_GetFrame]
+ added = '3.10'
+[function.PyThreadState_GetID]
+ added = '3.10'
+[function.PyThreadState_GetInterpreter]
+ added = '3.10'
+[function.PyModule_AddObjectRef]
+ added = '3.10'
+[data.Py_FileSystemDefaultEncodeErrors]
+ added = '3.10'
+[function.PyCodec_Unregister]
+ added = '3.10'
+[function.PyErr_SetInterruptEx]
+ added = '3.10'
+[function.Py_Is]
+ added = '3.10'
+[function.Py_IsTrue]
+ added = '3.10'
+[function.Py_IsFalse]
+ added = '3.10'
+[function.Py_IsNone]
+ added = '3.10'
+[function._Py_IncRef]
+ added = '3.10'
+ abi_only = true
+[function._Py_DecRef]
+ added = '3.10'
+ abi_only = true
+[function.PyAIter_Check]
+ added = '3.10'
+[function.PyObject_GetAIter]
+ added = '3.10'
+[data.PyExc_EncodingWarning]
+ added = '3.10'
+
+# Support for Stable ABI in debug builds
+
+[data._Py_RefTotal]
+ added = '3.10'
+ ifdef = 'Py_REF_DEBUG'
+ abi_only = true
+[function._Py_NegativeRefcount]
+ added = '3.10'
+ ifdef = 'Py_REF_DEBUG'
+ abi_only = true
+
+# New slots in 3.10:
+
+[const.Py_am_send]
+ added = '3.10'
+
+
+# New GC control functions in Py3.10 (https://bugs.python.org/issue28254)
+
+[function.PyGC_Disable]
+ added = '3.10'
+[function.PyGC_Enable]
+ added = '3.10'
+[function.PyGC_IsEnabled]
+ added = '3.10'
+
+# Add new C API in Python 3.11
+
+[function.PyType_GetName]
+ added = '3.11'
+[function.PyType_GetQualName]
+ added = '3.11'
+[data.PyStructSequence_UnnamedField]
+ added = '3.11'
+
+# Add stable Py_buffer API in Python 3.11 (https://bugs.python.org/issue45459)
+[struct.Py_buffer]
+ added = '3.11'
+ struct_abi_kind = 'full-abi'
+[function.PyObject_CheckBuffer]
+ added = '3.11'
+[function.PyObject_GetBuffer]
+ added = '3.11'
+[function.PyBuffer_GetPointer]
+ added = '3.11'
+[function.PyBuffer_SizeFromFormat]
+ added = '3.11'
+[function.PyBuffer_ToContiguous]
+ added = '3.11'
+[function.PyBuffer_FromContiguous]
+ added = '3.11'
+[function.PyObject_CopyData]
+ added = '3.11'
+[function.PyBuffer_IsContiguous]
+ added = '3.11'
+[function.PyBuffer_FillContiguousStrides]
+ added = '3.11'
+[function.PyBuffer_FillInfo]
+ added = '3.11'
+[function.PyBuffer_Release]
+ added = '3.11'
+[function.PyMemoryView_FromBuffer]
+ added = '3.11'
+
+# (Detailed comments aren't really needed for further entries: from here on
+# we can use version control logs.)
+
+[data.Py_Version]
+ added = '3.11'
+[function.PyErr_GetHandledException]
+ added = '3.11'
+[function.PyErr_SetHandledException]
+ added = '3.11'
diff --git a/Misc/stable_abi.txt b/Misc/stable_abi.txt
deleted file mode 100644
index 9b1c87e..0000000
--- a/Misc/stable_abi.txt
+++ /dev/null
@@ -1,2284 +0,0 @@
-# This file lists the contents of the Limited API and Stable ABI.
-# Please append new items at the end.
-
-# The syntax of this file is not fixed.
-# It is designed to be read only by Tools/stable_abi.py, which can change
-# without notice.
-
-# For the history of the stable ABI prior to this file,
-# see the history of PC/python3dll.c and before that, PC/python3.def,
-# and PC/pythonXYstub.def
-
-
-# The current format is a simple line-based one with significant indentation.
-# Anything after a hash is a comment.
-
-# There are these kinds of top-level "items":
-# - struct: A C struct. Currently this file does not distinguish between:
-# - opaque structs, which the Limited API only handles via pointers
-# (so these can change at any time)
-# - structs where only certain members are part of the stable ABI (e.g.
-# PyObject)
-# - structs which must not be changed at all (e.g. PyType_Slot, which is
-# fully defined and used in arrays)
-# - function: A function that must be kept available (and exported, i.e. not
-# converted to a macro).
-# - const: A simple value, defined with `#define`.
-# - macro: A preprocessor macro more complex than a simple `const` value.
-# - data: An exported object, which must continue to be available but its exact
-# value may change.
-# - typedef: A C typedef which is used in other definitions in the limited API.
-# Its size/layout/signature must not change.
-# - ifdef: A feature macro: other items may be conditional on whether the macro
-# is defined or not.
-
-# Each top-level item can have details defined below it:
-# - added: The version in which the item was added to the stable ABI.
-# - ifdef: A feature macro: the item is only available if this macro is defined
-# - abi_only: If present, the item is not part of the Limited API, but it *is*
-# part of the stable ABI. The item will not show up in user-facing docs.
-# Typically used for:
-# - private functions called by public macros, e.g. _Py_BuildValue_SizeT
-# - items that were part of the limited API in the past, and must remain part
-# of the stable ABI.
-# - a combination of the above (functions that were called by macros that
-# were public in the past)
-# - doc: for `ifdef`, the blurb added in documentation
-# - windows: for `ifdef`, this macro is defined on Windows. (This info is used
-# to generate the DLL manifest and needs to be available on all platforms.)
-# `maybe` marks macros defined on some but not all Windows builds.
-
-# For structs, one of the following must be set:
-# - opaque: The struct name is available in the Limited API, but its members
-# are not. Users must manipulate it via pointers.
-# - members: Space-separated list of members which are part of the
-# Limited API and Stable ABI.
-# Members that aren't listed are not accessible to applications.
-# - full-abi: The entire struct -- all its members and its size -- is part of
-# the Stable ABI, and must not change.
-
-# Removing items from this file is generally not allowed, and additions should
-# be considered with that in mind. See the devguide for exact rules:
-# https://devguide.python.org/c-api/#limited-api
-
-# User-facing docs are at:
-# https://docs.python.org/3/c-api/stable.html#stable
-
-
-# Feature macros for optional functionality:
-
-ifdef MS_WINDOWS
- doc on Windows
- windows
-ifdef HAVE_FORK
- doc on platforms with fork()
-ifdef USE_STACKCHECK
- doc on platforms with USE_STACKCHECK
- windows maybe
-ifdef PY_HAVE_THREAD_NATIVE_ID
- doc on platforms with native thread IDs
- windows
-ifdef Py_REF_DEBUG
- doc when Python is compiled in debug mode (with Py_REF_DEBUG)
- windows maybe
-
-
-# Mentioned in PEP 384:
-
-struct PyObject
- added 3.2
- members ob_refcnt ob_type
-struct PyVarObject
- added 3.2
- members ob_base ob_size
-struct PyMethodDef
- added 3.2
- full-abi
-struct PyMemberDef
- added 3.2
- full-abi
-struct PyGetSetDef
- added 3.2
- full-abi
-struct PyModuleDef_Base
- added 3.2
- full-abi
-struct PyModuleDef
- added 3.2
- full-abi
-struct PyStructSequence_Field
- added 3.2
- full-abi
-struct PyStructSequence_Desc
- added 3.2
- full-abi
-struct PyType_Slot
- added 3.2
- full-abi
-struct PyType_Spec
- added 3.2
- full-abi
-struct PyThreadState
- added 3.2
- opaque
-struct PyInterpreterState
- added 3.2
- opaque
-struct PyFrameObject
- added 3.2
- opaque
-struct symtable
- added 3.2
- opaque
-struct PyWeakReference
- added 3.2
- opaque
-struct PyLongObject
- added 3.2
- opaque
-struct PyTypeObject
- added 3.2
- opaque
-
-function PyType_FromSpec
- added 3.2
-
-const Py_tp_dealloc
- added 3.2
-const Py_tp_getattr
- added 3.2
-const Py_tp_setattr
- added 3.2
-const Py_tp_repr
- added 3.2
-const Py_tp_hash
- added 3.2
-const Py_tp_call
- added 3.2
-const Py_tp_str
- added 3.2
-const Py_tp_getattro
- added 3.2
-const Py_tp_setattro
- added 3.2
-const Py_tp_doc
- added 3.2
-const Py_tp_traverse
- added 3.2
-const Py_tp_clear
- added 3.2
-const Py_tp_richcompare
- added 3.2
-const Py_tp_iter
- added 3.2
-const Py_tp_iternext
- added 3.2
-const Py_tp_methods
- added 3.2
-const Py_tp_base
- added 3.2
-const Py_tp_descr_get
- added 3.2
-const Py_tp_descr_set
- added 3.2
-const Py_tp_init
- added 3.2
-const Py_tp_alloc
- added 3.2
-const Py_tp_new
- added 3.2
-const Py_tp_members
- added 3.2
-const Py_tp_getset
- added 3.2
-const Py_tp_free
- added 3.2
-const Py_tp_is_gc
- added 3.2
-const Py_tp_bases
- added 3.2
-const Py_tp_del
- added 3.2
-const Py_nb_add
- added 3.2
-const Py_nb_subtract
- added 3.2
-const Py_nb_multiply
- added 3.2
-const Py_nb_remainder
- added 3.2
-const Py_nb_divmod
- added 3.2
-const Py_nb_power
- added 3.2
-const Py_nb_negative
- added 3.2
-const Py_nb_positive
- added 3.2
-const Py_nb_absolute
- added 3.2
-const Py_nb_bool
- added 3.2
-const Py_nb_invert
- added 3.2
-const Py_nb_lshift
- added 3.2
-const Py_nb_rshift
- added 3.2
-const Py_nb_and
- added 3.2
-const Py_nb_xor
- added 3.2
-const Py_nb_or
- added 3.2
-const Py_nb_int
- added 3.2
-const Py_nb_float
- added 3.2
-const Py_nb_inplace_add
- added 3.2
-const Py_nb_inplace_subtract
- added 3.2
-const Py_nb_inplace_multiply
- added 3.2
-const Py_nb_inplace_remainder
- added 3.2
-const Py_nb_inplace_power
- added 3.2
-const Py_nb_inplace_lshift
- added 3.2
-const Py_nb_inplace_rshift
- added 3.2
-const Py_nb_inplace_and
- added 3.2
-const Py_nb_inplace_xor
- added 3.2
-const Py_nb_inplace_or
- added 3.2
-const Py_nb_floor_divide
- added 3.2
-const Py_nb_true_divide
- added 3.2
-const Py_nb_inplace_floor_divide
- added 3.2
-const Py_nb_inplace_true_divide
- added 3.2
-const Py_nb_index
- added 3.2
-const Py_sq_length
- added 3.2
-const Py_sq_concat
- added 3.2
-const Py_sq_repeat
- added 3.2
-const Py_sq_item
- added 3.2
-const Py_sq_ass_item
- added 3.2
-const Py_sq_contains
- added 3.2
-const Py_sq_inplace_concat
- added 3.2
-const Py_sq_inplace_repeat
- added 3.2
-const Py_mp_length
- added 3.2
-const Py_mp_subscript
- added 3.2
-const Py_mp_ass_subscript
- added 3.2
-
-typedef Py_uintptr_t
- added 3.2
-typedef Py_intptr_t
- added 3.2
-typedef Py_ssize_t
- added 3.2
-typedef unaryfunc
- added 3.2
-typedef binaryfunc
- added 3.2
-typedef ternaryfunc
- added 3.2
-typedef inquiry
- added 3.2
-typedef lenfunc
- added 3.2
-typedef ssizeargfunc
- added 3.2
-typedef ssizessizeargfunc
- added 3.2
-typedef ssizeobjargproc
- added 3.2
-typedef ssizessizeobjargproc
- added 3.2
-typedef objobjargproc
- added 3.2
-typedef objobjproc
- added 3.2
-typedef visitproc
- added 3.2
-typedef traverseproc
- added 3.2
-typedef destructor
- added 3.2
-typedef getattrfunc
- added 3.2
-typedef getattrofunc
- added 3.2
-typedef setattrfunc
- added 3.2
-typedef setattrofunc
- added 3.2
-typedef reprfunc
- added 3.2
-typedef hashfunc
- added 3.2
-typedef richcmpfunc
- added 3.2
-typedef getiterfunc
- added 3.2
-typedef iternextfunc
- added 3.2
-typedef descrgetfunc
- added 3.2
-typedef descrsetfunc
- added 3.2
-typedef initproc
- added 3.2
-typedef newfunc
- added 3.2
-typedef allocfunc
- added 3.2
-typedef PyCFunction
- added 3.2
-typedef PyCFunctionWithKeywords
- added 3.2
-typedef PyCapsule_Destructor
- added 3.2
-typedef getter
- added 3.2
-typedef setter
- added 3.2
-typedef PyOS_sighandler_t
- added 3.2
-typedef PyGILState_STATE
- added 3.2
-typedef Py_UCS4
- added 3.2
-
-macro Py_BEGIN_ALLOW_THREADS
- added 3.2
-macro Py_BLOCK_THREADS
- added 3.2
-macro Py_UNBLOCK_THREADS
- added 3.2
-macro Py_END_ALLOW_THREADS
- added 3.2
-
-# The following were added in PC/python3.def in the initial stable ABI commit,
-# 4d0d471a8031de90a2b1ce99c4ac4780e60b3bc9,
-# and later amendments in 3.2:
-# 0d012f284be829c6217f60523db0e1671b7db9d9
-# c83bc3c1fbed14d27a5de3032e24d2cf006a7c4b
-
-function PyArg_Parse
- added 3.2
-function PyArg_ParseTuple
- added 3.2
-function PyArg_ParseTupleAndKeywords
- added 3.2
-function PyArg_UnpackTuple
- added 3.2
-function PyArg_VaParse
- added 3.2
-function PyArg_VaParseTupleAndKeywords
- added 3.2
-function PyArg_ValidateKeywordArguments
- added 3.2
-data PyBaseObject_Type
- added 3.2
-function PyBool_FromLong
- added 3.2
-data PyBool_Type
- added 3.2
-data PyByteArrayIter_Type
- added 3.2
-function PyByteArray_AsString
- added 3.2
-function PyByteArray_Concat
- added 3.2
-function PyByteArray_FromObject
- added 3.2
-function PyByteArray_FromStringAndSize
- added 3.2
-function PyByteArray_Resize
- added 3.2
-function PyByteArray_Size
- added 3.2
-data PyByteArray_Type
- added 3.2
-data PyBytesIter_Type
- added 3.2
-function PyBytes_AsString
- added 3.2
-function PyBytes_AsStringAndSize
- added 3.2
-function PyBytes_Concat
- added 3.2
-function PyBytes_ConcatAndDel
- added 3.2
-function PyBytes_DecodeEscape
- added 3.2
-function PyBytes_FromFormat
- added 3.2
-function PyBytes_FromFormatV
- added 3.2
-function PyBytes_FromObject
- added 3.2
-function PyBytes_FromString
- added 3.2
-function PyBytes_FromStringAndSize
- added 3.2
-function PyBytes_Repr
- added 3.2
-function PyBytes_Size
- added 3.2
-data PyBytes_Type
- added 3.2
-function PyCFunction_Call
- added 3.2
-function PyCFunction_GetFlags
- added 3.2
-function PyCFunction_GetFunction
- added 3.2
-function PyCFunction_GetSelf
- added 3.2
-function PyCFunction_NewEx
- added 3.2
-data PyCFunction_Type
- added 3.2
-function PyCallIter_New
- added 3.2
-data PyCallIter_Type
- added 3.2
-function PyCallable_Check
- added 3.2
-function PyCapsule_GetContext
- added 3.2
-function PyCapsule_GetDestructor
- added 3.2
-function PyCapsule_GetName
- added 3.2
-function PyCapsule_GetPointer
- added 3.2
-function PyCapsule_Import
- added 3.2
-function PyCapsule_IsValid
- added 3.2
-function PyCapsule_New
- added 3.2
-function PyCapsule_SetContext
- added 3.2
-function PyCapsule_SetDestructor
- added 3.2
-function PyCapsule_SetName
- added 3.2
-function PyCapsule_SetPointer
- added 3.2
-data PyCapsule_Type
- added 3.2
-data PyClassMethodDescr_Type
- added 3.2
-function PyCodec_BackslashReplaceErrors
- added 3.2
-function PyCodec_Decode
- added 3.2
-function PyCodec_Decoder
- added 3.2
-function PyCodec_Encode
- added 3.2
-function PyCodec_Encoder
- added 3.2
-function PyCodec_IgnoreErrors
- added 3.2
-function PyCodec_IncrementalDecoder
- added 3.2
-function PyCodec_IncrementalEncoder
- added 3.2
-function PyCodec_KnownEncoding
- added 3.2
-function PyCodec_LookupError
- added 3.2
-function PyCodec_Register
- added 3.2
-function PyCodec_RegisterError
- added 3.2
-function PyCodec_ReplaceErrors
- added 3.2
-function PyCodec_StreamReader
- added 3.2
-function PyCodec_StreamWriter
- added 3.2
-function PyCodec_StrictErrors
- added 3.2
-function PyCodec_XMLCharRefReplaceErrors
- added 3.2
-function PyComplex_FromDoubles
- added 3.2
-function PyComplex_ImagAsDouble
- added 3.2
-function PyComplex_RealAsDouble
- added 3.2
-data PyComplex_Type
- added 3.2
-function PyDescr_NewClassMethod
- added 3.2
-function PyDescr_NewGetSet
- added 3.2
-function PyDescr_NewMember
- added 3.2
-function PyDescr_NewMethod
- added 3.2
-data PyDictItems_Type
- added 3.2
-data PyDictIterItem_Type
- added 3.2
-data PyDictIterKey_Type
- added 3.2
-data PyDictIterValue_Type
- added 3.2
-data PyDictKeys_Type
- added 3.2
-function PyDictProxy_New
- added 3.2
-data PyDictProxy_Type
- added 3.2
-data PyDictValues_Type
- added 3.2
-function PyDict_Clear
- added 3.2
-function PyDict_Contains
- added 3.2
-function PyDict_Copy
- added 3.2
-function PyDict_DelItem
- added 3.2
-function PyDict_DelItemString
- added 3.2
-function PyDict_GetItem
- added 3.2
-function PyDict_GetItemString
- added 3.2
-function PyDict_GetItemWithError
- added 3.2
-function PyDict_Items
- added 3.2
-function PyDict_Keys
- added 3.2
-function PyDict_Merge
- added 3.2
-function PyDict_MergeFromSeq2
- added 3.2
-function PyDict_New
- added 3.2
-function PyDict_Next
- added 3.2
-function PyDict_SetItem
- added 3.2
-function PyDict_SetItemString
- added 3.2
-function PyDict_Size
- added 3.2
-data PyDict_Type
- added 3.2
-function PyDict_Update
- added 3.2
-function PyDict_Values
- added 3.2
-data PyEllipsis_Type
- added 3.2
-data PyEnum_Type
- added 3.2
-function PyErr_BadArgument
- added 3.2
-function PyErr_BadInternalCall
- added 3.2
-function PyErr_CheckSignals
- added 3.2
-function PyErr_Clear
- added 3.2
-function PyErr_Display
- added 3.2
-function PyErr_ExceptionMatches
- added 3.2
-function PyErr_Fetch
- added 3.2
-function PyErr_Format
- added 3.2
-function PyErr_GivenExceptionMatches
- added 3.2
-function PyErr_NewException
- added 3.2
-function PyErr_NewExceptionWithDoc
- added 3.2
-function PyErr_NoMemory
- added 3.2
-function PyErr_NormalizeException
- added 3.2
-function PyErr_Occurred
- added 3.2
-function PyErr_Print
- added 3.2
-function PyErr_PrintEx
- added 3.2
-function PyErr_ProgramText
- added 3.2
-function PyErr_Restore
- added 3.2
-function PyErr_SetFromErrno
- added 3.2
-function PyErr_SetFromErrnoWithFilename
- added 3.2
-function PyErr_SetFromErrnoWithFilenameObject
- added 3.2
-function PyErr_SetInterrupt
- added 3.2
-function PyErr_SetNone
- added 3.2
-function PyErr_SetObject
- added 3.2
-function PyErr_SetString
- added 3.2
-function PyErr_SyntaxLocation
- added 3.2
-function PyErr_WarnEx
- added 3.2
-function PyErr_WarnExplicit
- added 3.2
-function PyErr_WarnFormat
- added 3.2
-function PyErr_WriteUnraisable
- added 3.2
-function PyEval_AcquireLock
- added 3.2
-function PyEval_AcquireThread
- added 3.2
-function PyEval_CallFunction
- added 3.2
-function PyEval_CallMethod
- added 3.2
-function PyEval_CallObjectWithKeywords
- added 3.2
-function PyEval_EvalCode
- added 3.2
-function PyEval_EvalCodeEx
- added 3.2
-function PyEval_EvalFrame
- added 3.2
-function PyEval_EvalFrameEx
- added 3.2
-function PyEval_GetBuiltins
- added 3.2
-function PyEval_GetFrame
- added 3.2
-function PyEval_GetFuncDesc
- added 3.2
-function PyEval_GetFuncName
- added 3.2
-function PyEval_GetGlobals
- added 3.2
-function PyEval_GetLocals
- added 3.2
-function PyEval_InitThreads
- added 3.2
-function PyEval_ReleaseLock
- added 3.2
-function PyEval_ReleaseThread
- added 3.2
-function PyEval_RestoreThread
- added 3.2
-function PyEval_SaveThread
- added 3.2
-function PyEval_ThreadsInitialized
- added 3.2
-data PyExc_ArithmeticError
- added 3.2
-data PyExc_AssertionError
- added 3.2
-data PyExc_AttributeError
- added 3.2
-data PyExc_BaseException
- added 3.2
-data PyExc_BaseExceptionGroup
- added 3.11
-data PyExc_BufferError
- added 3.2
-data PyExc_BytesWarning
- added 3.2
-data PyExc_DeprecationWarning
- added 3.2
-data PyExc_EOFError
- added 3.2
-data PyExc_EnvironmentError
- added 3.2
-data PyExc_Exception
- added 3.2
-data PyExc_FloatingPointError
- added 3.2
-data PyExc_FutureWarning
- added 3.2
-data PyExc_GeneratorExit
- added 3.2
-data PyExc_IOError
- added 3.2
-data PyExc_ImportError
- added 3.2
-data PyExc_ImportWarning
- added 3.2
-data PyExc_IndentationError
- added 3.2
-data PyExc_IndexError
- added 3.2
-data PyExc_KeyError
- added 3.2
-data PyExc_KeyboardInterrupt
- added 3.2
-data PyExc_LookupError
- added 3.2
-data PyExc_MemoryError
- added 3.2
-data PyExc_NameError
- added 3.2
-data PyExc_NotImplementedError
- added 3.2
-data PyExc_OSError
- added 3.2
-data PyExc_OverflowError
- added 3.2
-data PyExc_PendingDeprecationWarning
- added 3.2
-data PyExc_ReferenceError
- added 3.2
-data PyExc_RuntimeError
- added 3.2
-data PyExc_RuntimeWarning
- added 3.2
-data PyExc_StopIteration
- added 3.2
-data PyExc_SyntaxError
- added 3.2
-data PyExc_SyntaxWarning
- added 3.2
-data PyExc_SystemError
- added 3.2
-data PyExc_SystemExit
- added 3.2
-data PyExc_TabError
- added 3.2
-data PyExc_TypeError
- added 3.2
-data PyExc_UnboundLocalError
- added 3.2
-data PyExc_UnicodeDecodeError
- added 3.2
-data PyExc_UnicodeEncodeError
- added 3.2
-data PyExc_UnicodeError
- added 3.2
-data PyExc_UnicodeTranslateError
- added 3.2
-data PyExc_UnicodeWarning
- added 3.2
-data PyExc_UserWarning
- added 3.2
-data PyExc_ValueError
- added 3.2
-data PyExc_Warning
- added 3.2
-data PyExc_ZeroDivisionError
- added 3.2
-function PyException_GetCause
- added 3.2
-function PyException_GetContext
- added 3.2
-function PyException_GetTraceback
- added 3.2
-function PyException_SetCause
- added 3.2
-function PyException_SetContext
- added 3.2
-function PyException_SetTraceback
- added 3.2
-function PyFile_FromFd
- added 3.2
-function PyFile_GetLine
- added 3.2
-function PyFile_WriteObject
- added 3.2
-function PyFile_WriteString
- added 3.2
-data PyFilter_Type
- added 3.2
-function PyFloat_AsDouble
- added 3.2
-function PyFloat_FromDouble
- added 3.2
-function PyFloat_FromString
- added 3.2
-function PyFloat_GetInfo
- added 3.2
-function PyFloat_GetMax
- added 3.2
-function PyFloat_GetMin
- added 3.2
-data PyFloat_Type
- added 3.2
-function PyFrozenSet_New
- added 3.2
-data PyFrozenSet_Type
- added 3.2
-function PyGC_Collect
- added 3.2
-function PyGILState_Ensure
- added 3.2
-function PyGILState_GetThisThreadState
- added 3.2
-function PyGILState_Release
- added 3.2
-data PyGetSetDescr_Type
- added 3.2
-function PyImport_AddModule
- added 3.2
-function PyImport_AppendInittab
- added 3.2
-function PyImport_ExecCodeModule
- added 3.2
-function PyImport_ExecCodeModuleEx
- added 3.2
-function PyImport_ExecCodeModuleWithPathnames
- added 3.2
-function PyImport_GetImporter
- added 3.2
-function PyImport_GetMagicNumber
- added 3.2
-function PyImport_GetMagicTag
- added 3.2
-function PyImport_GetModuleDict
- added 3.2
-function PyImport_Import
- added 3.2
-function PyImport_ImportFrozenModule
- added 3.2
-function PyImport_ImportModule
- added 3.2
-function PyImport_ImportModuleLevel
- added 3.2
-function PyImport_ImportModuleNoBlock
- added 3.2
-function PyImport_ReloadModule
- added 3.2
-function PyInterpreterState_Clear
- added 3.2
-function PyInterpreterState_Delete
- added 3.2
-function PyInterpreterState_New
- added 3.2
-function PyIter_Next
- added 3.2
-data PyListIter_Type
- added 3.2
-data PyListRevIter_Type
- added 3.2
-function PyList_Append
- added 3.2
-function PyList_AsTuple
- added 3.2
-function PyList_GetItem
- added 3.2
-function PyList_GetSlice
- added 3.2
-function PyList_Insert
- added 3.2
-function PyList_New
- added 3.2
-function PyList_Reverse
- added 3.2
-function PyList_SetItem
- added 3.2
-function PyList_SetSlice
- added 3.2
-function PyList_Size
- added 3.2
-function PyList_Sort
- added 3.2
-data PyList_Type
- added 3.2
-data PyLongRangeIter_Type
- added 3.2
-function PyLong_AsDouble
- added 3.2
-function PyLong_AsLong
- added 3.2
-function PyLong_AsLongAndOverflow
- added 3.2
-function PyLong_AsLongLong
- added 3.2
-function PyLong_AsLongLongAndOverflow
- added 3.2
-function PyLong_AsSize_t
- added 3.2
-function PyLong_AsSsize_t
- added 3.2
-function PyLong_AsUnsignedLong
- added 3.2
-function PyLong_AsUnsignedLongLong
- added 3.2
-function PyLong_AsUnsignedLongLongMask
- added 3.2
-function PyLong_AsUnsignedLongMask
- added 3.2
-function PyLong_AsVoidPtr
- added 3.2
-function PyLong_FromDouble
- added 3.2
-function PyLong_FromLong
- added 3.2
-function PyLong_FromLongLong
- added 3.2
-function PyLong_FromSize_t
- added 3.2
-function PyLong_FromSsize_t
- added 3.2
-function PyLong_FromString
- added 3.2
-function PyLong_FromUnsignedLong
- added 3.2
-function PyLong_FromUnsignedLongLong
- added 3.2
-function PyLong_FromVoidPtr
- added 3.2
-function PyLong_GetInfo
- added 3.2
-data PyLong_Type
- added 3.2
-data PyMap_Type
- added 3.2
-function PyMapping_Check
- added 3.2
-function PyMapping_GetItemString
- added 3.2
-function PyMapping_HasKey
- added 3.2
-function PyMapping_HasKeyString
- added 3.2
-function PyMapping_Items
- added 3.2
-function PyMapping_Keys
- added 3.2
-function PyMapping_Length
- added 3.2
-function PyMapping_SetItemString
- added 3.2
-function PyMapping_Size
- added 3.2
-function PyMapping_Values
- added 3.2
-function PyMem_Free
- added 3.2
-function PyMem_Malloc
- added 3.2
-function PyMem_Realloc
- added 3.2
-data PyMemberDescr_Type
- added 3.2
-function PyMemoryView_FromObject
- added 3.2
-function PyMemoryView_GetContiguous
- added 3.2
-data PyMemoryView_Type
- added 3.2
-data PyMethodDescr_Type
- added 3.2
-function PyModule_AddIntConstant
- added 3.2
-function PyModule_AddObject
- added 3.2
-function PyModule_AddStringConstant
- added 3.2
-function PyModule_Create2
- added 3.2
-function PyModule_GetDef
- added 3.2
-function PyModule_GetDict
- added 3.2
-function PyModule_GetFilename
- added 3.2
-function PyModule_GetFilenameObject
- added 3.2
-function PyModule_GetName
- added 3.2
-function PyModule_GetState
- added 3.2
-function PyModule_New
- added 3.2
-data PyModule_Type
- added 3.2
-function PyNumber_Absolute
- added 3.2
-function PyNumber_Add
- added 3.2
-function PyNumber_And
- added 3.2
-function PyNumber_AsSsize_t
- added 3.2
-function PyNumber_Check
- added 3.2
-function PyNumber_Divmod
- added 3.2
-function PyNumber_Float
- added 3.2
-function PyNumber_FloorDivide
- added 3.2
-function PyNumber_InPlaceAdd
- added 3.2
-function PyNumber_InPlaceAnd
- added 3.2
-function PyNumber_InPlaceFloorDivide
- added 3.2
-function PyNumber_InPlaceLshift
- added 3.2
-function PyNumber_InPlaceMultiply
- added 3.2
-function PyNumber_InPlaceOr
- added 3.2
-function PyNumber_InPlacePower
- added 3.2
-function PyNumber_InPlaceRemainder
- added 3.2
-function PyNumber_InPlaceRshift
- added 3.2
-function PyNumber_InPlaceSubtract
- added 3.2
-function PyNumber_InPlaceTrueDivide
- added 3.2
-function PyNumber_InPlaceXor
- added 3.2
-function PyNumber_Index
- added 3.2
-function PyNumber_Invert
- added 3.2
-function PyNumber_Long
- added 3.2
-function PyNumber_Lshift
- added 3.2
-function PyNumber_Multiply
- added 3.2
-function PyNumber_Negative
- added 3.2
-function PyNumber_Or
- added 3.2
-function PyNumber_Positive
- added 3.2
-function PyNumber_Power
- added 3.2
-function PyNumber_Remainder
- added 3.2
-function PyNumber_Rshift
- added 3.2
-function PyNumber_Subtract
- added 3.2
-function PyNumber_ToBase
- added 3.2
-function PyNumber_TrueDivide
- added 3.2
-function PyNumber_Xor
- added 3.2
-function PyOS_AfterFork
- added 3.2
- ifdef HAVE_FORK
-data PyOS_InputHook
- added 3.2
-function PyOS_InterruptOccurred
- added 3.2
-function PyOS_double_to_string
- added 3.2
-function PyOS_getsig
- added 3.2
-function PyOS_mystricmp
- added 3.2
-function PyOS_mystrnicmp
- added 3.2
-function PyOS_setsig
- added 3.2
-function PyOS_snprintf
- added 3.2
-function PyOS_string_to_double
- added 3.2
-function PyOS_strtol
- added 3.2
-function PyOS_strtoul
- added 3.2
-function PyOS_vsnprintf
- added 3.2
-function PyObject_ASCII
- added 3.2
-function PyObject_AsFileDescriptor
- added 3.2
-function PyObject_Bytes
- added 3.2
-function PyObject_Call
- added 3.2
-function PyObject_CallFunction
- added 3.2
-function PyObject_CallFunctionObjArgs
- added 3.2
-function PyObject_CallMethod
- added 3.2
-function PyObject_CallMethodObjArgs
- added 3.2
-function PyObject_CallObject
- added 3.2
-function PyObject_ClearWeakRefs
- added 3.2
-function PyObject_DelItem
- added 3.2
-function PyObject_DelItemString
- added 3.2
-function PyObject_Dir
- added 3.2
-function PyObject_Format
- added 3.2
-function PyObject_Free
- added 3.2
-function PyObject_GC_Del
- added 3.2
-function PyObject_GC_Track
- added 3.2
-function PyObject_GC_UnTrack
- added 3.2
-function PyObject_GenericGetAttr
- added 3.2
-function PyObject_GenericSetAttr
- added 3.2
-function PyObject_GetAttr
- added 3.2
-function PyObject_GetAttrString
- added 3.2
-function PyObject_GetItem
- added 3.2
-function PyObject_GetIter
- added 3.2
-function PyObject_HasAttr
- added 3.2
-function PyObject_HasAttrString
- added 3.2
-function PyObject_Hash
- added 3.2
-function PyObject_HashNotImplemented
- added 3.2
-function PyObject_Init
- added 3.2
-function PyObject_InitVar
- added 3.2
-function PyObject_IsInstance
- added 3.2
-function PyObject_IsSubclass
- added 3.2
-function PyObject_IsTrue
- added 3.2
-function PyObject_Length
- added 3.2
-function PyObject_Malloc
- added 3.2
-function PyObject_Not
- added 3.2
-function PyObject_Realloc
- added 3.2
-function PyObject_Repr
- added 3.2
-function PyObject_RichCompare
- added 3.2
-function PyObject_RichCompareBool
- added 3.2
-function PyObject_SelfIter
- added 3.2
-function PyObject_SetAttr
- added 3.2
-function PyObject_SetAttrString
- added 3.2
-function PyObject_SetItem
- added 3.2
-function PyObject_Size
- added 3.2
-function PyObject_Str
- added 3.2
-function PyObject_Type
- added 3.2
-data PyProperty_Type
- added 3.2
-data PyRangeIter_Type
- added 3.2
-data PyRange_Type
- added 3.2
-data PyReversed_Type
- added 3.2
-function PySeqIter_New
- added 3.2
-data PySeqIter_Type
- added 3.2
-function PySequence_Check
- added 3.2
-function PySequence_Concat
- added 3.2
-function PySequence_Contains
- added 3.2
-function PySequence_Count
- added 3.2
-function PySequence_DelItem
- added 3.2
-function PySequence_DelSlice
- added 3.2
-function PySequence_Fast
- added 3.2
-function PySequence_GetItem
- added 3.2
-function PySequence_GetSlice
- added 3.2
-function PySequence_In
- added 3.2
-function PySequence_InPlaceConcat
- added 3.2
-function PySequence_InPlaceRepeat
- added 3.2
-function PySequence_Index
- added 3.2
-function PySequence_Length
- added 3.2
-function PySequence_List
- added 3.2
-function PySequence_Repeat
- added 3.2
-function PySequence_SetItem
- added 3.2
-function PySequence_SetSlice
- added 3.2
-function PySequence_Size
- added 3.2
-function PySequence_Tuple
- added 3.2
-data PySetIter_Type
- added 3.2
-function PySet_Add
- added 3.2
-function PySet_Clear
- added 3.2
-function PySet_Contains
- added 3.2
-function PySet_Discard
- added 3.2
-function PySet_New
- added 3.2
-function PySet_Pop
- added 3.2
-function PySet_Size
- added 3.2
-data PySet_Type
- added 3.2
-function PySlice_GetIndices
- added 3.2
-function PySlice_GetIndicesEx
- added 3.2
-function PySlice_New
- added 3.2
-data PySlice_Type
- added 3.2
-function PyState_FindModule
- added 3.2
-function PyStructSequence_GetItem
- added 3.2
-function PyStructSequence_New
- added 3.2
-function PyStructSequence_NewType
- added 3.2
-function PyStructSequence_SetItem
- added 3.2
-data PySuper_Type
- added 3.2
-function PySys_AddWarnOption
- added 3.2
-function PySys_AddWarnOptionUnicode
- added 3.2
-function PySys_FormatStderr
- added 3.2
-function PySys_FormatStdout
- added 3.2
-function PySys_GetObject
- added 3.2
-function PySys_HasWarnOptions
- added 3.2
-function PySys_ResetWarnOptions
- added 3.2
-function PySys_SetArgv
- added 3.2
-function PySys_SetArgvEx
- added 3.2
-function PySys_SetObject
- added 3.2
-function PySys_SetPath
- added 3.2
-function PySys_WriteStderr
- added 3.2
-function PySys_WriteStdout
- added 3.2
-function PyThreadState_Clear
- added 3.2
-function PyThreadState_Delete
- added 3.2
-function PyThreadState_DeleteCurrent
- added 3.2
- abi_only
-function PyThreadState_Get
- added 3.2
-function PyThreadState_GetDict
- added 3.2
-function PyThreadState_New
- added 3.2
-function PyThreadState_SetAsyncExc
- added 3.2
-function PyThreadState_Swap
- added 3.2
-function PyTraceBack_Here
- added 3.2
-function PyTraceBack_Print
- added 3.2
-data PyTraceBack_Type
- added 3.2
-data PyTupleIter_Type
- added 3.2
-function PyTuple_GetItem
- added 3.2
-function PyTuple_GetSlice
- added 3.2
-function PyTuple_New
- added 3.2
-function PyTuple_Pack
- added 3.2
-function PyTuple_SetItem
- added 3.2
-function PyTuple_Size
- added 3.2
-data PyTuple_Type
- added 3.2
-function PyType_ClearCache
- added 3.2
-function PyType_GenericAlloc
- added 3.2
-function PyType_GenericNew
- added 3.2
-function PyType_GetFlags
- added 3.2
-function PyType_IsSubtype
- added 3.2
-function PyType_Modified
- added 3.2
-function PyType_Ready
- added 3.2
-data PyType_Type
- added 3.2
-function PyUnicodeDecodeError_Create
- added 3.2
-function PyUnicodeDecodeError_GetEncoding
- added 3.2
-function PyUnicodeDecodeError_GetEnd
- added 3.2
-function PyUnicodeDecodeError_GetObject
- added 3.2
-function PyUnicodeDecodeError_GetReason
- added 3.2
-function PyUnicodeDecodeError_GetStart
- added 3.2
-function PyUnicodeDecodeError_SetEnd
- added 3.2
-function PyUnicodeDecodeError_SetReason
- added 3.2
-function PyUnicodeDecodeError_SetStart
- added 3.2
-function PyUnicodeEncodeError_GetEncoding
- added 3.2
-function PyUnicodeEncodeError_GetEnd
- added 3.2
-function PyUnicodeEncodeError_GetObject
- added 3.2
-function PyUnicodeEncodeError_GetReason
- added 3.2
-function PyUnicodeEncodeError_GetStart
- added 3.2
-function PyUnicodeEncodeError_SetEnd
- added 3.2
-function PyUnicodeEncodeError_SetReason
- added 3.2
-function PyUnicodeEncodeError_SetStart
- added 3.2
-data PyUnicodeIter_Type
- added 3.2
-function PyUnicodeTranslateError_GetEnd
- added 3.2
-function PyUnicodeTranslateError_GetObject
- added 3.2
-function PyUnicodeTranslateError_GetReason
- added 3.2
-function PyUnicodeTranslateError_GetStart
- added 3.2
-function PyUnicodeTranslateError_SetEnd
- added 3.2
-function PyUnicodeTranslateError_SetReason
- added 3.2
-function PyUnicodeTranslateError_SetStart
- added 3.2
-function PyUnicode_Append
- added 3.2
-function PyUnicode_AppendAndDel
- added 3.2
-function PyUnicode_AsASCIIString
- added 3.2
-function PyUnicode_AsCharmapString
- added 3.2
-function PyUnicode_AsDecodedObject
- added 3.2
-function PyUnicode_AsDecodedUnicode
- added 3.2
-function PyUnicode_AsEncodedObject
- added 3.2
-function PyUnicode_AsEncodedString
- added 3.2
-function PyUnicode_AsEncodedUnicode
- added 3.2
-function PyUnicode_AsLatin1String
- added 3.2
-function PyUnicode_AsRawUnicodeEscapeString
- added 3.2
-function PyUnicode_AsUTF16String
- added 3.2
-function PyUnicode_AsUTF32String
- added 3.2
-function PyUnicode_AsUTF8String
- added 3.2
-function PyUnicode_AsUnicodeEscapeString
- added 3.2
-function PyUnicode_AsWideChar
- added 3.2
-function PyUnicode_Compare
- added 3.2
-function PyUnicode_Concat
- added 3.2
-function PyUnicode_Contains
- added 3.2
-function PyUnicode_Count
- added 3.2
-function PyUnicode_Decode
- added 3.2
-function PyUnicode_DecodeASCII
- added 3.2
-function PyUnicode_DecodeCharmap
- added 3.2
-function PyUnicode_DecodeFSDefault
- added 3.2
-function PyUnicode_DecodeFSDefaultAndSize
- added 3.2
-function PyUnicode_DecodeLatin1
- added 3.2
-function PyUnicode_DecodeRawUnicodeEscape
- added 3.2
-function PyUnicode_DecodeUTF16
- added 3.2
-function PyUnicode_DecodeUTF16Stateful
- added 3.2
-function PyUnicode_DecodeUTF32
- added 3.2
-function PyUnicode_DecodeUTF32Stateful
- added 3.2
-function PyUnicode_DecodeUTF8
- added 3.2
-function PyUnicode_DecodeUTF8Stateful
- added 3.2
-function PyUnicode_DecodeUnicodeEscape
- added 3.2
-function PyUnicode_FSConverter
- added 3.2
-function PyUnicode_FSDecoder
- added 3.2
-function PyUnicode_Find
- added 3.2
-function PyUnicode_Format
- added 3.2
-function PyUnicode_FromEncodedObject
- added 3.2
-function PyUnicode_FromFormat
- added 3.2
-function PyUnicode_FromFormatV
- added 3.2
-function PyUnicode_FromObject
- added 3.2
-function PyUnicode_FromOrdinal
- added 3.2
-function PyUnicode_FromString
- added 3.2
-function PyUnicode_FromStringAndSize
- added 3.2
-function PyUnicode_FromWideChar
- added 3.2
-function PyUnicode_GetDefaultEncoding
- added 3.2
-function PyUnicode_GetSize
- added 3.2
-function PyUnicode_IsIdentifier
- added 3.2
-function PyUnicode_Join
- added 3.2
-function PyUnicode_Partition
- added 3.2
-function PyUnicode_RPartition
- added 3.2
-function PyUnicode_RSplit
- added 3.2
-function PyUnicode_Replace
- added 3.2
-function PyUnicode_Resize
- added 3.2
-function PyUnicode_RichCompare
- added 3.2
-function PyUnicode_Split
- added 3.2
-function PyUnicode_Splitlines
- added 3.2
-function PyUnicode_Tailmatch
- added 3.2
-function PyUnicode_Translate
- added 3.2
-function PyUnicode_BuildEncodingMap
- added 3.2
-function PyUnicode_CompareWithASCIIString
- added 3.2
-function PyUnicode_DecodeUTF7
- added 3.2
-function PyUnicode_DecodeUTF7Stateful
- added 3.2
-function PyUnicode_EncodeFSDefault
- added 3.2
-function PyUnicode_InternFromString
- added 3.2
-function PyUnicode_InternImmortal
- added 3.2
-function PyUnicode_InternInPlace
- added 3.2
-data PyUnicode_Type
- added 3.2
-function PyWeakref_GetObject
- added 3.2
-function PyWeakref_NewProxy
- added 3.2
-function PyWeakref_NewRef
- added 3.2
-data PyWrapperDescr_Type
- added 3.2
-function PyWrapper_New
- added 3.2
-data PyZip_Type
- added 3.2
-function Py_AddPendingCall
- added 3.2
-function Py_AtExit
- added 3.2
-function Py_BuildValue
- added 3.2
-function Py_CompileString
- added 3.2
-function Py_DecRef
- added 3.2
-function Py_EndInterpreter
- added 3.2
-function Py_Exit
- added 3.2
-function Py_FatalError
- added 3.2
-data Py_FileSystemDefaultEncoding
- added 3.2
-function Py_Finalize
- added 3.2
-function Py_GetBuildInfo
- added 3.2
-function Py_GetCompiler
- added 3.2
-function Py_GetCopyright
- added 3.2
-function Py_GetExecPrefix
- added 3.2
-function Py_GetPath
- added 3.2
-function Py_GetPlatform
- added 3.2
-function Py_GetPrefix
- added 3.2
-function Py_GetProgramFullPath
- added 3.2
-function Py_GetProgramName
- added 3.2
-function Py_GetPythonHome
- added 3.2
-function Py_GetRecursionLimit
- added 3.2
-function Py_GetVersion
- added 3.2
-data Py_HasFileSystemDefaultEncoding
- added 3.2
-function Py_IncRef
- added 3.2
-function Py_Initialize
- added 3.2
-function Py_InitializeEx
- added 3.2
-function Py_IsInitialized
- added 3.2
-function Py_Main
- added 3.2
-function Py_MakePendingCalls
- added 3.2
-function Py_NewInterpreter
- added 3.2
-function Py_ReprEnter
- added 3.2
-function Py_ReprLeave
- added 3.2
-function Py_SetProgramName
- added 3.2
-function Py_SetPythonHome
- added 3.2
-function Py_SetRecursionLimit
- added 3.2
-function Py_VaBuildValue
- added 3.2
-
-function _PyErr_BadInternalCall
- added 3.2
- abi_only
-function _PyObject_CallFunction_SizeT
- added 3.2
- abi_only
-function _PyObject_CallMethod_SizeT
- added 3.2
- abi_only
-function _PyObject_GC_New
- added 3.2
- abi_only
-function _PyObject_GC_NewVar
- added 3.2
- abi_only
-function _PyObject_GC_Resize
- added 3.2
- abi_only
-function _PyObject_New
- added 3.2
- abi_only
-function _PyObject_NewVar
- added 3.2
- abi_only
-function _PyState_AddModule
- added 3.2
- abi_only
-function _PyThreadState_Init
- added 3.2
- abi_only
-function _PyThreadState_Prealloc
- added 3.2
- abi_only
-data _PyWeakref_CallableProxyType
- added 3.2
- abi_only
-data _PyWeakref_ProxyType
- added 3.2
- abi_only
-data _PyWeakref_RefType
- added 3.2
- abi_only
-function _Py_BuildValue_SizeT
- added 3.2
- abi_only
-function _Py_CheckRecursiveCall
- added 3.2
- abi_only
-function _Py_Dealloc
- added 3.2
- abi_only
-data _Py_EllipsisObject
- added 3.2
- abi_only
-data _Py_FalseStruct
- added 3.2
- abi_only
-data _Py_NoneStruct
- added 3.2
- abi_only
-data _Py_NotImplementedStruct
- added 3.2
- abi_only
-data _Py_SwappedOp
- added 3.2
- abi_only
-data _Py_TrueStruct
- added 3.2
- abi_only
-function _Py_VaBuildValue_SizeT
- added 3.2
- abi_only
-
-# Old buffer protocol support (deprecated)
-
-function PyObject_AsCharBuffer
- added 3.2
-function PyObject_AsReadBuffer
- added 3.2
-function PyObject_AsWriteBuffer
- added 3.2
-function PyObject_CheckReadBuffer
- added 3.2
-
-# Flags are implicitly part of the ABI:
-
-const Py_TPFLAGS_DEFAULT
- added 3.2
-const Py_TPFLAGS_BASETYPE
- added 3.2
-const Py_TPFLAGS_HAVE_GC
- added 3.2
-
-const METH_VARARGS
- added 3.2
-const METH_NOARGS
- added 3.2
-const METH_O
- added 3.2
-const METH_CLASS
- added 3.2
-const METH_STATIC
- added 3.2
-const METH_COEXIST
- added 3.2
-# METH_STACKLESS is undocumented
-# METH_FASTCALL is not part of limited API.
-
-# The following are defined in private headers, but historically
-# they were exported as part of the stable ABI.
-function PyMarshal_ReadObjectFromString
- added 3.2
- abi_only
-function PyMarshal_WriteObjectToString
- added 3.2
- abi_only
-function PyMember_GetOne
- added 3.2
- abi_only
-function PyMember_SetOne
- added 3.2
- abi_only
-
-# TLS api is deprecated; superseded by TSS API
-
-function PyThread_ReInitTLS
- added 3.2
-function PyThread_create_key
- added 3.2
-function PyThread_delete_key
- added 3.2
-function PyThread_set_key_value
- added 3.2
-function PyThread_get_key_value
- added 3.2
-function PyThread_delete_key_value
- added 3.2
-function PyThread_acquire_lock
- added 3.2
-function PyThread_acquire_lock_timed
- added 3.2
-function PyThread_allocate_lock
- added 3.2
-function PyThread_exit_thread
- added 3.2
-function PyThread_free_lock
- added 3.2
-function PyThread_get_stacksize
- added 3.2
-function PyThread_get_thread_ident
- added 3.2
-function PyThread_get_thread_native_id
- ifdef PY_HAVE_THREAD_NATIVE_ID
- added 3.2
-function PyThread_init_thread
- added 3.2
-function PyThread_release_lock
- added 3.2
-function PyThread_set_stacksize
- added 3.2
-function PyThread_start_new_thread
- added 3.2
-
-# The following were added in PC/python3.def in Python 3.3:
-# 7800f75827b1be557be16f3b18f5170fbf9fae08
-# 9c56409d3353b8cd4cfc19e0467bbe23fd34fc92
-# 75aeaa9b18667219bbacbc58ba6efecccef9dfbd
-
-function PyState_AddModule
- added 3.3
-function PyState_RemoveModule
- added 3.3
-function PyType_FromSpecWithBases
- added 3.3
-function _PyArg_Parse_SizeT
- added 3.3
- abi_only
-function _PyArg_ParseTuple_SizeT
- added 3.3
- abi_only
-function _PyArg_ParseTupleAndKeywords_SizeT
- added 3.3
- abi_only
-function _PyArg_VaParse_SizeT
- added 3.3
- abi_only
-function _PyArg_VaParseTupleAndKeywords_SizeT
- added 3.3
- abi_only
-function PyThread_GetInfo
- added 3.3
-
-# The following were added in PC/python3.def in Python 3.4:
-# 3ba3a3ee56c142e93d6bbe20ff6bf939212a30f0
-
-function PyCFunction_New
- added 3.4
-function PyType_GetSlot
- added 3.4
-
-# The following were added in PC/python3.def in Python 3.5:
-# 11d7b1423fc44d764eba7065ea5eba58ed748b21
-# f3b73ad51da3097d7915796fdc62608b1ab90c0a
-
-function PyErr_FormatV
- added 3.5
-function PyModuleDef_Init
- added 3.5
-data PyModuleDef_Type
- added 3.5
-
-# New slots in 3.5:
-# d51374ed78a3e3145911a16cdf3b9b84b3ba7d15 - Matrix multiplication (PEP 465)
-# 7544508f0245173bff5866aa1598c8f6cce1fc5f - Async iterators (PEP 492)
-# 0969a9f8abcf98bb43ea77b1dd050426adcfb4f7 - tp_finalize
-
-const Py_nb_matrix_multiply
- added 3.5
-const Py_nb_inplace_matrix_multiply
- added 3.5
-const Py_am_await
- added 3.5
-const Py_am_aiter
- added 3.5
-const Py_am_anext
- added 3.5
-const Py_tp_finalize
- added 3.5
-
-# The following were added in PC/python3.def in Python 3.6:
-
-function Py_FinalizeEx
- added 3.6
-
-function PyOS_FSPath
- added 3.6
-function PyErr_ResourceWarning
- added 3.6
-function PyErr_SetImportErrorSubclass
- added 3.6
-data PyExc_ModuleNotFoundError
- added 3.6
-
-# The following were added in PC/python3.def in Python 3.6.1 and 3.5.3/3.5.4:
-
-function PyCodec_NameReplaceErrors
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_GetExcInfo
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_SetExcInfo
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_SetFromErrnoWithFilenameObjects
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_SetImportError
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_SyntaxLocationEx
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_BlockingIOError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_BrokenPipeError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ChildProcessError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ConnectionAbortedError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ConnectionError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ConnectionRefusedError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ConnectionResetError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_FileExistsError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_FileNotFoundError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_InterruptedError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_IsADirectoryError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_NotADirectoryError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_PermissionError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ProcessLookupError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_RecursionError
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_ResourceWarning
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_StopAsyncIteration
- added 3.7 # (and 3.6.1 and 3.5.3)
-data PyExc_TimeoutError
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyImport_AddModuleObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyImport_ExecCodeModuleObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyImport_ImportFrozenModuleObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyImport_ImportModuleLevelObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyMem_Calloc
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyMemoryView_FromMemory
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_AddFunctions
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_ExecDef
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_FromDefAndSpec2
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_GetNameObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_NewObject
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyModule_SetDocString
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyNumber_InPlaceMatrixMultiply
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyNumber_MatrixMultiply
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyObject_Calloc
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyObject_GenericSetDict
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PySys_AddXOption
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PySys_GetXOptions
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_AsUCS4
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_AsUCS4Copy
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_AsWideCharString
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_DecodeLocale
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_DecodeLocaleAndSize
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_EncodeLocale
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_FindChar
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_GetLength
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_ReadChar
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_Substring
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyUnicode_WriteChar
- added 3.7 # (and 3.6.1 and 3.5.3)
-function Py_DecodeLocale
- added 3.7 # (and 3.6.1 and 3.5.3)
-function Py_EncodeLocale
- added 3.7 # (and 3.6.1 and 3.5.3)
-function Py_SetPath
- added 3.7 # (and 3.6.1 and 3.5.3)
-function PyErr_SetExcFromWindowsErr
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyErr_SetExcFromWindowsErrWithFilename
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyErr_SetExcFromWindowsErrWithFilenameObject
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyErr_SetExcFromWindowsErrWithFilenameObjects
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyErr_SetFromWindowsErr
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyErr_SetFromWindowsErrWithFilename
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-data PyExc_WindowsError
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyOS_CheckStack
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef USE_STACKCHECK
-function PyUnicode_AsMBCSString
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyUnicode_DecodeCodePageStateful
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyUnicode_DecodeMBCS
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyUnicode_DecodeMBCSStateful
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-function PyUnicode_EncodeCodePage
- added 3.7 # (and 3.6.1 and 3.5.3)
- ifdef MS_WINDOWS
-
-# 3.5.4:
-function PySlice_AdjustIndices
- added 3.7 # (and 3.6.1 and 3.5.4)
-function PySlice_Unpack
- added 3.7 # (and 3.6.1 and 3.5.4)
-
-# The following were added in PC/python3.def in Python 3.7:
-
-function PyInterpreterState_GetID
- added 3.7
-function PyThread_tss_alloc
- added 3.7
-function PyThread_tss_create
- added 3.7
-function PyThread_tss_delete
- added 3.7
-function PyThread_tss_free
- added 3.7
-function PyThread_tss_get
- added 3.7
-function PyThread_tss_is_created
- added 3.7
-function PyThread_tss_set
- added 3.7
-function PyOS_BeforeFork
- added 3.7
- ifdef HAVE_FORK
-function PyOS_AfterFork_Parent
- added 3.7
- ifdef HAVE_FORK
-function PyOS_AfterFork_Child
- added 3.7
- ifdef HAVE_FORK
-
-# New method flags in 3.7 (PEP 590):
-
-const METH_FASTCALL
- added 3.7
-const METH_METHOD
- added 3.7
-
-# The following were added in PC/python3.def in Python 3.8:
-
-function PyImport_GetModule
- added 3.8
-data Py_UTF8Mode
- added 3.8
-function PyExceptionClass_Name
- added 3.8
-function PyIndex_Check
- added 3.8
-function PyIter_Check
- added 3.8
-data PyDictRevIterItem_Type
- added 3.8
-data PyDictRevIterKey_Type
- added 3.8
-data PyDictRevIterValue_Type
- added 3.8
-function PyInterpreterState_GetDict
- added 3.8
-function Py_BytesMain
- added 3.8
-
-# New type flag (PEP 590):
-
-const Py_TPFLAGS_METHOD_DESCRIPTOR
- added 3.8
-
-# The following were added in PC/python3.def in Python 3.9:
-
-function Py_EnterRecursiveCall
- added 3.9
-function Py_LeaveRecursiveCall
- added 3.9
-function Py_GenericAlias
- added 3.9
-data Py_GenericAliasType
- added 3.9
-function PyCMethod_New
- added 3.9 # Windows: 3.10 & 3.9.2 -- https://bugs.python.org/issue43155
-function PyInterpreterState_Get
- added 3.9
-function PyObject_GC_IsFinalized
- added 3.9
-function PyObject_GC_IsTracked
- added 3.9
-
-# The following were added in PC/python3.def in Python 3.10:
-
-function Py_GetArgcArgv
- added 3.10
- abi_only
-function PyIter_Send
- added 3.10
-function PyUnicode_AsUTF8AndSize
- added 3.10
-function PyObject_GenericGetDict
- added 3.10
-function Py_NewRef
- added 3.10
-function Py_XNewRef
- added 3.10
-function PyModule_AddType
- added 3.10
-function PyType_FromModuleAndSpec
- added 3.10
-function PyType_GetModule
- added 3.10
-function PyType_GetModuleState
- added 3.10
-function PyFrame_GetLineNumber
- added 3.10
-function PyFrame_GetCode
- added 3.10
-function PyObject_CallNoArgs
- added 3.10
-function PyThreadState_GetFrame
- added 3.10
-function PyThreadState_GetID
- added 3.10
-function PyThreadState_GetInterpreter
- added 3.10
-function PyModule_AddObjectRef
- added 3.10
-data Py_FileSystemDefaultEncodeErrors
- added 3.10
-function PyCodec_Unregister
- added 3.10
-function PyErr_SetInterruptEx
- added 3.10
-function Py_Is
- added 3.10
-function Py_IsTrue
- added 3.10
-function Py_IsFalse
- added 3.10
-function Py_IsNone
- added 3.10
-function _Py_IncRef
- added 3.10
- abi_only
-function _Py_DecRef
- added 3.10
- abi_only
-function PyAIter_Check
- added 3.10
-function PyObject_GetAIter
- added 3.10
-data PyExc_EncodingWarning
- added 3.10
-
-# Support for Stable ABI in debug builds
-
-data _Py_RefTotal
- added 3.10
- abi_only
- ifdef Py_REF_DEBUG
-function _Py_NegativeRefcount
- added 3.10
- abi_only
- ifdef Py_REF_DEBUG
-
-# New slots in 3.10:
-
-const Py_am_send
- added 3.10
-
-
-# New GC control functions in Py3.10 (https://bugs.python.org/issue28254)
-
-function PyGC_Disable
- added 3.10
-function PyGC_Enable
- added 3.10
-function PyGC_IsEnabled
- added 3.10
-
-# Add new C API in Python 3.11
-
-function PyType_GetName
- added 3.11
-function PyType_GetQualName
- added 3.11
-data PyStructSequence_UnnamedField
- added 3.11
-
-# Add stable Py_buffer API in Python 3.11 (https://bugs.python.org/issue45459)
-struct Py_buffer
- added 3.11
- full-abi
-function PyObject_CheckBuffer
- added 3.11
-function PyObject_GetBuffer
- added 3.11
-function PyBuffer_GetPointer
- added 3.11
-function PyBuffer_SizeFromFormat
- added 3.11
-function PyBuffer_ToContiguous
- added 3.11
-function PyBuffer_FromContiguous
- added 3.11
-function PyObject_CopyData
- added 3.11
-function PyBuffer_IsContiguous
- added 3.11
-function PyBuffer_FillContiguousStrides
- added 3.11
-function PyBuffer_FillInfo
- added 3.11
-function PyBuffer_Release
- added 3.11
-function PyMemoryView_FromBuffer
- added 3.11
-
-# (Detailed comments aren't really needed for further entries: from here on
-# we can use version control logs.)
-
-data Py_Version
- added 3.11
-function PyErr_GetHandledException
- added 3.11
-function PyErr_SetHandledException
- added 3.11
-
diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py
index 5407524..f5a9f8d 100755
--- a/Tools/scripts/stable_abi.py
+++ b/Tools/scripts/stable_abi.py
@@ -14,8 +14,10 @@ import subprocess
import sysconfig
import argparse
import textwrap
+import tomllib
import difflib
import shutil
+import pprint
import sys
import os
import os.path
@@ -46,17 +48,15 @@ MACOS = (sys.platform == "darwin")
UNIXY = MACOS or (sys.platform == "linux") # XXX should this be "not Windows"?
-# The stable ABI manifest (Misc/stable_abi.txt) exists only to fill the
+# The stable ABI manifest (Misc/stable_abi.toml) exists only to fill the
# following dataclasses.
# Feel free to change its syntax (and the `parse_manifest` function)
# to better serve that purpose (while keeping it human-readable).
-@dataclasses.dataclass
class Manifest:
"""Collection of `ABIItem`s forming the stable ABI/limited API."""
-
- kind = 'manifest'
- contents: dict = dataclasses.field(default_factory=dict)
+ def __init__(self):
+ self.contents = dict()
def add(self, item):
if item.name in self.contents:
@@ -65,14 +65,6 @@ class Manifest:
raise ValueError(f'duplicate ABI item {item.name}')
self.contents[item.name] = item
- @property
- def feature_defines(self):
- """Return all feature defines which affect what's available
-
- These are e.g. HAVE_FORK and MS_WINDOWS.
- """
- return set(item.ifdef for item in self.contents.values()) - {None}
-
def select(self, kinds, *, include_abi_only=True, ifdef=None):
"""Yield selected items of the manifest
@@ -81,7 +73,7 @@ class Manifest:
stable ABI.
If False, include only items from the limited API
(i.e. items people should use today)
- ifdef: set of feature defines (e.g. {'HAVE_FORK', 'MS_WINDOWS'}).
+ ifdef: set of feature macros (e.g. {'HAVE_FORK', 'MS_WINDOWS'}).
If None (default), items are not filtered by this. (This is
different from the empty set, which filters out all such
conditional items.)
@@ -99,109 +91,74 @@ class Manifest:
def dump(self):
"""Yield lines to recreate the manifest file (sans comments/newlines)"""
- # Recursive in preparation for struct member & function argument nodes
for item in self.contents.values():
- yield from item.dump(indent=0)
-
+ fields = dataclasses.fields(item)
+ yield f"[{item.kind}.{item.name}]"
+ for field in fields:
+ if field.name in {'name', 'value', 'kind'}:
+ continue
+ value = getattr(item, field.name)
+ if value == field.default:
+ pass
+ elif value is True:
+ yield f" {field.name} = true"
+ elif value:
+ yield f" {field.name} = {value!r}"
+
+
+itemclasses = {}
+def itemclass(kind):
+ """Register the decorated class in `itemclasses`"""
+ def decorator(cls):
+ itemclasses[kind] = cls
+ return cls
+ return decorator
+
+@itemclass('function')
+@itemclass('macro')
+@itemclass('data')
+@itemclass('const')
+@itemclass('typedef')
@dataclasses.dataclass
class ABIItem:
"""Information on one item (function, macro, struct, etc.)"""
- kind: str
name: str
+ kind: str
added: str = None
- contents: list = dataclasses.field(default_factory=list)
abi_only: bool = False
ifdef: str = None
- struct_abi_kind: str = None
- members: list = None
- doc: str = None
+
+@itemclass('feature_macro')
+@dataclasses.dataclass(kw_only=True)
+class FeatureMacro(ABIItem):
+ name: str
+ doc: str
windows: bool = False
+ abi_only: bool = True
- KINDS = frozenset({
- 'struct', 'function', 'macro', 'data', 'const', 'typedef', 'ifdef',
- })
+@itemclass('struct')
+@dataclasses.dataclass(kw_only=True)
+class Struct(ABIItem):
+ struct_abi_kind: str
+ members: list = None
- def dump(self, indent=0):
- yield f"{' ' * indent}{self.kind} {self.name}"
- if self.added:
- yield f"{' ' * (indent+1)}added {self.added}"
- if self.ifdef:
- yield f"{' ' * (indent+1)}ifdef {self.ifdef}"
- if self.abi_only:
- yield f"{' ' * (indent+1)}abi_only"
def parse_manifest(file):
"""Parse the given file (iterable of lines) to a Manifest"""
- LINE_RE = re.compile('(?P<indent>[ ]*)(?P<kind>[^ ]+)[ ]*(?P<content>.*)')
manifest = Manifest()
- # parents of currently processed line, each with its indentation level
- levels = [(manifest, -1)]
+ data = tomllib.load(file)
- def raise_error(msg):
- raise SyntaxError(f'line {lineno}: {msg}')
-
- for lineno, line in enumerate(file, start=1):
- line, sep, comment = line.partition('#')
- line = line.rstrip()
- if not line:
- continue
- match = LINE_RE.fullmatch(line)
- if not match:
- raise_error(f'invalid syntax: {line}')
- level = len(match['indent'])
- kind = match['kind']
- content = match['content']
- while level <= levels[-1][1]:
- levels.pop()
- parent = levels[-1][0]
- entry = None
- if parent.kind == 'manifest':
- if kind not in kind in ABIItem.KINDS:
- raise_error(f'{kind} cannot go in {parent.kind}')
- entry = ABIItem(kind, content)
- parent.add(entry)
- elif kind in {'added', 'ifdef'}:
- if parent.kind not in ABIItem.KINDS:
- raise_error(f'{kind} cannot go in {parent.kind}')
- setattr(parent, kind, content)
- elif kind in {'abi_only'}:
- if parent.kind not in {'function', 'data'}:
- raise_error(f'{kind} cannot go in {parent.kind}')
- parent.abi_only = True
- elif kind in {'members', 'full-abi', 'opaque'}:
- if parent.kind not in {'struct'}:
- raise_error(f'{kind} cannot go in {parent.kind}')
- if prev := getattr(parent, 'struct_abi_kind', None):
- raise_error(
- f'{parent.name} already has {prev}, cannot add {kind}')
- parent.struct_abi_kind = kind
- if kind == 'members':
- parent.members = content.split()
- elif kind in {'doc'}:
- if parent.kind not in {'ifdef'}:
- raise_error(f'{kind} cannot go in {parent.kind}')
- parent.doc = content
- elif kind in {'windows'}:
- if parent.kind not in {'ifdef'}:
- raise_error(f'{kind} cannot go in {parent.kind}')
- if not content:
- parent.windows = True
- elif content == 'maybe':
- parent.windows = content
- else:
- raise_error(f'Unexpected: {content}')
- else:
- raise_error(f"unknown kind {kind!r}")
- # When adding more, update the comment in stable_abi.txt.
- levels.append((entry, level))
-
- ifdef_names = {i.name for i in manifest.select({'ifdef'})}
- for item in manifest.contents.values():
- if item.ifdef and item.ifdef not in ifdef_names:
- raise ValueError(f'{item.name} uses undeclared ifdef {item.ifdef}')
+ for kind, itemclass in itemclasses.items():
+ for name, item_data in data[kind].items():
+ try:
+ item = itemclass(name=name, kind=kind, **item_data)
+ manifest.add(item)
+ except BaseException as exc:
+ exc.add_note(f'in {kind} {name}')
+ raise
return manifest
@@ -246,12 +203,14 @@ def gen_python3dll(manifest, args, outfile):
def sort_key(item):
return item.name.lower()
- windows_ifdefs = {
- item.name for item in manifest.select({'ifdef'}) if item.windows
+ windows_feature_macros = {
+ item.name for item in manifest.select({'feature_macro'}) if item.windows
}
for item in sorted(
manifest.select(
- {'function'}, include_abi_only=True, ifdef=windows_ifdefs),
+ {'function'},
+ include_abi_only=True,
+ ifdef=windows_feature_macros),
key=sort_key):
write(f'EXPORT_FUNC({item.name})')
@@ -259,7 +218,9 @@ def gen_python3dll(manifest, args, outfile):
for item in sorted(
manifest.select(
- {'data'}, include_abi_only=True, ifdef=windows_ifdefs),
+ {'data'},
+ include_abi_only=True,
+ ifdef=windows_feature_macros),
key=sort_key):
write(f'EXPORT_DATA({item.name})')
@@ -285,17 +246,20 @@ def gen_doc_annotations(manifest, args, outfile):
ifdef_note = manifest.contents[item.ifdef].doc
else:
ifdef_note = None
- writer.writerow({
+ row = {
'role': REST_ROLES[item.kind],
'name': item.name,
'added': item.added,
- 'ifdef_note': ifdef_note,
- 'struct_abi_kind': item.struct_abi_kind})
- for member_name in item.members or ():
- writer.writerow({
- 'role': 'member',
- 'name': f'{item.name}.{member_name}',
- 'added': item.added})
+ 'ifdef_note': ifdef_note}
+ rows = [row]
+ if item.kind == 'struct':
+ row['struct_abi_kind'] = item.struct_abi_kind
+ for member_name in item.members or ():
+ rows.append({
+ 'role': 'member',
+ 'name': f'{item.name}.{member_name}',
+ 'added': item.added})
+ writer.writerows(rows)
@generator("ctypes_test", 'Lib/test/test_stable_abi_ctypes.py')
def gen_ctypes_test(manifest, args, outfile):
@@ -323,7 +287,8 @@ def gen_ctypes_test(manifest, args, outfile):
ctypes_test.pythonapi[symbol_name]
def test_feature_macros(self):
- self.assertEqual(set(get_feature_macros()), EXPECTED_IFDEFS)
+ self.assertEqual(
+ set(get_feature_macros()), EXPECTED_FEATURE_MACROS)
# The feature macros for Windows are used in creating the DLL
# definition, so they must be known on all platforms.
@@ -331,7 +296,7 @@ def gen_ctypes_test(manifest, args, outfile):
# the reality.
@unittest.skipIf(sys.platform != "win32", "Windows specific test")
def test_windows_feature_macros(self):
- for name, value in WINDOWS_IFDEFS.items():
+ for name, value in WINDOWS_FEATURE_MACROS.items():
if value != 'maybe':
with self.subTest(name):
self.assertEqual(feature_macros[name], value)
@@ -342,7 +307,7 @@ def gen_ctypes_test(manifest, args, outfile):
{'function', 'data'},
include_abi_only=True,
)
- ifdef_items = {}
+ optional_items = {}
for item in items:
if item.name in (
# Some symbols aren't exported on all platforms.
@@ -351,23 +316,23 @@ def gen_ctypes_test(manifest, args, outfile):
):
continue
if item.ifdef:
- ifdef_items.setdefault(item.ifdef, []).append(item.name)
+ optional_items.setdefault(item.ifdef, []).append(item.name)
else:
write(f' "{item.name}",')
write(")")
- for ifdef, names in ifdef_items.items():
+ for ifdef, names in optional_items.items():
write(f"if feature_macros[{ifdef!r}]:")
write(f" SYMBOL_NAMES += (")
for name in names:
write(f" {name!r},")
write(" )")
write("")
- write(f"EXPECTED_IFDEFS = set({sorted(ifdef_items)})")
+ feature_macros = list(manifest.select({'feature_macro'}))
+ feature_names = sorted(m.name for m in feature_macros)
+ write(f"EXPECTED_FEATURE_MACROS = set({pprint.pformat(feature_names)})")
- windows_ifdef_values = {
- name: manifest.contents[name].windows for name in ifdef_items
- }
- write(f"WINDOWS_IFDEFS = {windows_ifdef_values}")
+ windows_feature_macros = {m.name: m.windows for m in feature_macros}
+ write(f"WINDOWS_FEATURE_MACROS = {pprint.pformat(windows_feature_macros)}")
@generator("testcapi_feature_macros", 'Modules/_testcapi_feature_macros.inc')
@@ -378,7 +343,7 @@ def gen_testcapi_feature_macros(manifest, args, outfile):
write()
write('// Add an entry in dict `result` for each Stable ABI feature macro.')
write()
- for macro in manifest.select({'ifdef'}):
+ for macro in manifest.select({'feature_macro'}):
name = macro.name
write(f'#ifdef {name}')
write(f' res = PyDict_SetItemString(result, "{name}", Py_True);')
@@ -425,7 +390,8 @@ def do_unixy_check(manifest, args):
# Get all macros first: we'll need feature macros like HAVE_FORK and
# MS_WINDOWS for everything else
present_macros = gcc_get_limited_api_macros(['Include/Python.h'])
- feature_defines = manifest.feature_defines & present_macros
+ feature_macros = set(m.name for m in manifest.select({'feature_macro'}))
+ feature_macros &= present_macros
# Check that we have all needed macros
expected_macros = set(
@@ -438,7 +404,7 @@ def do_unixy_check(manifest, args):
+ 'with Py_LIMITED_API:')
expected_symbols = set(item.name for item in manifest.select(
- {'function', 'data'}, include_abi_only=True, ifdef=feature_defines,
+ {'function', 'data'}, include_abi_only=True, ifdef=feature_macros,
))
# Check the static library (*.a)
@@ -458,7 +424,7 @@ def do_unixy_check(manifest, args):
# Check definitions in the header files
expected_defs = set(item.name for item in manifest.select(
- {'function', 'data'}, include_abi_only=False, ifdef=feature_defines,
+ {'function', 'data'}, include_abi_only=False, ifdef=feature_macros,
))
found_defs = gcc_get_limited_api_definitions(['Include/Python.h'])
missing_defs = expected_defs - found_defs
@@ -635,6 +601,28 @@ def check_private_names(manifest):
f'`{name}` is private (underscore-prefixed) and should be '
+ 'removed from the stable ABI list or or marked `abi_only`')
+def check_dump(manifest, filename):
+ """Check that manifest.dump() corresponds to the data.
+
+ Mainly useful when debugging this script.
+ """
+ dumped = tomllib.loads('\n'.join(manifest.dump()))
+ with filename.open('rb') as file:
+ from_file = tomllib.load(file)
+ if dumped != from_file:
+ print(f'Dump differs from loaded data!', file=sys.stderr)
+ diff = difflib.unified_diff(
+ pprint.pformat(dumped).splitlines(),
+ pprint.pformat(from_file).splitlines(),
+ '<dumped>', str(filename),
+ lineterm='',
+ )
+ for line in diff:
+ print(line, file=sys.stderr)
+ return False
+ else:
+ return True
+
def main():
parser = argparse.ArgumentParser(
description=__doc__,
@@ -696,7 +684,16 @@ def main():
run_all_generators = True
args.unixy_check = True
- with args.file.open() as file:
+ try:
+ file = args.file.open('rb')
+ except FileNotFoundError as err:
+ if args.file.suffix == '.txt':
+ # Provide a better error message
+ suggestion = args.file.with_suffix('.toml')
+ raise FileNotFoundError(
+ f'{args.file} not found. Did you mean {suggestion} ?') from err
+ raise
+ with file:
manifest = parse_manifest(file)
check_private_names(manifest)
@@ -709,7 +706,7 @@ def main():
if args.dump:
for line in manifest.dump():
print(line)
- results['dump'] = True
+ results['dump'] = check_dump(manifest, args.file)
for gen in generators:
filename = getattr(args, gen.var_name)