From 3c98b091280d6265cd5f1b978910f009b35b8e53 Mon Sep 17 00:00:00 2001 From: wwmayer Date: Fri, 17 Mar 2023 22:50:30 +0100 Subject: [PATCH] Base: fixes #8902: Segfault from Part WB functionality in python scripting (#8927) --- src/Base/VectorPy.xml | 2 ++ src/Base/VectorPyImp.cpp | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Base/VectorPy.xml b/src/Base/VectorPy.xml index 413e0f7f39..237da76229 100644 --- a/src/Base/VectorPy.xml +++ b/src/Base/VectorPy.xml @@ -219,6 +219,8 @@ normal : Base.Vector :PyObjectBase(new Vector3d(vec.x,vec.y,vec.z),T){} Vector3d value() const { return *(getVectorPtr()); } +private: + Py::List sequence; diff --git a/src/Base/VectorPyImp.cpp b/src/Base/VectorPyImp.cpp index c3f31b13cb..cf687f580c 100644 --- a/src/Base/VectorPyImp.cpp +++ b/src/Base/VectorPyImp.cpp @@ -185,15 +185,22 @@ PyObject * VectorPy::sequence_item (PyObject *self, Py_ssize_t index) PyErr_SetString(PyExc_TypeError, "first arg must be Vector"); return nullptr; } - if (index < 0 || index > 2) { + if ((index < 0) || (index > 2)) { PyErr_SetString(PyExc_IndexError, "index out of range"); return nullptr; } - unsigned short pos = index % 3; + VectorPy* self_ = static_cast(self); + if (self_->sequence.length() == 0) { + self_->sequence = Py::List{3}; + } - Base::Vector3d a = static_cast(self)->value(); - return Py_BuildValue("d", a[pos]); + unsigned short pos = index % 3; + Base::Vector3d vec = self_->value(); + Py::Float item{vec[pos]}; + self_->sequence.setItem(pos, item); + + return Py::new_reference_to(item); } int VectorPy::sequence_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)