fix for [#17878] Scripts operating on blender objects don't clear memory after a crash
This is an interesting bug since it is likely the cause of many other suspicious python crashes in blender. sys.last_traceback would store references to PyObjects at the point of the crash. it would only free these when sys.last_traceback was set again or on exit. This caused many crashes in the BGE while testing since python would end up freeing invalid game objects - When running scripts with errors, Blender would crash every 2-5 runs - in my test just now it crashed after 4 trys. It could also segfault blender, when (for eg) you run a script that has objects referenced. then load a new file and run another script that raises an error. In this case all the invalid Blender-Object's user counts would be decremented, even though none of the pointers were still valid.
This commit is contained in:
@@ -262,6 +262,13 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
|
||||
printf("Python compile error from controller \"%s\": \n", GetName().Ptr());
|
||||
//PyRun_SimpleString(m_scriptText.Ptr());
|
||||
PyErr_Print();
|
||||
|
||||
/* Added in 2.48a, the last_traceback can reference Objects for example, increasing
|
||||
* their user count. Not to mention holding references to wrapped data.
|
||||
* This is especially bad when the PyObject for the wrapped data is free'd, after blender
|
||||
* has alredy dealocated the pointer */
|
||||
PySys_SetObject( "last_traceback", Py_None);
|
||||
|
||||
return;
|
||||
}
|
||||
m_bModified=false;
|
||||
@@ -298,6 +305,13 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
|
||||
// something is wrong, tell the user what went wrong
|
||||
printf("Python script error from controller \"%s\": \n", GetName().Ptr());
|
||||
PyErr_Print();
|
||||
|
||||
/* Added in 2.48a, the last_traceback can reference Objects for example, increasing
|
||||
* their user count. Not to mention holding references to wrapped data.
|
||||
* This is especially bad when the PyObject for the wrapped data is free'd, after blender
|
||||
* has alredy dealocated the pointer */
|
||||
PySys_SetObject( "last_traceback", Py_None);
|
||||
|
||||
//PyRun_SimpleString(m_scriptText.Ptr());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user