]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0723: if_python: dynamic linking fails with python3 >= 3.13 v9.1.0723
authorYee Cheng Chin <ychin.git@gmail.com>
Mon, 9 Sep 2024 17:46:17 +0000 (19:46 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 9 Sep 2024 17:46:17 +0000 (19:46 +0200)
Problem:  if_python: dynamic linking fails with python3 >= 3.13
          when using non-stable ABI (zdohnal)
Solution: do not try to import the privat python symbol
          _PyObject_NextNotImplemented
          (Yee Cheng Chin)

Vim is importing a private Python symbol `_PyObject_NextNotImplemented`
because it used to be required as part of the `PyIter_Check()` macro in
an abstraction breaking way. Python eventually fixed the issue and in
3.13 it removed the private symbol export, which broke Vim. Simply
remove importing this private symbol in newer Python versions as it's no
longer needed for PyIter_Check to work.

fixes: #15457
closes: #15649

Signed-off-by: Yee Cheng Chin <ychin.git@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/if_python3.c
src/version.c

index ac817bdce461264ebdd00e1babc57c0481f86dac..fd117f0a715025d2d1a95f85ae6321dc1c6ae5e9 100644 (file)
@@ -267,7 +267,8 @@ static HINSTANCE hinstPy3 = 0; // Instance of python.dll
 # define _Py_NoneStruct (*py3__Py_NoneStruct)
 # define _Py_FalseStruct (*py3__Py_FalseStruct)
 # define _Py_TrueStruct (*py3__Py_TrueStruct)
-# ifndef USE_LIMITED_API
+# if !defined(USE_LIMITED_API) && PY_VERSION_HEX < 0x030D0000
+// Private symbol that used to be required as part of PyIter_Check.
 #  define _PyObject_NextNotImplemented (*py3__PyObject_NextNotImplemented)
 # endif
 # define PyModule_AddObject py3_PyModule_AddObject
@@ -482,7 +483,7 @@ static void (*py3_PyErr_Clear)(void);
 static PyObject* (*py3_PyErr_Format)(PyObject *, const char *, ...);
 static void (*py3_PyErr_PrintEx)(int);
 static PyObject*(*py3__PyObject_Init)(PyObject *, PyTypeObject *);
-# ifndef USE_LIMITED_API
+# if !defined(USE_LIMITED_API) && PY_VERSION_HEX < 0x030D0000
 static iternextfunc py3__PyObject_NextNotImplemented;
 # endif
 static PyObject* py3__Py_NoneStruct;
@@ -679,7 +680,7 @@ static struct
     {"PyEval_SaveThread", (PYTHON_PROC*)&py3_PyEval_SaveThread},
     {"_PyArg_Parse_SizeT", (PYTHON_PROC*)&py3_PyArg_Parse},
     {"Py_IsInitialized", (PYTHON_PROC*)&py3_Py_IsInitialized},
-# ifndef USE_LIMITED_API
+# if !defined(USE_LIMITED_API) && PY_VERSION_HEX < 0x030D0000
     {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&py3__PyObject_NextNotImplemented},
 # endif
     {"_Py_NoneStruct", (PYTHON_PROC*)&py3__Py_NoneStruct},
index 4460bb16ecfd2ccf9ddbc050642ec8a15b8d9c2b..db611c96956c4fcacce61b0c64390dabd5a7d85a 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    723,
 /**/
     722,
 /**/