diff options
-rw-r--r-- | Doc/data/stable_abi.dat | 171 | ||||
-rw-r--r-- | Makefile.pre.in | 7 | ||||
-rw-r--r-- | Misc/NEWS.d/next/C API/2021-04-09-18-19-07.bpo-43795.l0yobT.rst | 2 | ||||
-rw-r--r-- | Misc/stable_abi.txt | 2144 | ||||
-rwxr-xr-x[-rw-r--r--] | PC/python3dll.c | 63 | ||||
-rw-r--r-- | Tools/scripts/README | 1 | ||||
-rwxr-xr-x | Tools/scripts/stable_abi.py | 595 |
7 files changed, 2844 insertions, 139 deletions
diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 491a5fb..833228f 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -1,5 +1,13 @@ -# File generated by 'make regen-limited-abi' -# This is NOT an authoritative list of stable ABI symbols +# Generated by Tools/scripts/stable_abi.py + +METH_CLASS +METH_COEXIST +METH_FASTCALL +METH_METHOD +METH_NOARGS +METH_O +METH_STATIC +METH_VARARGS PyAiter_Check PyArg_Parse PyArg_ParseTuple @@ -33,6 +41,8 @@ PyBytes_FromStringAndSize PyBytes_Repr PyBytes_Size PyBytes_Type +PyCFunction +PyCFunctionWithKeywords PyCFunction_Call PyCFunction_GetFlags PyCFunction_GetFunction @@ -44,6 +54,7 @@ PyCMethod_New PyCallIter_New PyCallIter_Type PyCallable_Check +PyCapsule_Destructor PyCapsule_GetContext PyCapsule_GetDestructor PyCapsule_GetName @@ -138,11 +149,17 @@ PyErr_PrintEx PyErr_ProgramText PyErr_ResourceWarning PyErr_Restore +PyErr_SetExcFromWindowsErr +PyErr_SetExcFromWindowsErrWithFilename +PyErr_SetExcFromWindowsErrWithFilenameObject +PyErr_SetExcFromWindowsErrWithFilenameObjects PyErr_SetExcInfo PyErr_SetFromErrno PyErr_SetFromErrnoWithFilename PyErr_SetFromErrnoWithFilenameObject PyErr_SetFromErrnoWithFilenameObjects +PyErr_SetFromWindowsErr +PyErr_SetFromWindowsErrWithFilename PyErr_SetImportError PyErr_SetImportErrorSubclass PyErr_SetInterrupt @@ -243,6 +260,7 @@ PyExc_UnicodeWarning PyExc_UserWarning PyExc_ValueError PyExc_Warning +PyExc_WindowsError PyExc_ZeroDivisionError PyExceptionClass_Name PyException_GetCause @@ -274,6 +292,8 @@ PyGC_IsEnabled PyGILState_Ensure PyGILState_GetThisThreadState PyGILState_Release +PyGILState_STATE +PyGetSetDef PyGetSetDescr_Type PyImport_AddModule PyImport_AddModuleObject @@ -296,6 +316,7 @@ PyImport_ImportModuleLevelObject PyImport_ImportModuleNoBlock PyImport_ReloadModule PyIndex_Check +PyInterpreterState PyInterpreterState_Clear PyInterpreterState_Delete PyInterpreterState_Get @@ -319,6 +340,7 @@ PyList_SetSlice PyList_Size PyList_Sort PyList_Type +PyLongObject PyLongRangeIter_Type PyLong_AsDouble PyLong_AsLong @@ -358,12 +380,16 @@ PyMem_Calloc PyMem_Free PyMem_Malloc PyMem_Realloc +PyMemberDef PyMemberDescr_Type PyMemoryView_FromMemory PyMemoryView_FromObject PyMemoryView_GetContiguous PyMemoryView_Type +PyMethodDef PyMethodDescr_Type +PyModuleDef +PyModuleDef_Base PyModuleDef_Init PyModuleDef_Type PyModule_AddFunctions @@ -427,18 +453,22 @@ PyOS_AfterFork PyOS_AfterFork_Child PyOS_AfterFork_Parent PyOS_BeforeFork +PyOS_CheckStack PyOS_FSPath +PyOS_InputHook PyOS_InterruptOccurred PyOS_double_to_string PyOS_getsig PyOS_mystricmp PyOS_mystrnicmp PyOS_setsig +PyOS_sighandler_t PyOS_snprintf PyOS_string_to_double PyOS_strtol PyOS_strtoul PyOS_vsnprintf +PyObject PyObject_ASCII PyObject_AsFileDescriptor PyObject_Bytes @@ -537,6 +567,8 @@ PySlice_Unpack PyState_AddModule PyState_FindModule PyState_RemoveModule +PyStructSequence_Desc +PyStructSequence_Field PyStructSequence_GetItem PyStructSequence_New PyStructSequence_NewType @@ -557,6 +589,7 @@ PySys_SetObject PySys_SetPath PySys_WriteStderr PySys_WriteStdout +PyThreadState PyThreadState_Clear PyThreadState_Delete PyThreadState_Get @@ -604,6 +637,7 @@ PyTuple_Pack PyTuple_SetItem PyTuple_Size PyTuple_Type +PyTypeObject PyType_ClearCache PyType_FromModuleAndSpec PyType_FromSpec @@ -617,6 +651,8 @@ PyType_GetSlot PyType_IsSubtype PyType_Modified PyType_Ready +PyType_Slot +PyType_Spec PyType_Type PyUnicodeDecodeError_Create PyUnicodeDecodeError_GetEncoding @@ -653,6 +689,7 @@ PyUnicode_AsEncodedObject PyUnicode_AsEncodedString PyUnicode_AsEncodedUnicode PyUnicode_AsLatin1String +PyUnicode_AsMBCSString PyUnicode_AsRawUnicodeEscapeString PyUnicode_AsUCS4 PyUnicode_AsUCS4Copy @@ -672,11 +709,14 @@ PyUnicode_Count PyUnicode_Decode PyUnicode_DecodeASCII PyUnicode_DecodeCharmap +PyUnicode_DecodeCodePageStateful PyUnicode_DecodeFSDefault PyUnicode_DecodeFSDefaultAndSize PyUnicode_DecodeLatin1 PyUnicode_DecodeLocale PyUnicode_DecodeLocaleAndSize +PyUnicode_DecodeMBCS +PyUnicode_DecodeMBCSStateful PyUnicode_DecodeRawUnicodeEscape PyUnicode_DecodeUTF16 PyUnicode_DecodeUTF16Stateful @@ -687,6 +727,7 @@ PyUnicode_DecodeUTF7Stateful PyUnicode_DecodeUTF8 PyUnicode_DecodeUTF8Stateful PyUnicode_DecodeUnicodeEscape +PyUnicode_EncodeCodePage PyUnicode_EncodeFSDefault PyUnicode_EncodeLocale PyUnicode_FSConverter @@ -724,6 +765,8 @@ PyUnicode_Tailmatch PyUnicode_Translate PyUnicode_Type PyUnicode_WriteChar +PyVarObject +PyWeakReference PyWeakref_GetObject PyWeakref_NewProxy PyWeakref_NewRef @@ -732,11 +775,14 @@ PyWrapper_New PyZip_Type Py_AddPendingCall Py_AtExit +Py_BEGIN_ALLOW_THREADS +Py_BLOCK_THREADS Py_BuildValue Py_BytesMain Py_CompileString Py_DecRef Py_DecodeLocale +Py_END_ALLOW_THREADS Py_EncodeLocale Py_EndInterpreter Py_EnterRecursiveCall @@ -781,6 +827,127 @@ Py_SetPath Py_SetProgramName Py_SetPythonHome Py_SetRecursionLimit +Py_TPFLAGS_BASETYPE +Py_TPFLAGS_DEFAULT +Py_TPFLAGS_HAVE_GC +Py_TPFLAGS_METHOD_DESCRIPTOR +Py_UCS4 +Py_UNBLOCK_THREADS Py_UTF8Mode Py_VaBuildValue Py_XNewRef +Py_am_aiter +Py_am_anext +Py_am_await +Py_am_send +Py_intptr_t +Py_mp_ass_subscript +Py_mp_length +Py_mp_subscript +Py_nb_absolute +Py_nb_add +Py_nb_and +Py_nb_bool +Py_nb_divmod +Py_nb_float +Py_nb_floor_divide +Py_nb_index +Py_nb_inplace_add +Py_nb_inplace_and +Py_nb_inplace_floor_divide +Py_nb_inplace_lshift +Py_nb_inplace_matrix_multiply +Py_nb_inplace_multiply +Py_nb_inplace_or +Py_nb_inplace_power +Py_nb_inplace_remainder +Py_nb_inplace_rshift +Py_nb_inplace_subtract +Py_nb_inplace_true_divide +Py_nb_inplace_xor +Py_nb_int +Py_nb_invert +Py_nb_lshift +Py_nb_matrix_multiply +Py_nb_multiply +Py_nb_negative +Py_nb_or +Py_nb_positive +Py_nb_power +Py_nb_remainder +Py_nb_rshift +Py_nb_subtract +Py_nb_true_divide +Py_nb_xor +Py_sq_ass_item +Py_sq_concat +Py_sq_contains +Py_sq_inplace_concat +Py_sq_inplace_repeat +Py_sq_item +Py_sq_length +Py_sq_repeat +Py_ssize_t +Py_tp_alloc +Py_tp_base +Py_tp_bases +Py_tp_call +Py_tp_clear +Py_tp_dealloc +Py_tp_del +Py_tp_descr_get +Py_tp_descr_set +Py_tp_doc +Py_tp_finalize +Py_tp_free +Py_tp_getattr +Py_tp_getattro +Py_tp_getset +Py_tp_hash +Py_tp_init +Py_tp_is_gc +Py_tp_iter +Py_tp_iternext +Py_tp_members +Py_tp_methods +Py_tp_new +Py_tp_repr +Py_tp_richcompare +Py_tp_setattr +Py_tp_setattro +Py_tp_str +Py_tp_traverse +Py_uintptr_t +_frame +_node +allocfunc +binaryfunc +descrgetfunc +descrsetfunc +destructor +getattrfunc +getattrofunc +getiterfunc +getter +hashfunc +initproc +inquiry +iternextfunc +lenfunc +newfunc +objobjargproc +objobjproc +reprfunc +richcmpfunc +setattrfunc +setattrofunc +setter +ssizeargfunc +ssizeobjargproc +ssizessizeargfunc +ssizessizeobjargproc +symtable +ternaryfunc +traverseproc +unaryfunc +visitproc diff --git a/Makefile.pre.in b/Makefile.pre.in index 4d9b760..72ccbcf 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -752,10 +752,7 @@ regen-importlib: Programs/_freeze_importlib regen-limited-abi: all - @$(MKDIR_P) $(srcdir)/Doc/data/ - $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py generate $(srcdir)/Doc/data/stable_abi.dat.new - $(UPDATE_FILE) $(srcdir)/Doc/data/stable_abi.dat \ - $(srcdir)/Doc/data/stable_abi.dat.new + $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --generate-all $(srcdir)/Misc/stable_abi.txt ############################################################################ @@ -1983,7 +1980,7 @@ patchcheck: @DEF_MAKE_RULE@ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py check-limited-abi: all - $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py check $(srcdir)/Doc/data/stable_abi.dat + $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --all $(srcdir)/Misc/stable_abi.txt # Dependencies diff --git a/Misc/NEWS.d/next/C API/2021-04-09-18-19-07.bpo-43795.l0yobT.rst b/Misc/NEWS.d/next/C API/2021-04-09-18-19-07.bpo-43795.l0yobT.rst new file mode 100644 index 0000000..5153c33 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-04-09-18-19-07.bpo-43795.l0yobT.rst @@ -0,0 +1,2 @@ +Stable ABI and limited API definitions are generated from a central manifest +(:pep:`652`). diff --git a/Misc/stable_abi.txt b/Misc/stable_abi.txt new file mode 100644 index 0000000..efb2731 --- /dev/null +++ b/Misc/stable_abi.txt @@ -0,0 +1,2144 @@ +# 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 + + +# Mentioned in PEP 384: + +struct PyObject + added 3.2 +struct PyVarObject + added 3.2 +struct PyMethodDef + added 3.2 +struct PyMemberDef + added 3.2 +struct PyGetSetDef + added 3.2 +struct PyModuleDef_Base + added 3.2 +struct PyModuleDef + added 3.2 +struct PyStructSequence_Field + added 3.2 +struct PyStructSequence_Desc + added 3.2 +struct PyType_Slot + added 3.2 +struct PyType_Spec + added 3.2 +struct PyThreadState + added 3.2 +struct PyInterpreterState + added 3.2 +struct _frame + added 3.2 +struct symtable + added 3.2 +struct _node + added 3.2 +struct PyWeakReference + added 3.2 +struct PyLongObject + added 3.2 +struct PyTypeObject + added 3.2 + +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 +struct PyCFunction + added 3.2 +struct PyCFunctionWithKeywords + added 3.2 +struct 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 intial 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_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_Malloc + 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 +function _PyTrash_deposit_object + added 3.2 + abi_only +function _PyTrash_destroy_chain + 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 + +# 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 + 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 _PyTrash_thread_deposit_object + added 3.7 # (and 3.6.1 and 3.5.3) + abi_only +function _PyTrash_thread_destroy_chain + added 3.7 # (and 3.6.1 and 3.5.3) + abi_only +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 +function 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 Py_FrozenMain + 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 +data 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 + + +# (Detailed comments aren't really needed for further entries: from here on +# we can use version control logs.) + diff --git a/PC/python3dll.c b/PC/python3dll.c index e5a21ed..a53ec63 100644..100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -1,4 +1,7 @@ -/* Re-export stable Python API */ + +/* Re-export stable Python ABI */ + +/* Generated by Tools/scripts/stable_abi.py */ #ifdef _M_IX86 #define DECORATE "_" @@ -41,6 +44,7 @@ EXPORT_FUNC(_PyTrash_thread_destroy_chain) EXPORT_FUNC(Py_AddPendingCall) EXPORT_FUNC(Py_AtExit) EXPORT_FUNC(Py_BuildValue) +EXPORT_FUNC(Py_BytesMain) EXPORT_FUNC(Py_CompileString) EXPORT_FUNC(Py_DecodeLocale) EXPORT_FUNC(Py_DecRef) @@ -70,7 +74,11 @@ EXPORT_FUNC(Py_GetVersion) EXPORT_FUNC(Py_IncRef) EXPORT_FUNC(Py_Initialize) EXPORT_FUNC(Py_InitializeEx) +EXPORT_FUNC(Py_Is) +EXPORT_FUNC(Py_IsFalse) EXPORT_FUNC(Py_IsInitialized) +EXPORT_FUNC(Py_IsNone) +EXPORT_FUNC(Py_IsTrue) EXPORT_FUNC(Py_LeaveRecursiveCall) EXPORT_FUNC(Py_Main) EXPORT_FUNC(Py_MakePendingCalls) @@ -84,6 +92,7 @@ EXPORT_FUNC(Py_SetPythonHome) EXPORT_FUNC(Py_SetRecursionLimit) EXPORT_FUNC(Py_VaBuildValue) EXPORT_FUNC(Py_XNewRef) +EXPORT_FUNC(PyAiter_Check) EXPORT_FUNC(PyArg_Parse) EXPORT_FUNC(PyArg_ParseTuple) EXPORT_FUNC(PyArg_ParseTupleAndKeywords) @@ -230,14 +239,12 @@ EXPORT_FUNC(PyEval_EvalCodeEx) EXPORT_FUNC(PyEval_EvalFrame) EXPORT_FUNC(PyEval_EvalFrameEx) EXPORT_FUNC(PyEval_GetBuiltins) -EXPORT_FUNC(PyEval_GetCallStats) EXPORT_FUNC(PyEval_GetFrame) EXPORT_FUNC(PyEval_GetFuncDesc) EXPORT_FUNC(PyEval_GetFuncName) EXPORT_FUNC(PyEval_GetGlobals) EXPORT_FUNC(PyEval_GetLocals) EXPORT_FUNC(PyEval_InitThreads) -EXPORT_FUNC(PyEval_ReInitThreads) EXPORT_FUNC(PyEval_ReleaseLock) EXPORT_FUNC(PyEval_ReleaseThread) EXPORT_FUNC(PyEval_RestoreThread) @@ -270,7 +277,6 @@ EXPORT_FUNC(PyGILState_Release) EXPORT_FUNC(PyImport_AddModule) EXPORT_FUNC(PyImport_AddModuleObject) EXPORT_FUNC(PyImport_AppendInittab) -EXPORT_FUNC(PyImport_Cleanup) EXPORT_FUNC(PyImport_ExecCodeModule) EXPORT_FUNC(PyImport_ExecCodeModuleEx) EXPORT_FUNC(PyImport_ExecCodeModuleObject) @@ -291,6 +297,8 @@ EXPORT_FUNC(PyImport_ReloadModule) EXPORT_FUNC(PyIndex_Check) EXPORT_FUNC(PyInterpreterState_Clear) EXPORT_FUNC(PyInterpreterState_Delete) +EXPORT_FUNC(PyInterpreterState_Get) +EXPORT_FUNC(PyInterpreterState_GetDict) EXPORT_FUNC(PyInterpreterState_GetID) EXPORT_FUNC(PyInterpreterState_New) EXPORT_FUNC(PyIter_Check) @@ -339,10 +347,14 @@ EXPORT_FUNC(PyMapping_Length) EXPORT_FUNC(PyMapping_SetItemString) EXPORT_FUNC(PyMapping_Size) EXPORT_FUNC(PyMapping_Values) +EXPORT_FUNC(PyMarshal_ReadObjectFromString) +EXPORT_FUNC(PyMarshal_WriteObjectToString) EXPORT_FUNC(PyMem_Calloc) EXPORT_FUNC(PyMem_Free) EXPORT_FUNC(PyMem_Malloc) EXPORT_FUNC(PyMem_Realloc) +EXPORT_FUNC(PyMember_GetOne) +EXPORT_FUNC(PyMember_SetOne) EXPORT_FUNC(PyMemoryView_FromMemory) EXPORT_FUNC(PyMemoryView_FromObject) EXPORT_FUNC(PyMemoryView_GetContiguous) @@ -421,12 +433,15 @@ EXPORT_FUNC(PyObject_Dir) EXPORT_FUNC(PyObject_Format) EXPORT_FUNC(PyObject_Free) EXPORT_FUNC(PyObject_GC_Del) +EXPORT_FUNC(PyObject_GC_IsFinalized) +EXPORT_FUNC(PyObject_GC_IsTracked) EXPORT_FUNC(PyObject_GC_Track) EXPORT_FUNC(PyObject_GC_UnTrack) EXPORT_FUNC(PyObject_GenericGetAttr) EXPORT_FUNC(PyObject_GenericGetDict) EXPORT_FUNC(PyObject_GenericSetAttr) EXPORT_FUNC(PyObject_GenericSetDict) +EXPORT_FUNC(PyObject_GetAiter) EXPORT_FUNC(PyObject_GetAttr) EXPORT_FUNC(PyObject_GetAttrString) EXPORT_FUNC(PyObject_GetItem) @@ -454,11 +469,6 @@ EXPORT_FUNC(PyObject_SetItem) EXPORT_FUNC(PyObject_Size) EXPORT_FUNC(PyObject_Str) EXPORT_FUNC(PyObject_Type) -EXPORT_FUNC(PyODict_DelItem) -EXPORT_FUNC(PyODict_New) -EXPORT_FUNC(PyODict_SetItem) -EXPORT_FUNC(PyOS_AfterFork) -EXPORT_FUNC(PyOS_CheckStack) EXPORT_FUNC(PyOS_double_to_string) EXPORT_FUNC(PyOS_FSPath) EXPORT_FUNC(PyOS_getsig) @@ -471,9 +481,6 @@ EXPORT_FUNC(PyOS_string_to_double) EXPORT_FUNC(PyOS_strtol) EXPORT_FUNC(PyOS_strtoul) EXPORT_FUNC(PyOS_vsnprintf) -EXPORT_FUNC(PyParser_SimpleParseFileFlags) -EXPORT_FUNC(PyParser_SimpleParseStringFlags) -EXPORT_FUNC(PyParser_SimpleParseStringFlagsFilename) EXPORT_FUNC(PySeqIter_New) EXPORT_FUNC(PySequence_Check) EXPORT_FUNC(PySequence_Concat) @@ -529,6 +536,25 @@ EXPORT_FUNC(PySys_SetObject) EXPORT_FUNC(PySys_SetPath) EXPORT_FUNC(PySys_WriteStderr) EXPORT_FUNC(PySys_WriteStdout) +EXPORT_FUNC(PyThread_acquire_lock) +EXPORT_FUNC(PyThread_acquire_lock_timed) +EXPORT_FUNC(PyThread_allocate_lock) +EXPORT_FUNC(PyThread_create_key) +EXPORT_FUNC(PyThread_delete_key) +EXPORT_FUNC(PyThread_delete_key_value) +EXPORT_FUNC(PyThread_exit_thread) +EXPORT_FUNC(PyThread_free_lock) +EXPORT_FUNC(PyThread_get_key_value) +EXPORT_FUNC(PyThread_get_stacksize) +EXPORT_FUNC(PyThread_get_thread_ident) +EXPORT_FUNC(PyThread_get_thread_native_id) +EXPORT_FUNC(PyThread_GetInfo) +EXPORT_FUNC(PyThread_init_thread) +EXPORT_FUNC(PyThread_ReInitTLS) +EXPORT_FUNC(PyThread_release_lock) +EXPORT_FUNC(PyThread_set_key_value) +EXPORT_FUNC(PyThread_set_stacksize) +EXPORT_FUNC(PyThread_start_new_thread) EXPORT_FUNC(PyThread_tss_alloc) EXPORT_FUNC(PyThread_tss_create) EXPORT_FUNC(PyThread_tss_delete) @@ -688,8 +714,6 @@ EXPORT_DATA(_Py_NoneStruct) EXPORT_DATA(_Py_NotImplementedStruct) EXPORT_DATA(_Py_SwappedOp) EXPORT_DATA(_Py_TrueStruct) -EXPORT_DATA(_PyTrash_delete_later) -EXPORT_DATA(_PyTrash_delete_nesting) EXPORT_DATA(_PyWeakref_CallableProxyType) EXPORT_DATA(_PyWeakref_ProxyType) EXPORT_DATA(_PyWeakref_RefType) @@ -707,6 +731,7 @@ EXPORT_DATA(PyCallIter_Type) EXPORT_DATA(PyCapsule_Type) EXPORT_DATA(PyCFunction_Type) EXPORT_DATA(PyClassMethodDescr_Type) +EXPORT_DATA(PyCodec_Unregister) EXPORT_DATA(PyComplex_Type) EXPORT_DATA(PyDict_Type) EXPORT_DATA(PyDictItems_Type) @@ -715,6 +740,9 @@ EXPORT_DATA(PyDictIterKey_Type) EXPORT_DATA(PyDictIterValue_Type) EXPORT_DATA(PyDictKeys_Type) EXPORT_DATA(PyDictProxy_Type) +EXPORT_DATA(PyDictRevIterItem_Type) +EXPORT_DATA(PyDictRevIterKey_Type) +EXPORT_DATA(PyDictRevIterValue_Type) EXPORT_DATA(PyDictValues_Type) EXPORT_DATA(PyEllipsis_Type) EXPORT_DATA(PyEnum_Type) @@ -801,12 +829,6 @@ EXPORT_DATA(PyMemoryView_Type) EXPORT_DATA(PyMethodDescr_Type) EXPORT_DATA(PyModule_Type) EXPORT_DATA(PyModuleDef_Type) -EXPORT_DATA(PyNullImporter_Type) -EXPORT_DATA(PyODict_Type) -EXPORT_DATA(PyODictItems_Type) -EXPORT_DATA(PyODictIter_Type) -EXPORT_DATA(PyODictKeys_Type) -EXPORT_DATA(PyODictValues_Type) EXPORT_DATA(PyOS_InputHook) EXPORT_DATA(PyProperty_Type) EXPORT_DATA(PyRange_Type) @@ -816,7 +838,6 @@ EXPORT_DATA(PySeqIter_Type) EXPORT_DATA(PySet_Type) EXPORT_DATA(PySetIter_Type) EXPORT_DATA(PySlice_Type) -EXPORT_DATA(PySortWrapper_Type) EXPORT_DATA(PySuper_Type) EXPORT_DATA(PyTraceBack_Type) EXPORT_DATA(PyTuple_Type) diff --git a/Tools/scripts/README b/Tools/scripts/README index 7fc51a1..ba0f662 100644 --- a/Tools/scripts/README +++ b/Tools/scripts/README @@ -58,6 +58,7 @@ reindent-rst.py Fix-up reStructuredText file whitespace rgrep.py Reverse grep through a file (useful for big logfiles) run_tests.py Run the test suite with more sensible default options serve.py Small wsgiref-based web server, used in make serve in Doc +stable_abi.py Stable ABI checks and file generators. suff.py Sort a list of files by suffix texi2html.py Convert GNU texinfo files into HTML untabify.py Replace tabs with spaces in argument files diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 1690cfc..399153d 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -1,13 +1,28 @@ -#!/usr/bin/env python +"""Check the stable ABI manifest or generate files from it +By default, the tool only checks existing files/libraries. +Pass --generate to recreate auto-generated files instead. + +For actions that take a FILENAME, the filename can be left out to use a default +(relative to the manifest file, as they appear in the CPython codebase). +""" + +from functools import partial +from pathlib import Path +import dataclasses +import subprocess +import sysconfig import argparse -import glob +import textwrap +import difflib +import shutil +import sys +import os import os.path -import pathlib +import io import re -import subprocess -import sys -import sysconfig + +MISSING = object() EXCLUDED_HEADERS = { "bytes_methods.h", @@ -27,10 +42,303 @@ EXCLUDED_HEADERS = { "token.h", "ucnhash.h", } - 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 +# 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 add(self, item): + if item.name in self.contents: + # We assume that stable ABI items do not share names, + # even if they're diferent kinds (e.g. function vs. macro). + 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 + + kinds: set of requested kinds, e.g. {'function', 'macro'} + include_abi_only: if True (default), include all items of the + 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'}). + If None (default), items are not filtered by this. (This is + different from the empty set, which filters out all such + conditional items.) + """ + for name, item in sorted(self.contents.items()): + if item.kind not in kinds: + continue + if item.abi_only and not include_abi_only: + continue + if (ifdef is not None + and item.ifdef is not None + and item.ifdef not in ifdef): + continue + yield item + + 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) + +@dataclasses.dataclass +class ABIItem: + """Information on one item (function, macro, struct, etc.)""" + + kind: str + name: str + added: str = None + contents: list = dataclasses.field(default_factory=list) + abi_only: bool = False + ifdef: str = None + + KINDS = frozenset({ + 'struct', 'function', 'macro', 'data', 'const', 'typedef', + }) + + def dump(self, indent=0): + yield f"{' ' * indent}{self.kind} {self.name}" + if self.added: + yield f"{' ' * (indent+1)}added {self.added}" + if self.ifdef: + yield f"{' ' * (indent+1)}ifdef {self.ifdef}" + if self.abi_only: + yield f"{' ' * (indent+1)}abi_only" + +def parse_manifest(file): + """Parse the given file (iterable of lines) to a Manifest""" + + LINE_RE = re.compile('(?P<indent>[ ]*)(?P<kind>[^ ]+)[ ]*(?P<content>.*)') + manifest = Manifest() + + # parents of currently processed line, each with its indentation level + levels = [(manifest, -1)] + + 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 kind in ABIItem.KINDS: + if parent.kind not in {'manifest'}: + 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 + else: + raise_error(f"unknown kind {kind!r}") + levels.append((entry, level)) + return manifest + +# The tool can run individual "actions". +# Most actions are "generators", which generate a single file from the +# manifest. (Checking works by generating a temp file & comparing.) +# Other actions, like "--unixy-check", don't work on a single file. + +generators = [] +def generator(var_name, default_path): + """Decorates a file generator: function that writes to a file""" + def _decorator(func): + func.var_name = var_name + func.arg_name = '--' + var_name.replace('_', '-') + func.default_path = default_path + generators.append(func) + return func + return _decorator + + +@generator("python3dll", 'PC/python3dll.c') +def gen_python3dll(manifest, args, outfile): + """Generate/check the source for the Windows stable ABI library""" + write = partial(print, file=outfile) + write(textwrap.dedent(r""" + /* Re-export stable Python ABI */ + + /* Generated by Tools/scripts/stable_abi.py */ + + #ifdef _M_IX86 + #define DECORATE "_" + #else + #define DECORATE + #endif + + #define EXPORT_FUNC(name) \ + __pragma(comment(linker, "/EXPORT:" DECORATE #name "=" PYTHON_DLL_NAME "." #name)) + #define EXPORT_DATA(name) \ + __pragma(comment(linker, "/EXPORT:" DECORATE #name "=" PYTHON_DLL_NAME "." #name ",DATA")) + """)) + + def sort_key(item): + return item.name.lower() + + for item in sorted( + manifest.select( + {'function'}, include_abi_only=True, ifdef={'MS_WINDOWS'}), + key=sort_key): + write(f'EXPORT_FUNC({item.name})') + + write() + + for item in sorted( + manifest.select( + {'data'}, include_abi_only=True, ifdef={'MS_WINDOWS'}), + key=sort_key): + write(f'EXPORT_DATA({item.name})') + + +@generator("doc_list", 'Doc/data/stable_abi.dat') +def gen_doc_annotations(manifest, args, outfile): + """Generate/check the stable ABI list for documentation annotations""" + write = partial(print, file=outfile) + write("# Generated by Tools/scripts/stable_abi.py") + write() + for item in manifest.select(ABIItem.KINDS, include_abi_only=False): + write(item.name) + + +def generate_or_check(manifest, args, path, func): + """Generate/check a file with a single generator + + Return True if successful; False if a comparison failed. + """ + + outfile = io.StringIO() + func(manifest, args, outfile) + generated = outfile.getvalue() + existing = path.read_text() + + if generated != existing: + if args.generate: + path.write_text(generated) + else: + print(f'File {path} differs from expected!') + diff = difflib.unified_diff( + generated.splitlines(), existing.splitlines(), + str(path), '<expected>', + lineterm='', + ) + for line in diff: + print(line) + return False + return True + + +def do_unixy_check(manifest, args): + """Check headers & library using "Unixy" tools (GCC/clang, binutils)""" + okay = True -def get_exported_symbols(library, dynamic=False): + # 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 + + # Check that we have all neded macros + expected_macros = set( + item.name for item in manifest.select({'macro'}) + ) + missing_macros = expected_macros - present_macros + okay &= _report_unexpected_items( + missing_macros, + 'Some macros from are not defined from "Include/Python.h"' + + 'with Py_LIMITED_API:') + + expected_symbols = set(item.name for item in manifest.select( + {'function', 'data'}, include_abi_only=True, ifdef=feature_defines, + )) + + # Check the static library (*.a) + LIBRARY = sysconfig.get_config_var("LIBRARY") + if not LIBRARY: + raise Exception("failed to get LIBRARY variable from sysconfig") + if os.path.exists(LIBRARY): + okay &= binutils_check_library( + manifest, LIBRARY, expected_symbols, dynamic=False) + + # Check the dynamic library (*.so) + LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") + if not LDLIBRARY: + raise Exception("failed to get LDLIBRARY variable from sysconfig") + okay &= binutils_check_library( + manifest, LDLIBRARY, expected_symbols, dynamic=False) + + # 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, + )) + found_defs = gcc_get_limited_api_definitions(['Include/Python.h']) + missing_defs = expected_defs - found_defs + okay &= _report_unexpected_items( + missing_defs, + 'Some expected declarations were not declared in ' + + '"Include/Python.h" with Py_LIMITED_API:') + + # Some Limited API macros are defined in terms of private symbols. + # These are not part of Limited API (even though they're defined with + # Py_LIMITED_API). They must be part of the Stable ABI, though. + private_symbols = {n for n in expected_symbols if n.startswith('_')} + extra_defs = found_defs - expected_defs - private_symbols + okay &= _report_unexpected_items( + extra_defs, + 'Some extra declarations were found in "Include/Python.h" ' + + 'with Py_LIMITED_API:') + + return okay + + +def _report_unexpected_items(items, msg): + """If there are any `items`, report them using "msg" and return false""" + if items: + print(msg, file=sys.stderr) + for item in sorted(items): + print(' -', item, file=sys.stderr) + return False + return True + + +def binutils_get_exported_symbols(library, dynamic=False): + """Retrieve exported symbols using the nm(1) tool from binutils""" # Only look at dynamic symbols args = ["nm", "--no-sort"] if dynamic: @@ -61,86 +369,89 @@ def get_exported_symbols(library, dynamic=False): yield symbol -def check_library(stable_abi_file, library, abi_funcs, dynamic=False): - available_symbols = set(get_exported_symbols(library, dynamic)) - missing_symbols = abi_funcs - available_symbols +def binutils_check_library(manifest, library, expected_symbols, dynamic): + """Check that library exports all expected_symbols""" + available_symbols = set(binutils_get_exported_symbols(library, dynamic)) + missing_symbols = expected_symbols - available_symbols if missing_symbols: - raise Exception( - f"""\ -Some symbols from the limited API are missing: {', '.join(missing_symbols)} + print(textwrap.dedent(f"""\ + Some symbols from the limited API are missing from {library}: + {', '.join(missing_symbols)} -This error means that there are some missing symbols among the ones exported -in the Python library ("libpythonx.x.a" or "libpythonx.x.so"). This normally -means that some symbol, function implementation or a prototype, belonging to -a symbol in the limited API has been deleted or is missing. + This error means that there are some missing symbols among the + ones exported in the library. + This normally means that some symbol, function implementation or + a prototype belonging to a symbol in the limited API has been + deleted or is missing. + """), file=sys.stderr) + return False + return True -Check if this was a mistake and if not, update the file containing the limited -API symbols. This file is located at: -{stable_abi_file} +def gcc_get_limited_api_macros(headers): + """Get all limited API macros from headers. -You can read more about the limited API and its contracts at: - -https://docs.python.org/3/c-api/stable.html - -And in PEP 384: - -https://www.python.org/dev/peps/pep-0384/ -""" - ) + Runs the preprocesor over all the header files in "Include" setting + "-DPy_LIMITED_API" to the correct value for the running version of the + interpreter and extracting all macro definitions (via adding -dM to the + compiler arguments). + Requires Python built with a GCC-compatible compiler. (clang might work) + """ -def generate_limited_api_symbols(args): - library = sysconfig.get_config_var("LIBRARY") - ldlibrary = sysconfig.get_config_var("LDLIBRARY") - if ldlibrary != library: - raise Exception("Limited ABI symbols can only be generated from a static build") - available_symbols = { - symbol for symbol in get_exported_symbols(library) if symbol.startswith("Py") - } + api_hexversion = sys.version_info.major << 24 | sys.version_info.minor << 16 - headers = [ - file - for file in pathlib.Path("Include").glob("*.h") - if file.name not in EXCLUDED_HEADERS - ] - stable_data, stable_exported_data, stable_functions = get_limited_api_definitions( - headers + preprocesor_output_with_macros = subprocess.check_output( + sysconfig.get_config_var("CC").split() + + [ + # Prevent the expansion of the exported macros so we can + # capture them later + "-DSIZEOF_WCHAR_T=4", # The actual value is not important + f"-DPy_LIMITED_API={api_hexversion}", + "-I.", + "-I./Include", + "-dM", + "-E", + ] + + [str(file) for file in headers], + text=True, ) - stable_symbols = { - symbol - for symbol in (stable_functions | stable_exported_data | stable_data) - if symbol.startswith("Py") and symbol in available_symbols - } - with open(args.output_file, "w") as output_file: - output_file.write(f"# File generated by 'make regen-limited-abi'\n") - output_file.write( - f"# This is NOT an authoritative list of stable ABI symbols\n" + return { + target + for target in re.findall( + r"#define (\w+)", preprocesor_output_with_macros ) - for symbol in sorted(stable_symbols): - output_file.write(f"{symbol}\n") + } -def get_limited_api_definitions(headers): - """Run the preprocesor over all the header files in "Include" setting - "-DPy_LIMITED_API" to the correct value for the running version of the interpreter. +def gcc_get_limited_api_definitions(headers): + """Get all limited API definitions from headers. - The limited API symbols will be extracted from the output of this command as it includes - the prototypes and definitions of all the exported symbols that are in the limited api. + Run the preprocesor over all the header files in "Include" setting + "-DPy_LIMITED_API" to the correct value for the running version of the + interpreter. + + The limited API symbols will be extracted from the output of this command + as it includes the prototypes and definitions of all the exported symbols + that are in the limited api. This function does *NOT* extract the macros defined on the limited API + + Requires Python built with a GCC-compatible compiler. (clang might work) """ + api_hexversion = sys.version_info.major << 24 | sys.version_info.minor << 16 preprocesor_output = subprocess.check_output( sysconfig.get_config_var("CC").split() + [ - # Prevent the expansion of the exported macros so we can capture them later + # Prevent the expansion of the exported macros so we can capture + # them later "-DPyAPI_FUNC=__PyAPI_FUNC", "-DPyAPI_DATA=__PyAPI_DATA", "-DEXPORT_DATA=__EXPORT_DATA", "-D_Py_NO_RETURN=", "-DSIZEOF_WCHAR_T=4", # The actual value is not important - f"-DPy_LIMITED_API={sys.version_info.major << 24 | sys.version_info.minor << 16}", + f"-DPy_LIMITED_API={api_hexversion}", "-I.", "-I./Include", "-E", @@ -156,64 +467,126 @@ def get_limited_api_definitions(headers): re.findall(r"__EXPORT_DATA\((.*?)\)", preprocesor_output) ) stable_data = set( - re.findall(r"__PyAPI_DATA\(.*?\)\s*\(?(.*?)\)?\s*;", preprocesor_output) + re.findall(r"__PyAPI_DATA\(.*?\)[\s\*\(]*([^);]*)\)?.*;", preprocesor_output) ) - return stable_data, stable_exported_data, stable_functions - - -def check_symbols(parser_args): - with open(parser_args.stable_abi_file, "r") as filename: - abi_funcs = { - symbol - for symbol in filename.read().splitlines() - if symbol and not symbol.startswith("#") - } - - try: - # static library - LIBRARY = sysconfig.get_config_var("LIBRARY") - if not LIBRARY: - raise Exception("failed to get LIBRARY variable from sysconfig") - if os.path.exists(LIBRARY): - check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) - - # dynamic library - LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") - if not LDLIBRARY: - raise Exception("failed to get LDLIBRARY variable from sysconfig") - if LDLIBRARY != LIBRARY: - check_library( - parser_args.stable_abi_file, LDLIBRARY, abi_funcs, dynamic=True - ) - except Exception as e: - print(e, file=sys.stderr) - sys.exit(1) + return stable_data | stable_exported_data | stable_functions def main(): - parser = argparse.ArgumentParser(description="Process some integers.") - subparsers = parser.add_subparsers() - check_parser = subparsers.add_parser( - "check", help="Check the exported symbols against a given ABI file" + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "file", type=Path, metavar='FILE', + help="file with the stable abi manifest", ) - check_parser.add_argument( - "stable_abi_file", type=str, help="File with the stable abi functions" + parser.add_argument( + "--generate", action='store_true', + help="generate file(s), rather than just checking them", ) - check_parser.set_defaults(func=check_symbols) - generate_parser = subparsers.add_parser( - "generate", - help="Generate symbols from the header files and the exported symbols", + parser.add_argument( + "--generate-all", action='store_true', + help="as --generate, but generate all file(s) using default filenames." + + " (unlike --all, does not run any extra checks)", ) - generate_parser.add_argument( - "output_file", type=str, help="File to dump the symbols to" + parser.add_argument( + "-a", "--all", action='store_true', + help="run all available checks using default filenames", + ) + parser.add_argument( + "-l", "--list", action='store_true', + help="list available generators and their default filenames; then exit", + ) + parser.add_argument( + "--dump", action='store_true', + help="dump the manifest contents (used for debugging the parser)", + ) + + actions_group = parser.add_argument_group('actions') + for gen in generators: + actions_group.add_argument( + gen.arg_name, dest=gen.var_name, + type=str, nargs="?", default=MISSING, + metavar='FILENAME', + help=gen.__doc__, + ) + actions_group.add_argument( + '--unixy-check', action='store_true', + help=do_unixy_check.__doc__, ) - generate_parser.set_defaults(func=generate_limited_api_symbols) args = parser.parse_args() - if "func" not in args: - parser.error("Either 'check' or 'generate' must be used") - sys.exit(1) - args.func(args) + base_path = args.file.parent.parent + + if args.list: + for gen in generators: + print(f'{gen.arg_name}: {base_path / gen.default_path}') + sys.exit(0) + + run_all_generators = args.generate_all + + if args.generate_all: + args.generate = True + + if args.all: + run_all_generators = True + args.unixy_check = True + + with args.file.open() as file: + manifest = parse_manifest(file) + + # Remember results of all actions (as booleans). + # At the end we'll check that at least one action was run, + # and also fail if any are false. + results = {} + + if args.dump: + for line in manifest.dump(): + print(line) + results['dump'] = True + + for gen in generators: + filename = getattr(args, gen.var_name) + if filename is None or (run_all_generators and filename is MISSING): + filename = base_path / gen.default_path + elif filename is MISSING: + continue + + results[gen.var_name] = generate_or_check(manifest, args, filename, gen) + + if args.unixy_check: + results['unixy_check'] = do_unixy_check(manifest, args) + + if not results: + if args.generate: + parser.error('No file specified. Use --help for usage.') + parser.error('No check specified. Use --help for usage.') + + failed_results = [name for name, result in results.items() if not result] + + if failed_results: + raise Exception(f""" + These checks related to the stable ABI did not succeed: + {', '.join(failed_results)} + + If you see diffs in the output, files derived from the stable + ABI manifest the were not regenerated. + Run `make regen-limited-abi` to fix this. + + Otherwise, see the error(s) above. + + The stable ABI manifest is at: {args.file} + Note that there is a process to follow when modifying it. + + You can read more about the limited API and its contracts at: + + https://docs.python.org/3/c-api/stable.html + + And in PEP 384: + + https://www.python.org/dev/peps/pep-0384/ + """) if __name__ == "__main__": |