From a89999fee6f9bf55919b4cc34861922ccf1100e1 Mon Sep 17 00:00:00 2001 From: wangzengliang Date: Fri, 21 Jul 2023 16:00:41 +0800 Subject: [PATCH] Fix Python 3.10(PEP-620) incompatibility copyed-by: https://github.com/boostorg/python/pull/328 From: Stefan Seefeld --- src/boost/boost/python/detail/wrap_python.hpp | 5 +++++ src/boost/boost/python/object/make_instance.hpp | 2 +- src/boost/libs/python/src/object/class.cpp | 15 +++++---------- src/boost/libs/python/src/object/enum.cpp | 2 +- src/boost/libs/python/src/object/function.cpp | 2 +- src/boost/libs/python/src/object/life_support.cpp | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/boost/boost/python/detail/wrap_python.hpp b/src/boost/boost/python/detail/wrap_python.hpp index 13679dbb8..c3eba3ac6 100644 --- a/src/boost/boost/python/detail/wrap_python.hpp +++ b/src/boost/boost/python/detail/wrap_python.hpp @@ -230,6 +230,11 @@ typedef int pid_t; #endif +#if PY_VERSION_HEX < 0x030900A4 +# define Py_SET_TYPE(obj, type) ((Py_TYPE(obj) = (type)), (void)0) +# define Py_SET_SIZE(obj, size) ((Py_TYPE(obj) = (size)), (void)0) +#endif + #ifdef __MWERKS__ # pragma warn_possunwant off diff --git a/src/boost/boost/python/object/make_instance.hpp b/src/boost/boost/python/object/make_instance.hpp index 31ec08f7c..5eb3aa9d9 100644 --- a/src/boost/boost/python/object/make_instance.hpp +++ b/src/boost/boost/python/object/make_instance.hpp @@ -47,7 +47,7 @@ struct make_instance_impl // Note the position of the internally-stored Holder, // for the sake of destruction - Py_SIZE(instance) = offsetof(instance_t, storage); + Py_SET_SIZE(instance, offsetof(instance_t, storage)); // Release ownership of the python object protect.cancel(); diff --git a/src/boost/libs/python/src/object/class.cpp b/src/boost/libs/python/src/object/class.cpp index 9bb9683a3..2d1112298 100644 --- a/src/boost/libs/python/src/object/class.cpp +++ b/src/boost/libs/python/src/object/class.cpp @@ -208,7 +208,7 @@ namespace objects { if (static_data_object.tp_dict == 0) { - Py_TYPE(&static_data_object) = &PyType_Type; + Py_SET_TYPE(&static_data_object, &PyType_Type); static_data_object.tp_base = &PyProperty_Type; if (PyType_Ready(&static_data_object)) return 0; @@ -316,7 +316,7 @@ namespace objects { if (class_metatype_object.tp_dict == 0) { - Py_TYPE(&class_metatype_object) = &PyType_Type; + Py_SET_TYPE(&class_metatype_object, &PyType_Type); class_metatype_object.tp_base = &PyType_Type; if (PyType_Ready(&class_metatype_object)) return type_handle(); @@ -374,12 +374,7 @@ namespace objects // like, so we'll store the total size of the object // there. A negative number indicates that the extra // instance memory is not yet allocated to any holders. -#if PY_VERSION_HEX >= 0x02060000 - Py_SIZE(result) = -#else - result->ob_size = -#endif - -(static_cast(offsetof(instance<>,storage) + instance_size)); + Py_SET_SIZE(result, -static_cast(offsetof(instance<>,storage) + instance_size)); } return (PyObject*)result; } @@ -470,7 +465,7 @@ namespace objects { if (class_type_object.tp_dict == 0) { - Py_TYPE(&class_type_object) = incref(class_metatype().get()); + Py_SET_TYPE(&class_type_object, incref(class_metatype().get())); class_type_object.tp_base = &PyBaseObject_Type; if (PyType_Ready(&class_type_object)) return type_handle(); @@ -739,7 +734,7 @@ void* instance_holder::allocate(PyObject* self_, std::size_t holder_offset, std: assert(holder_offset >= offsetof(objects::instance<>,storage)); // Record the fact that the storage is occupied, noting where it starts - Py_SIZE(self) = holder_offset; + Py_SET_SIZE(self, holder_offset); return (char*)self + holder_offset; } else diff --git a/src/boost/libs/python/src/object/enum.cpp b/src/boost/libs/python/src/object/enum.cpp index 10122ad1d..293e70589 100644 --- a/src/boost/libs/python/src/object/enum.cpp +++ b/src/boost/libs/python/src/object/enum.cpp @@ -153,7 +153,7 @@ namespace { if (enum_type_object.tp_dict == 0) { - Py_TYPE(&enum_type_object) = incref(&PyType_Type); + Py_SET_TYPE(&enum_type_object, incref(&PyType_Type)); #if PY_VERSION_HEX >= 0x03000000 enum_type_object.tp_base = &PyLong_Type; #else diff --git a/src/boost/libs/python/src/object/function.cpp b/src/boost/libs/python/src/object/function.cpp index 9d4745d10..787679e13 100644 --- a/src/boost/libs/python/src/object/function.cpp +++ b/src/boost/libs/python/src/object/function.cpp @@ -107,7 +107,7 @@ function::function( PyObject* p = this; if (Py_TYPE(&function_type) == 0) { - Py_TYPE(&function_type) = &PyType_Type; + Py_SET_TYPE(&function_type, &PyType_Type); ::PyType_Ready(&function_type); } diff --git a/src/boost/libs/python/src/object/life_support.cpp b/src/boost/libs/python/src/object/life_support.cpp index b7e9aa861..281c3bffc 100644 --- a/src/boost/libs/python/src/object/life_support.cpp +++ b/src/boost/libs/python/src/object/life_support.cpp @@ -93,7 +93,7 @@ PyObject* make_nurse_and_patient(PyObject* nurse, PyObject* patient) if (Py_TYPE(&life_support_type) == 0) { - Py_TYPE(&life_support_type) = &PyType_Type; + Py_SET_TYPE(&life_support_type, &PyType_Type); PyType_Ready(&life_support_type); } -- 2.27.0