From 5652ca2c61f19192392f11ab24f1c4d3597b5c57 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 15 Sep 2015 18:19:36 +0200 Subject: [PATCH] + fix crash due to sloppy reference counting --- src/Gui/ApplicationPy.cpp | 8 ++++++++ src/Mod/Path/App/CommandPyImp.cpp | 2 ++ src/Mod/Path/App/PathPyImp.cpp | 1 + src/Mod/Path/App/TooltablePyImp.cpp | 10 +++++++++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Gui/ApplicationPy.cpp b/src/Gui/ApplicationPy.cpp index 7fdb1f9bc..fc3b779f8 100644 --- a/src/Gui/ApplicationPy.cpp +++ b/src/Gui/ApplicationPy.cpp @@ -891,6 +891,8 @@ PyObject* Application::sDoCommand(PyObject * /*self*/, PyObject *args,PyObject * if (!PyArg_ParseTuple(args, "s", &pstr)) // convert args: Python->C return NULL; // NULL triggers exception Command::doCommand(Command::Doc,pstr); + + Py_INCREF(Py_None); return Py_None; } @@ -900,6 +902,8 @@ PyObject* Application::sDoCommandGui(PyObject * /*self*/, PyObject *args,PyObjec if (!PyArg_ParseTuple(args, "s", &pstr)) // convert args: Python->C return NULL; // NULL triggers exception Command::runCommand(Command::Gui,pstr); + + Py_INCREF(Py_None); return Py_None; } @@ -909,6 +913,8 @@ PyObject* Application::sAddModule(PyObject * /*self*/, PyObject *args,PyObject * if (!PyArg_ParseTuple(args, "s", &pstr)) // convert args: Python->C return NULL; // NULL triggers exception Command::addModule(Command::Doc,pstr); + + Py_INCREF(Py_None); return Py_None; } @@ -917,5 +923,7 @@ PyObject* Application::sShowDownloads(PyObject * /*self*/, PyObject *args,PyObje if (!PyArg_ParseTuple(args, "")) // convert args: Python->C return NULL; // NULL triggers exception Gui::Dialog::DownloadManager::getInstance(); + + Py_INCREF(Py_None); return Py_None; } diff --git a/src/Mod/Path/App/CommandPyImp.cpp b/src/Mod/Path/App/CommandPyImp.cpp index 48d94595d..2054a1967 100644 --- a/src/Mod/Path/App/CommandPyImp.cpp +++ b/src/Mod/Path/App/CommandPyImp.cpp @@ -167,6 +167,7 @@ PyObject* CommandPy::setFromGCode(PyObject *args) if (PyArg_ParseTuple(args, "s", &pstr)) { std::string gcode(pstr); getCommandPtr()->setFromGCode(gcode); + Py_INCREF(Py_None); return Py_None; } throw Py::Exception("Argument must be a string"); @@ -211,6 +212,7 @@ PyObject *CommandPy::getCustomAttributes(const char* attr) const if (getCommandPtr()->Parameters.count(satt)) { return PyFloat_FromDouble(getCommandPtr()->Parameters[satt]); } + Py_INCREF(Py_None); return Py_None; } } diff --git a/src/Mod/Path/App/PathPyImp.cpp b/src/Mod/Path/App/PathPyImp.cpp index cdc18f927..46817bf33 100644 --- a/src/Mod/Path/App/PathPyImp.cpp +++ b/src/Mod/Path/App/PathPyImp.cpp @@ -189,6 +189,7 @@ PyObject* PathPy::setFromGCode(PyObject * args) if (PyArg_ParseTuple(args, "s", &pstr)) { std::string gcode(pstr); getToolpathPtr()->setFromGCode(gcode); + Py_INCREF(Py_None); return Py_None; } throw Py::Exception("Argument must be a string"); diff --git a/src/Mod/Path/App/TooltablePyImp.cpp b/src/Mod/Path/App/TooltablePyImp.cpp index 8aa3d148f..d339b6195 100644 --- a/src/Mod/Path/App/TooltablePyImp.cpp +++ b/src/Mod/Path/App/TooltablePyImp.cpp @@ -436,6 +436,7 @@ PyObject* TooltablePy::addTools(PyObject * args) Path::Tool &tool = *static_cast(o)->getToolPtr(); getTooltablePtr()->addTool(tool); //return new TooltablePy(new Path::Tooltable(*getTooltablePtr())); + Py_INCREF(Py_None); return Py_None; } PyErr_Clear(); @@ -448,6 +449,7 @@ PyObject* TooltablePy::addTools(PyObject * args) } } //return new TooltablePy(new Path::Tooltable(*getTooltablePtr())); + Py_INCREF(Py_None); return Py_None; } Py_Error(Base::BaseExceptionFreeCADError, "Wrong parameters - tool or list of tools expected"); @@ -461,6 +463,7 @@ PyObject* TooltablePy::setTool(PyObject * args) Path::Tool &tool = *static_cast(o)->getToolPtr(); getTooltablePtr()->setTool(tool,pos); //return new TooltablePy(new Path::Tooltable(*getTooltablePtr())); + Py_INCREF(Py_None); return Py_None; } Py_Error(Base::BaseExceptionFreeCADError, "Wrong parameters - expected tool and optional integer"); @@ -474,8 +477,12 @@ PyObject* TooltablePy::getTool(PyObject * args) { Path::Tool tool = getTooltablePtr()->getTool(pos); return new ToolPy(new Path::Tool(tool)); - } else + } + else + { + Py_INCREF(Py_None); return Py_None; + } } Py_Error(Base::BaseExceptionFreeCADError, "Argument must be integer"); } @@ -486,6 +493,7 @@ PyObject* TooltablePy::deleteTool(PyObject * args) if (PyArg_ParseTuple(args, "|i", &pos)) { getTooltablePtr()->deleteTool(pos); //return new TooltablePy(new Path::Tooltable(*getTooltablePtr())); + Py_INCREF(Py_None); return Py_None; } Py_Error(Base::BaseExceptionFreeCADError, "Wrong parameters - expected an integer (optional)");