[Python-checkins] gh-91324: Convert the stable ABI manifest to TOML (GH-92026)

encukou webhook-mailer at python.org
Fri Apr 29 10:18:18 EDT 2022


https://github.com/python/cpython/commit/83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df
commit: 83bce8ef14ee5546cb3d60f398f0cbb04bd3d9df
branch: main
author: Petr Viktorin <encukou at gmail.com>
committer: encukou <encukou at gmail.com>
date: 2022-04-29T16:18:08+02:00
summary:

gh-91324: Convert the stable ABI manifest to TOML (GH-92026)

files:
A Misc/stable_abi.toml
D Misc/stable_abi.txt
M Lib/test/test_stable_abi_ctypes.py
M Makefile.pre.in
M Tools/scripts/stable_abi.py

diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py
index 311e216e5066c8..18c85061ca0893 100644
--- a/Lib/test/test_stable_abi_ctypes.py
+++ b/Lib/test/test_stable_abi_ctypes.py
@@ -20,7 +20,8 @@ def test_available_symbols(self):
                 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 @@ def test_feature_macros(self):
     # 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 @@ def test_windows_feature_macros(self):
         '_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 c12305aed6a118..e45d4fe3ecb6ea 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 00000000000000..e34bfcd0b61733
--- /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 9b1c87ea8f4f17..00000000000000
--- 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 54075248c7ea21..f5a9f8d2dd617b 100755
--- a/Tools/scripts/stable_abi.py
+++ b/Tools/scripts/stable_abi.py
@@ -14,8 +14,10 @@
 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 @@
 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).
 
- at 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 @@ def add(self, item):
             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 @@ def select(self, kinds, *, include_abi_only=True, ifdef=None):
             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 @@ def select(self, kinds, *, include_abi_only=True, ifdef=None):
 
     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
+
+ at itemclass('function')
+ at itemclass('macro')
+ at itemclass('data')
+ at itemclass('const')
+ at 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
+
+ at itemclass('feature_macro')
+ at 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',
-    })
+ at itemclass('struct')
+ at 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 sort_key(item):
 
     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 test_available_symbols(self):
                         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 test_feature_macros(self):
             # 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 test_windows_feature_macros(self):
         {'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 test_windows_feature_macros(self):
             ):
             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)



More information about the Python-checkins mailing list