Skip to content

Commit ee1b931

Browse files
committed
patch 8.2.1225: linker errors when building with dynamic Python 3.9
Problem: Linker errors when building with dynamic Python 3.9. Solution: Add #defined items. (closes #6461)
1 parent a90afb9 commit ee1b931

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

src/if_python3.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ typedef PySliceObject PySliceObject_T;
203203
# define PySys_GetObject py3_PySys_GetObject
204204
# define PySys_SetArgv py3_PySys_SetArgv
205205
# define PyType_Ready py3_PyType_Ready
206+
# if PY_VERSION_HEX >= 0x030900b0
207+
# define PyType_GetFlags py3_PyType_GetFlags
208+
# endif
206209
#undef Py_BuildValue
207210
# define Py_BuildValue py3_Py_BuildValue
208211
# define Py_SetPythonHome py3_Py_SetPythonHome
@@ -233,6 +236,9 @@ typedef PySliceObject PySliceObject_T;
233236
# define PyBytes_FromString py3_PyBytes_FromString
234237
# undef PyBytes_FromStringAndSize
235238
# define PyBytes_FromStringAndSize py3_PyBytes_FromStringAndSize
239+
# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
240+
# define _Py_Dealloc py3__Py_Dealloc
241+
# endif
236242
# define PyFloat_FromDouble py3_PyFloat_FromDouble
237243
# define PyFloat_AsDouble py3_PyFloat_AsDouble
238244
# define PyObject_GenericGetAttr py3_PyObject_GenericGetAttr
@@ -247,7 +253,6 @@ typedef PySliceObject PySliceObject_T;
247253
# ifdef Py_DEBUG
248254
# define _Py_NegativeRefcount py3__Py_NegativeRefcount
249255
# define _Py_RefTotal (*py3__Py_RefTotal)
250-
# define _Py_Dealloc py3__Py_Dealloc
251256
# define PyModule_Create2TraceRefs py3_PyModule_Create2TraceRefs
252257
# else
253258
# define PyModule_Create2 py3_PyModule_Create2
@@ -287,6 +292,10 @@ typedef PySliceObject PySliceObject_T;
287292
# define PyObject_NEW(type, typeobj) \
288293
( (type *) PyObject_Init( \
289294
(PyObject *) _PyObject_DebugMalloc( _PyObject_SIZE(typeobj) ), (typeobj)) )
295+
# elif PY_VERSION_HEX >= 0x030900b0
296+
# undef PyObject_NEW
297+
# define PyObject_NEW(type, typeobj) \
298+
((type *)py3__PyObject_New(typeobj))
290299
# endif
291300

