patch 9.0.1996: Cannot build with python312

Commit: 
https://github.com/vim/vim/commit/fa145f200966e47e11c403520374d6d37cfd1de7
Author: Ken Takata <ken...@csc.jp>
Date:   Fri Oct 6 19:27:13 2023 +0200

    patch 9.0.1996: Cannot build with python312
    
    Problem:  Cannot build with python312
    Solution: Define wrapper types and functions for python 3.12
    
    Py_SIZE() uses PyLong_Type and PyBool_Type starting from Python 3.12.
    We need to define our own Py_SIZE() to replace Py{Bool,Long}_Type with
    py3_Py{Bool,Long}_Type.
    We also need to redefine PyTuple_GET_SIZE() and PyList_GET_SIZE(), because
    they use Py_SIZE().
    
    closes: #13281
    closes: #13290
    
    Signed-off-by: Christian Brabandt <c...@256bit.org>
    Co-authored-by: Ken Takata <ken...@csc.jp>

diff --git a/src/if_python3.c b/src/if_python3.c
index bbbebc39f..52027bd56 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -68,8 +68,6 @@
 #endif
 
 #define PY_SSIZE_T_CLEAN
-#define PyLong_Type (*py3_PyLong_Type)
-#define PyBool_Type (*py3_PyBool_Type)
 
 #ifdef Py_LIMITED_API
 # define USE_LIMITED_API // Using Python 3 limited ABI
@@ -297,6 +295,10 @@ static HINSTANCE hinstPy3 = 0; // Instance of python.dll
 # define PyFloat_Type (*py3_PyFloat_Type)
 # define PyNumber_Check (*py3_PyNumber_Check)
 # define PyNumber_Long (*py3_PyNumber_Long)
+# define PyBool_Type (*py3_PyBool_Type)
+# if PY_VERSION_HEX >= 0x030c00b0
+#  define PyLong_Type (*py3_PyLong_Type)
+# endif
 # define PyErr_NewException py3_PyErr_NewException
 # ifdef Py_DEBUG
 #  define _Py_NegativeRefcount py3__Py_NegativeRefcount
@@ -496,9 +498,9 @@ static PyTypeObject* py3_PyStdPrinter_Type;
 # endif
 static PyTypeObject* py3_PySlice_Type;
 static PyTypeObject* py3_PyFloat_Type;
-PyTypeObject* py3_PyBool_Type;
+static PyTypeObject* py3_PyBool_Type;
 # if PY_VERSION_HEX >= 0x030c00b0
-PyTypeObject* py3_PyLong_Type;
+static PyTypeObject* py3_PyLong_Type;
 # endif
 static int (*py3_PyNumber_Check)(PyObject *);
 static PyObject* (*py3_PyNumber_Long)(PyObject *);
@@ -696,8 +698,9 @@ static struct
 # endif
     {"PySlice_Type", (PYTHON_PROC*)&py3_PySlice_Type},
     {"PyFloat_Type", (PYTHON_PROC*)&py3_PyFloat_Type},
-# if PY_VERSION_HEX < 0x030c00b0
     {"PyBool_Type", (PYTHON_PROC*)&py3_PyBool_Type},
+# if PY_VERSION_HEX >= 0x030c00b0
+    {"PyLong_Type", (PYTHON_PROC*)&py3_PyLong_Type},
 # endif
     {"PyNumber_Check", (PYTHON_PROC*)&py3_PyNumber_Check},
     {"PyNumber_Long", (PYTHON_PROC*)&py3_PyNumber_Long},
@@ -789,6 +792,42 @@ py3__PyObject_TypeCheck(PyObject *ob, PyTypeObject *type)
 #  endif
 # endif
 
+# if !defined(USE_LIMITED_API) && PY_VERSION_HEX >= 0x030c00b0
+// Py_SIZE() uses PyLong_Type and PyBool_Type starting from Python 3.12.
+// We need to define our own Py_SIZE() to replace Py{Bool,Long}_Type with
+// py3_Py{Bool,Long}_Type.
+// We also need to redefine PyTuple_GET_SIZE() and PyList_GET_SIZE(), because
+// they use Py_SIZE().
+    static inline Py_ssize_t
+py3_Py_SIZE(PyObject *ob)
+{
+    assert(ob->ob_type != &PyLong_Type);
+    assert(ob->ob_type != &PyBool_Type);
+    PyVarObject *var_ob = _PyVarObject_CAST(ob);
+    return var_ob->ob_size;
+}
+#  undef Py_SIZE
+#  define Py_SIZE(ob) py3_Py_SIZE(_PyObject_CAST(ob))
+
+    static inline Py_ssize_t
+py3_PyTuple_GET_SIZE(PyObject *op)
+{
+    PyTupleObject *tuple = _PyTuple_CAST(op);
+    return Py_SIZE(tuple);
+}
+#  undef PyTuple_GET_SIZE
+#  define PyTuple_GET_SIZE(op) py3_PyTuple_GET_SIZE(_PyObject_CAST(op))
+
+    static inline
+Py_ssize_t py3_PyList_GET_SIZE(PyObject *op)
+{
+    PyListObject *list = _PyList_CAST(op);
+    return Py_SIZE(list);
+}
+#  undef PyList_GET_SIZE
+#  define PyList_GET_SIZE(op) py3_PyList_GET_SIZE(_PyObject_CAST(op))
+# endif
+
 # ifdef MSWIN
 /*
  * Look up the library "libname" using the InstallPath registry key.
diff --git a/src/version.c b/src/version.c
index ce13dcc77..ec25a1213 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1996,
 /**/
     1995,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1qoosp-00AqVO-BI%40256bit.org.

Raspunde prin e-mail lui