From 019976e2db4899a5ac30f497aa45b51335b024ec Mon Sep 17 00:00:00 2001 From: Jose Date: Thu, 17 Oct 2024 10:09:57 +0200 Subject: [PATCH] Python 3.13 build fixes (#2910) --- python/modules/IcePy/Types.cpp | 30 +++++++++++------------------- python/modules/IcePy/Util.cpp | 9 ++------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/python/modules/IcePy/Types.cpp b/python/modules/IcePy/Types.cpp index 0dc4baa3bda..2228afcae3d 100644 --- a/python/modules/IcePy/Types.cpp +++ b/python/modules/IcePy/Types.cpp @@ -296,14 +296,7 @@ IcePy::StreamUtil::setSlicedDataMember(PyObject* obj, const Ice::SlicedDataPtr& assert(_sliceInfoType); } - IcePy::PyObjectHandle args{PyTuple_New(0)}; - if (!args.get()) - { - assert(PyErr_Occurred()); - throw AbortMarshaling(); - } - - PyObjectHandle sd{PyEval_CallObject(_slicedDataType, args.get())}; + PyObjectHandle sd{PyObject_CallObject(_slicedDataType, nullptr)}; if (!sd.get()) { assert(PyErr_Occurred()); @@ -329,7 +322,7 @@ IcePy::StreamUtil::setSlicedDataMember(PyObject* obj, const Ice::SlicedDataPtr& int i = 0; for (vector::const_iterator p = slicedData->slices.begin(); p != slicedData->slices.end(); ++p) { - PyObjectHandle slice{PyEval_CallObject(_sliceInfoType, args.get())}; + PyObjectHandle slice{PyObject_CallObject(_sliceInfoType, nullptr)}; if (!slice.get()) { assert(PyErr_Occurred()); @@ -1476,18 +1469,17 @@ IcePy::SequenceInfo::marshal( Py_ssize_t sz = 0; if (p != Py_None) { - const void* buf = 0; - if (PyObject_AsReadBuffer(p, &buf, &sz) == 0) + Py_buffer pybuf; + if (pi && PyObject_GetBuffer(p, &pybuf, PyBUF_SIMPLE | PyBUF_FORMAT) == 0) { - if (pi->kind == PrimitiveInfo::KindString) - { - PyErr_Format(PyExc_ValueError, "expected sequence value"); - throw AbortMarshaling(); - } + // Strings are handled as variable length types above. + assert(pi->kind != PrimitiveInfo::KindString); + sz = pybuf.len; + PyBuffer_Release(&pybuf); } else { - PyErr_Clear(); // PyObject_AsReadBuffer sets an exception on failure. + PyErr_Clear(); // PyObject_GetBuffer sets an exception on failure. PyObjectHandle fs; if (pi) @@ -1711,7 +1703,7 @@ IcePy::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, PyObje if (pi->kind != PrimitiveInfo::KindString) { // - // With Python 3 and greater we marshal sequences of pritive types using the new + // With Python 3 and greater we marshal sequences of primitive types using the new // buffer protocol when possible, for older versions we use the old buffer protocol. // Py_buffer pybuf; @@ -1820,7 +1812,7 @@ IcePy::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, PyObje } else { - PyErr_Clear(); // PyObject_GetBuffer/PyObject_AsReadBuffer sets an exception on failure. + PyErr_Clear(); // PyObject_GetBuffer sets an exception on failure. } } diff --git a/python/modules/IcePy/Util.cpp b/python/modules/IcePy/Util.cpp index 63d2f54321e..8e6c7c16499 100644 --- a/python/modules/IcePy/Util.cpp +++ b/python/modules/IcePy/Util.cpp @@ -611,12 +611,7 @@ PyObject* IcePy::createExceptionInstance(PyObject* type) { assert(PyExceptionClass_Check(type)); - IcePy::PyObjectHandle args{PyTuple_New(0)}; - if (!args.get()) - { - return nullptr; - } - return PyEval_CallObject(type, args.get()); + return PyObject_CallObject(type, nullptr); } namespace @@ -651,7 +646,7 @@ namespace // PyTuple_SetItem takes ownership of the args[i] reference. PyTuple_SetItem(pArgs.get(), static_cast(i), args[i]); } - return PyEval_CallObject(type, pArgs.get()); + return PyObject_CallObject(type, pArgs.get()); } }