292301
/*
@@ -352,6 +361,9 @@ static PyObject* (*py3_PyObject_Repr)(PyObject *);
352361
static PyObject* (*py3_PyObject_GetItem)(PyObject *, PyObject *);
353362
static int (*py3_PyObject_IsTrue)(PyObject *);
354363
static PyObject* (*py3_Py_BuildValue)(char *, ...);
364+
# if PY_VERSION_HEX >= 0x030900b0
365+
static int (*py3_PyType_GetFlags)(PyTypeObject *o);
366+
# endif
355367
static int (*py3_PyType_Ready)(PyTypeObject *type);
356368
static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
357369
static PyObject* (*py3_PyUnicode_FromString)(const char *u);
@@ -396,6 +408,12 @@ static char* (*py3_PyBytes_AsString)(PyObject *bytes);
396408
static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, Py_ssize_t *length);
397409
static PyObject* (*py3_PyBytes_FromString)(char *str);
398410
static PyObject* (*py3_PyBytes_FromStringAndSize)(char *str, Py_ssize_t length);
411+
# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
412+
static void (*py3__Py_Dealloc)(PyObject *obj);
413+
# endif
414+
# if PY_VERSION_HEX >= 0x030900b0
415+
static PyObject* (*py3__PyObject_New)(PyTypeObject *);
416+
# endif
399417
static PyObject* (*py3_PyFloat_FromDouble)(double num);
400418
static double (*py3_PyFloat_AsDouble)(PyObject *);
401419
static PyObject* (*py3_PyObject_GenericGetAttr)(PyObject *obj, PyObject *name);
@@ -414,7 +432,6 @@ static void* (*py3_PyCapsule_GetPointer)(PyObject *, char *);
414432
# ifdef Py_DEBUG
415433
static void (*py3__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op);
416434
static Py_ssize_t* py3__Py_RefTotal;
417-
static void (*py3__Py_Dealloc)(PyObject *obj);
418435
static PyObject* (*py3_PyModule_Create2TraceRefs)(struct PyModuleDef* module, int module_api_version);
419436
# else
420437
static PyObject* (*py3_PyModule_Create2)(struct PyModuleDef* module, int module_api_version);
@@ -525,6 +542,9 @@ static struct
525542
{"PyObject_IsTrue", (PYTHON_PROC*)&py3_PyObject_IsTrue},
526543
{"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong},
527544
{"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New},
545+
# if PY_VERSION_HEX >= 0x030900b0
546+
{"PyType_GetFlags", (PYTHON_PROC*)&py3_PyType_GetFlags},
547+
# endif
528548
{"PyType_Ready", (PYTHON_PROC*)&py3_PyType_Ready},
529549
{"PyDict_SetItemString", (PYTHON_PROC*)&py3_PyDict_SetItemString},
530550
{"PyLong_AsLong", (PYTHON_PROC*)&py3_PyLong_AsLong},
@@ -562,6 +582,12 @@ static struct
562582
{"PyBytes_AsStringAndSize", (PYTHON_PROC*)&py3_PyBytes_AsStringAndSize},
563583
{"PyBytes_FromString", (PYTHON_PROC*)&py3_PyBytes_FromString},
564584
{"PyBytes_FromStringAndSize", (PYTHON_PROC*)&py3_PyBytes_FromStringAndSize},
585+
# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
586+
{"_Py_Dealloc", (PYTHON_PROC*)&py3__Py_Dealloc},
587+
# endif
588+
# if PY_VERSION_HEX >= 0x030900b0
589+
{"_PyObject_New", (PYTHON_PROC*)&py3__PyObject_New},
590+
# endif
565591
{"PyFloat_FromDouble", (PYTHON_PROC*)&py3_PyFloat_FromDouble},
566592
{"PyFloat_AsDouble", (PYTHON_PROC*)&py3_PyFloat_AsDouble},
567593
{"PyObject_GenericGetAttr", (PYTHON_PROC*)&py3_PyObject_GenericGetAttr},
@@ -578,7 +604,6 @@ static struct
578604
# ifdef Py_DEBUG
579605
{"_Py_NegativeRefcount", (PYTHON_PROC*)&py3__Py_NegativeRefcount},
580606
{"_Py_RefTotal", (PYTHON_PROC*)&py3__Py_RefTotal},
581-
{"_Py_Dealloc", (PYTHON_PROC*)&py3__Py_Dealloc},
582607
{"PyModule_Create2TraceRefs", (PYTHON_PROC*)&py3_PyModule_Create2TraceRefs},
583608
# else
584609
{"PyModule_Create2", (PYTHON_PROC*)&py3_PyModule_Create2},
@@ -634,6 +659,15 @@ py3__Py_XDECREF(PyObject *op)
634659
# define Py_XDECREF(op) py3__Py_XDECREF(_PyObject_CAST(op))
635660
# endif
636661

662+
# if PY_VERSION_HEX >= 0x030900b0
663+
static inline int
664+
py3_PyType_HasFeature(PyTypeObject *type, unsigned long feature)
665+
{
666+
return ((PyType_GetFlags(type) & feature) != 0);
667+
}
668+
# define PyType_HasFeature(t,f) py3_PyType_HasFeature(t,f)
669+
# endif
670+
637671
/*
638672
* Load library and get all pointers.
639673
* Parameter 'libname' provides name of DLL.

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ static char *(features[]) =
754754

755755
static int included_patches[] =
756756
{ /* Add new patch number below this line */
757+
/**/
758+
1225,
757759
/**/
758760
1224,
759761
/**/

0 commit comments

Comments
 (0)