diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 311e216e506..18c85061ca0 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -20,7 +20,8 @@ class TestStableABIAvailability(unittest.TestCase): ctypes_test.pythonapi[symbol_name] def test_feature_macros(self): - self.assertEqual(set(get_feature_macros()), EXPECTED_IFDEFS) + self.assertEqual( + set(get_feature_macros()), EXPECTED_FEATURE_MACROS) # The feature macros for Windows are used in creating the DLL # definition, so they must be known on all platforms. @@ -28,7 +29,7 @@ class TestStableABIAvailability(unittest.TestCase): # the reality. @unittest.skipIf(sys.platform != "win32", "Windows specific test") def test_windows_feature_macros(self): - for name, value in WINDOWS_IFDEFS.items(): + for name, value in WINDOWS_FEATURE_MACROS.items(): if value != 'maybe': with self.subTest(name): self.assertEqual(feature_macros[name], value) @@ -909,5 +910,13 @@ if feature_macros['Py_REF_DEBUG']: '_Py_RefTotal', ) -EXPECTED_IFDEFS = set(['HAVE_FORK', 'MS_WINDOWS', 'PY_HAVE_THREAD_NATIVE_ID', 'Py_REF_DEBUG', 'USE_STACKCHECK']) -WINDOWS_IFDEFS = {'MS_WINDOWS': True, 'HAVE_FORK': False, 'USE_STACKCHECK': 'maybe', 'PY_HAVE_THREAD_NATIVE_ID': True, 'Py_REF_DEBUG': 'maybe'} +EXPECTED_FEATURE_MACROS = set(['HAVE_FORK', + 'MS_WINDOWS', + 'PY_HAVE_THREAD_NATIVE_ID', + 'Py_REF_DEBUG', + 'USE_STACKCHECK']) +WINDOWS_FEATURE_MACROS = {'HAVE_FORK': False, + 'MS_WINDOWS': True, + 'PY_HAVE_THREAD_NATIVE_ID': True, + 'Py_REF_DEBUG': 'maybe', + 'USE_STACKCHECK': 'maybe'} diff --git a/Makefile.pre.in b/Makefile.pre.in index c12305aed6a..e45d4fe3ecb 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 00000000000..e34bfcd0b61 --- /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 9b1c87ea8f4..00000000000 --- 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 54075248c7e..f5a9f8d2dd6 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -14,8 +14,10 @@ import subprocess import sysconfig import argparse import textwrap +import tomllib import difflib import shutil +import pprint import sys import os import os.path @@ -46,17 +48,15 @@ MACOS = (sys.platform == "darwin") UNIXY = MACOS or (sys.platform == "linux") # XXX should this be "not Windows"? -# The stable ABI manifest (Misc/stable_abi.txt) exists only to fill the +# The stable ABI manifest (Misc/stable_abi.toml) exists only to fill the # following dataclasses. # Feel free to change its syntax (and the `parse_manifest` function) # to better serve that purpose (while keeping it human-readable). -@dataclasses.dataclass class Manifest: """Collection of `ABIItem`s forming the stable ABI/limited API.""" - - kind = 'manifest' - contents: dict = dataclasses.field(default_factory=dict) + def __init__(self): + self.contents = dict() def add(self, item): if item.name in self.contents: @@ -65,14 +65,6 @@ class Manifest: raise ValueError(f'duplicate ABI item {item.name}') self.contents[item.name] = item - @property - def feature_defines(self): - """Return all feature defines which affect what's available - - These are e.g. HAVE_FORK and MS_WINDOWS. - """ - return set(item.ifdef for item in self.contents.values()) - {None} - def select(self, kinds, *, include_abi_only=True, ifdef=None): """Yield selected items of the manifest @@ -81,7 +73,7 @@ class Manifest: stable ABI. If False, include only items from the limited API (i.e. items people should use today) - ifdef: set of feature defines (e.g. {'HAVE_FORK', 'MS_WINDOWS'}). + ifdef: set of feature macros (e.g. {'HAVE_FORK', 'MS_WINDOWS'}). If None (default), items are not filtered by this. (This is different from the empty set, which filters out all such conditional items.) @@ -99,109 +91,74 @@ class Manifest: def dump(self): """Yield lines to recreate the manifest file (sans comments/newlines)""" - # Recursive in preparation for struct member & function argument nodes for item in self.contents.values(): - yield from item.dump(indent=0) + fields = dataclasses.fields(item) + yield f"[{item.kind}.{item.name}]" + for field in fields: + if field.name in {'name', 'value', 'kind'}: + continue + value = getattr(item, field.name) + if value == field.default: + pass + elif value is True: + yield f" {field.name} = true" + elif value: + yield f" {field.name} = {value!r}" + +itemclasses = {} +def itemclass(kind): + """Register the decorated class in `itemclasses`""" + def decorator(cls): + itemclasses[kind] = cls + return cls + return decorator + +@itemclass('function') +@itemclass('macro') +@itemclass('data') +@itemclass('const') +@itemclass('typedef') @dataclasses.dataclass class ABIItem: """Information on one item (function, macro, struct, etc.)""" - kind: str name: str + kind: str added: str = None - contents: list = dataclasses.field(default_factory=list) abi_only: bool = False ifdef: str = None - struct_abi_kind: str = None - members: list = None - doc: str = None + +@itemclass('feature_macro') +@dataclasses.dataclass(kw_only=True) +class FeatureMacro(ABIItem): + name: str + doc: str windows: bool = False + abi_only: bool = True - KINDS = frozenset({ - 'struct', 'function', 'macro', 'data', 'const', 'typedef', 'ifdef', - }) +@itemclass('struct') +@dataclasses.dataclass(kw_only=True) +class Struct(ABIItem): + struct_abi_kind: str + members: list = None - def dump(self, indent=0): - yield f"{' ' * indent}{self.kind} {self.name}" - if self.added: - yield f"{' ' * (indent+1)}added {self.added}" - if self.ifdef: - yield f"{' ' * (indent+1)}ifdef {self.ifdef}" - if self.abi_only: - yield f"{' ' * (indent+1)}abi_only" def parse_manifest(file): """Parse the given file (iterable of lines) to a Manifest""" - LINE_RE = re.compile('(?P[ ]*)(?P[^ ]+)[ ]*(?P.*)') manifest = Manifest() - # parents of currently processed line, each with its indentation level - levels = [(manifest, -1)] + data = tomllib.load(file) - def raise_error(msg): - raise SyntaxError(f'line {lineno}: {msg}') - - for lineno, line in enumerate(file, start=1): - line, sep, comment = line.partition('#') - line = line.rstrip() - if not line: - continue - match = LINE_RE.fullmatch(line) - if not match: - raise_error(f'invalid syntax: {line}') - level = len(match['indent']) - kind = match['kind'] - content = match['content'] - while level <= levels[-1][1]: - levels.pop() - parent = levels[-1][0] - entry = None - if parent.kind == 'manifest': - if kind not in kind in ABIItem.KINDS: - raise_error(f'{kind} cannot go in {parent.kind}') - entry = ABIItem(kind, content) - parent.add(entry) - elif kind in {'added', 'ifdef'}: - if parent.kind not in ABIItem.KINDS: - raise_error(f'{kind} cannot go in {parent.kind}') - setattr(parent, kind, content) - elif kind in {'abi_only'}: - if parent.kind not in {'function', 'data'}: - raise_error(f'{kind} cannot go in {parent.kind}') - parent.abi_only = True - elif kind in {'members', 'full-abi', 'opaque'}: - if parent.kind not in {'struct'}: - raise_error(f'{kind} cannot go in {parent.kind}') - if prev := getattr(parent, 'struct_abi_kind', None): - raise_error( - f'{parent.name} already has {prev}, cannot add {kind}') - parent.struct_abi_kind = kind - if kind == 'members': - parent.members = content.split() - elif kind in {'doc'}: - if parent.kind not in {'ifdef'}: - raise_error(f'{kind} cannot go in {parent.kind}') - parent.doc = content - elif kind in {'windows'}: - if parent.kind not in {'ifdef'}: - raise_error(f'{kind} cannot go in {parent.kind}') - if not content: - parent.windows = True - elif content == 'maybe': - parent.windows = content - else: - raise_error(f'Unexpected: {content}') - else: - raise_error(f"unknown kind {kind!r}") - # When adding more, update the comment in stable_abi.txt. - levels.append((entry, level)) - - ifdef_names = {i.name for i in manifest.select({'ifdef'})} - for item in manifest.contents.values(): - if item.ifdef and item.ifdef not in ifdef_names: - raise ValueError(f'{item.name} uses undeclared ifdef {item.ifdef}') + for kind, itemclass in itemclasses.items(): + for name, item_data in data[kind].items(): + try: + item = itemclass(name=name, kind=kind, **item_data) + manifest.add(item) + except BaseException as exc: + exc.add_note(f'in {kind} {name}') + raise return manifest @@ -246,12 +203,14 @@ def gen_python3dll(manifest, args, outfile): def sort_key(item): return item.name.lower() - windows_ifdefs = { - item.name for item in manifest.select({'ifdef'}) if item.windows + windows_feature_macros = { + item.name for item in manifest.select({'feature_macro'}) if item.windows } for item in sorted( manifest.select( - {'function'}, include_abi_only=True, ifdef=windows_ifdefs), + {'function'}, + include_abi_only=True, + ifdef=windows_feature_macros), key=sort_key): write(f'EXPORT_FUNC({item.name})') @@ -259,7 +218,9 @@ def gen_python3dll(manifest, args, outfile): for item in sorted( manifest.select( - {'data'}, include_abi_only=True, ifdef=windows_ifdefs), + {'data'}, + include_abi_only=True, + ifdef=windows_feature_macros), key=sort_key): write(f'EXPORT_DATA({item.name})') @@ -285,17 +246,20 @@ def gen_doc_annotations(manifest, args, outfile): ifdef_note = manifest.contents[item.ifdef].doc else: ifdef_note = None - writer.writerow({ + row = { 'role': REST_ROLES[item.kind], 'name': item.name, 'added': item.added, - 'ifdef_note': ifdef_note, - 'struct_abi_kind': item.struct_abi_kind}) - for member_name in item.members or (): - writer.writerow({ - 'role': 'member', - 'name': f'{item.name}.{member_name}', - 'added': item.added}) + 'ifdef_note': ifdef_note} + rows = [row] + if item.kind == 'struct': + row['struct_abi_kind'] = item.struct_abi_kind + for member_name in item.members or (): + rows.append({ + 'role': 'member', + 'name': f'{item.name}.{member_name}', + 'added': item.added}) + writer.writerows(rows) @generator("ctypes_test", 'Lib/test/test_stable_abi_ctypes.py') def gen_ctypes_test(manifest, args, outfile): @@ -323,7 +287,8 @@ def gen_ctypes_test(manifest, args, outfile): ctypes_test.pythonapi[symbol_name] def test_feature_macros(self): - self.assertEqual(set(get_feature_macros()), EXPECTED_IFDEFS) + self.assertEqual( + set(get_feature_macros()), EXPECTED_FEATURE_MACROS) # The feature macros for Windows are used in creating the DLL # definition, so they must be known on all platforms. @@ -331,7 +296,7 @@ def gen_ctypes_test(manifest, args, outfile): # the reality. @unittest.skipIf(sys.platform != "win32", "Windows specific test") def test_windows_feature_macros(self): - for name, value in WINDOWS_IFDEFS.items(): + for name, value in WINDOWS_FEATURE_MACROS.items(): if value != 'maybe': with self.subTest(name): self.assertEqual(feature_macros[name], value) @@ -342,7 +307,7 @@ def gen_ctypes_test(manifest, args, outfile): {'function', 'data'}, include_abi_only=True, ) - ifdef_items = {} + optional_items = {} for item in items: if item.name in ( # Some symbols aren't exported on all platforms. @@ -351,23 +316,23 @@ def gen_ctypes_test(manifest, args, outfile): ): continue if item.ifdef: - ifdef_items.setdefault(item.ifdef, []).append(item.name) + optional_items.setdefault(item.ifdef, []).append(item.name) else: write(f' "{item.name}",') write(")") - for ifdef, names in ifdef_items.items(): + for ifdef, names in optional_items.items(): write(f"if feature_macros[{ifdef!r}]:") write(f" SYMBOL_NAMES += (") for name in names: write(f" {name!r},") write(" )") write("") - write(f"EXPECTED_IFDEFS = set({sorted(ifdef_items)})") + feature_macros = list(manifest.select({'feature_macro'})) + feature_names = sorted(m.name for m in feature_macros) + write(f"EXPECTED_FEATURE_MACROS = set({pprint.pformat(feature_names)})") - windows_ifdef_values = { - name: manifest.contents[name].windows for name in ifdef_items - } - write(f"WINDOWS_IFDEFS = {windows_ifdef_values}") + windows_feature_macros = {m.name: m.windows for m in feature_macros} + write(f"WINDOWS_FEATURE_MACROS = {pprint.pformat(windows_feature_macros)}") @generator("testcapi_feature_macros", 'Modules/_testcapi_feature_macros.inc') @@ -378,7 +343,7 @@ def gen_testcapi_feature_macros(manifest, args, outfile): write() write('// Add an entry in dict `result` for each Stable ABI feature macro.') write() - for macro in manifest.select({'ifdef'}): + for macro in manifest.select({'feature_macro'}): name = macro.name write(f'#ifdef {name}') write(f' res = PyDict_SetItemString(result, "{name}", Py_True);') @@ -425,7 +390,8 @@ def do_unixy_check(manifest, args): # Get all macros first: we'll need feature macros like HAVE_FORK and # MS_WINDOWS for everything else present_macros = gcc_get_limited_api_macros(['Include/Python.h']) - feature_defines = manifest.feature_defines & present_macros + feature_macros = set(m.name for m in manifest.select({'feature_macro'})) + feature_macros &= present_macros # Check that we have all needed macros expected_macros = set( @@ -438,7 +404,7 @@ def do_unixy_check(manifest, args): + 'with Py_LIMITED_API:') expected_symbols = set(item.name for item in manifest.select( - {'function', 'data'}, include_abi_only=True, ifdef=feature_defines, + {'function', 'data'}, include_abi_only=True, ifdef=feature_macros, )) # Check the static library (*.a) @@ -458,7 +424,7 @@ def do_unixy_check(manifest, args): # Check definitions in the header files expected_defs = set(item.name for item in manifest.select( - {'function', 'data'}, include_abi_only=False, ifdef=feature_defines, + {'function', 'data'}, include_abi_only=False, ifdef=feature_macros, )) found_defs = gcc_get_limited_api_definitions(['Include/Python.h']) missing_defs = expected_defs - found_defs @@ -635,6 +601,28 @@ def check_private_names(manifest): f'`{name}` is private (underscore-prefixed) and should be ' + 'removed from the stable ABI list or or marked `abi_only`') +def check_dump(manifest, filename): + """Check that manifest.dump() corresponds to the data. + + Mainly useful when debugging this script. + """ + dumped = tomllib.loads('\n'.join(manifest.dump())) + with filename.open('rb') as file: + from_file = tomllib.load(file) + if dumped != from_file: + print(f'Dump differs from loaded data!', file=sys.stderr) + diff = difflib.unified_diff( + pprint.pformat(dumped).splitlines(), + pprint.pformat(from_file).splitlines(), + '', 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)