Py: fix memory leaks by incorrect use of PyList_Append
This commit is contained in:
@@ -197,7 +197,8 @@ private:
|
||||
} else {
|
||||
biggie = false;
|
||||
}
|
||||
PyObject* result = PyList_New(0);
|
||||
|
||||
Py::List result;
|
||||
|
||||
try {
|
||||
EdgeWalker ew;
|
||||
@@ -207,16 +208,18 @@ private:
|
||||
std::vector<TopoDS_Wire> rw = ew.getResultNoDups();
|
||||
std::vector<TopoDS_Wire> sortedWires = ew.sortStrip(rw,biggie); //false==>do not include biggest wires
|
||||
for (auto& w:sortedWires) {
|
||||
PyList_Append(result,new TopoShapeWirePy(new TopoShape(w)));
|
||||
PyObject* wire = new TopoShapeWirePy(new TopoShape(w));
|
||||
result.append(Py::asObject(wire));
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
Base::Console().Warning("edgeWalker: input is not planar graph. Wire detection not done\n");
|
||||
}
|
||||
}
|
||||
catch (Base::Exception &e) {
|
||||
throw Py::Exception(Base::BaseExceptionFreeCADError, e.what());
|
||||
}
|
||||
return Py::asObject(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
Py::Object findOuterWire(const Py::Tuple& args)
|
||||
|
||||
@@ -300,13 +300,13 @@ Py::Object CenterLinePy::getEdges(void) const
|
||||
std::vector<std::string> edges = cl->m_edges;
|
||||
int size = edges.size();
|
||||
|
||||
PyObject* result = PyList_New(size);
|
||||
Py::List result(size);
|
||||
|
||||
for (auto& e: edges) {
|
||||
PyList_Append(result, PyUnicode_FromString(e.c_str()));
|
||||
result.append(Py::asObject(PyUnicode_FromString(e.c_str())));
|
||||
}
|
||||
|
||||
return Py::asObject(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void CenterLinePy::setEdges(Py::Object arg)
|
||||
@@ -346,13 +346,13 @@ Py::Object CenterLinePy::getFaces(void) const
|
||||
std::vector<std::string> faces = cl->m_faces;
|
||||
int size = faces.size();
|
||||
|
||||
PyObject* result = PyList_New(size);
|
||||
Py::List result(size);
|
||||
|
||||
for (auto& f: faces) {
|
||||
PyList_Append(result, PyUnicode_FromString(f.c_str()));
|
||||
result.append(Py::asObject(PyUnicode_FromString(f.c_str())));
|
||||
}
|
||||
|
||||
return Py::asObject(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void CenterLinePy::setFaces(Py::Object arg)
|
||||
@@ -393,13 +393,13 @@ Py::Object CenterLinePy::getPoints(void) const
|
||||
std::vector<std::string> points = cl->m_verts;
|
||||
int size = points.size();
|
||||
|
||||
PyObject* result = PyList_New(size);
|
||||
Py::List result(size);
|
||||
|
||||
for (auto& p: points) {
|
||||
PyList_Append(result, PyUnicode_FromString(p.c_str()));
|
||||
result.append(Py::asObject(PyUnicode_FromString(p.c_str())));
|
||||
}
|
||||
|
||||
return Py::asObject(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void CenterLinePy::setPoints(Py::Object arg)
|
||||
|
||||
@@ -82,23 +82,23 @@ PyObject* DrawPagePy::getAllViews(PyObject* args)
|
||||
DrawPage* page = getDrawPagePtr();
|
||||
std::vector<App::DocumentObject*> allViews = page->getAllViews();
|
||||
|
||||
PyObject* ret = PyList_New(0);
|
||||
Py::List ret;
|
||||
for (auto&v: allViews) {
|
||||
if (v->isDerivedFrom(TechDraw::DrawProjGroupItem::getClassTypeId())) {
|
||||
TechDraw::DrawProjGroupItem* dpgi = static_cast<TechDraw::DrawProjGroupItem*>(v);
|
||||
PyList_Append(ret,new TechDraw::DrawProjGroupItemPy(dpgi)); //is this legit? or need to make new copy of dv?
|
||||
ret.append(Py::asObject(new TechDraw::DrawProjGroupItemPy(dpgi))); //is this legit? or need to make new copy of dv?
|
||||
} else if (v->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
|
||||
TechDraw::DrawViewPart* dvp = static_cast<TechDraw::DrawViewPart*>(v);
|
||||
PyList_Append(ret,new TechDraw::DrawViewPartPy(dvp));
|
||||
ret.append(Py::asObject(new TechDraw::DrawViewPartPy(dvp)));
|
||||
} else if (v->isDerivedFrom(TechDraw::DrawViewAnnotation::getClassTypeId())) {
|
||||
TechDraw::DrawViewAnnotation* dva = static_cast<TechDraw::DrawViewAnnotation*>(v);
|
||||
PyList_Append(ret,new TechDraw::DrawViewAnnotationPy(dva));
|
||||
ret.append(Py::asObject(new TechDraw::DrawViewAnnotationPy(dva)));
|
||||
} else {
|
||||
TechDraw::DrawView* dv = static_cast<TechDraw::DrawView*>(v);
|
||||
PyList_Append(ret,new TechDraw::DrawViewPy(dv));
|
||||
ret.append(Py::asObject(new TechDraw::DrawViewPy(dv)));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
return Py::new_reference_to(ret);
|
||||
}
|
||||
|
||||
// double getPageWidth() const;
|
||||
|
||||
@@ -93,27 +93,20 @@ PyObject* DrawViewClipPy::removeView(PyObject* args)
|
||||
PyObject* DrawViewClipPy::getChildViewNames(PyObject* args)
|
||||
{
|
||||
if (!PyArg_ParseTuple(args, ""))
|
||||
return 0;
|
||||
return nullptr;
|
||||
|
||||
DrawViewClip* clip = getDrawViewClipPtr();
|
||||
std::vector<std::string> strings = clip->getChildViewNames();
|
||||
int stringSize = strings.size();
|
||||
|
||||
PyObject* result = PyList_New(stringSize);
|
||||
Py::List result(stringSize);
|
||||
|
||||
std::vector<std::string>::iterator it = strings.begin();
|
||||
for( ; it != strings.end(); it++) {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
PyObject* pString = PyString_FromString(it->c_str()); //TODO: unicode & py3
|
||||
#else
|
||||
PyObject* pString = PyUnicode_FromString(it->c_str());
|
||||
#endif
|
||||
//int rc =
|
||||
static_cast<void> (PyList_Append(result, pString));
|
||||
result.append(Py::String(*it));
|
||||
}
|
||||
|
||||
// PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented");
|
||||
return result;
|
||||
return Py::new_reference_to(result);
|
||||
}
|
||||
|
||||
PyObject *DrawViewClipPy::getCustomAttributes(const char* ) const
|
||||
|
||||
@@ -76,10 +76,10 @@ PyObject* DrawViewDimensionPy::getLinearPoints(PyObject* args)
|
||||
(void) args;
|
||||
DrawViewDimension* dvd = getDrawViewDimensionPtr();
|
||||
pointPair pts = dvd->getLinearPoints();
|
||||
PyObject* ret = PyList_New(0);
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.first)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.second)));
|
||||
return ret;
|
||||
Py::List ret;
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.first))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.second))));
|
||||
return Py::new_reference_to(ret);
|
||||
}
|
||||
|
||||
PyObject* DrawViewDimensionPy::getArcPoints(PyObject* args)
|
||||
@@ -87,14 +87,14 @@ PyObject* DrawViewDimensionPy::getArcPoints(PyObject* args)
|
||||
(void) args;
|
||||
DrawViewDimension* dvd = getDrawViewDimensionPtr();
|
||||
arcPoints pts = dvd->getArcPoints();
|
||||
PyObject* ret = PyList_New(0);
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.center)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.onCurve.first)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.onCurve.second)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.arcEnds.first)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.arcEnds.second)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.midArc)));
|
||||
return ret;
|
||||
Py::List ret;
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.center))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.onCurve.first))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.onCurve.second))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.arcEnds.first))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.arcEnds.second))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.midArc))));
|
||||
return Py::new_reference_to(ret);
|
||||
}
|
||||
|
||||
PyObject* DrawViewDimensionPy::getAnglePoints(PyObject* args)
|
||||
@@ -102,11 +102,11 @@ PyObject* DrawViewDimensionPy::getAnglePoints(PyObject* args)
|
||||
(void) args;
|
||||
DrawViewDimension* dvd = getDrawViewDimensionPtr();
|
||||
anglePoints pts = dvd->getAnglePoints();
|
||||
PyObject* ret = PyList_New(0);
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.ends.first)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.ends.second)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.vertex)));
|
||||
return ret;
|
||||
Py::List ret;
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.ends.first))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.ends.second))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.vertex))));
|
||||
return Py::new_reference_to(ret);
|
||||
}
|
||||
|
||||
PyObject* DrawViewDimensionPy::getArrowPositions(PyObject* args)
|
||||
@@ -114,10 +114,10 @@ PyObject* DrawViewDimensionPy::getArrowPositions(PyObject* args)
|
||||
(void) args;
|
||||
DrawViewDimension* dvd = getDrawViewDimensionPtr();
|
||||
pointPair pts = dvd->getArrowPositions();
|
||||
PyObject* ret = PyList_New(0);
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.first)));
|
||||
PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.second)));
|
||||
return ret;
|
||||
Py::List ret;
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.first))));
|
||||
ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.second))));
|
||||
return Py::new_reference_to(ret);
|
||||
}
|
||||
PyObject *DrawViewDimensionPy::getCustomAttributes(const char* /*attr*/) const
|
||||
{
|
||||
|
||||
@@ -77,32 +77,32 @@ PyObject* DrawViewPartPy::getVisibleEdges(PyObject *args)
|
||||
{
|
||||
(void) args;
|
||||
DrawViewPart* dvp = getDrawViewPartPtr();
|
||||
PyObject* pEdgeList = PyList_New(0);
|
||||
Py::List pEdgeList;
|
||||
std::vector<TechDraw::BaseGeom*> geoms = dvp->getEdgeGeometry();
|
||||
for (auto& g: geoms) {
|
||||
if (g->hlrVisible) {
|
||||
PyObject* pEdge = new Part::TopoShapeEdgePy(new Part::TopoShape(g->occEdge));
|
||||
PyList_Append(pEdgeList, pEdge);
|
||||
pEdgeList.append(Py::asObject(pEdge));
|
||||
}
|
||||
}
|
||||
|
||||
return pEdgeList;
|
||||
return Py::new_reference_to(pEdgeList);
|
||||
}
|
||||
|
||||
PyObject* DrawViewPartPy::getHiddenEdges(PyObject *args)
|
||||
{
|
||||
(void) args;
|
||||
DrawViewPart* dvp = getDrawViewPartPtr();
|
||||
PyObject* pEdgeList = PyList_New(0);
|
||||
Py::List pEdgeList;
|
||||
std::vector<TechDraw::BaseGeom*> geoms = dvp->getEdgeGeometry();
|
||||
for (auto& g: geoms) {
|
||||
if (!g->hlrVisible) {
|
||||
PyObject* pEdge = new Part::TopoShapeEdgePy(new Part::TopoShape(g->occEdge));
|
||||
PyList_Append(pEdgeList, pEdge);
|
||||
pEdgeList.append(Py::asObject(pEdge));
|
||||
}
|
||||
}
|
||||
|
||||
return pEdgeList;
|
||||
return Py::new_reference_to(pEdgeList);
|
||||
}
|
||||
|
||||
PyObject* DrawViewPartPy::requestPaint(PyObject *args)
|
||||
|
||||
Reference in New Issue
Block a user