From efb7dd86ff001efe26fba1caef70a87806d138f6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 15 Apr 2009 04:34:27 +0000 Subject: Fix for own recent reference count error. - The armature weakref list was being incref'd twice then decrefed twice (incref and decref were used incorrectly), now only once. My 'fix' broke this. - In bpy_pydriver_create_dict the 2 refs added from running PyDict_SetItemString twice were undone when clearing the dictionary (added comment) - changed Py_XDECREF to Py_DECREF int BPY_pyconstraint_update and BPY_pyconstraint_target, Py_XDECREF checs for NULL value which would have crashed blender before it got to Py_XDECREF anyway. - after every error is reported (PyErr_Print), remove sys.last_traceback and clear the error, I found this fixed certain crashes (usually when starting the game engine or exiting blender), so best do this all the time. - header_text.c, CcdPhysicsEnvironment.cpp, KX_CameraActuator.cpp - remove some warnings. --- .../blender/nodes/intern/SHD_nodes/SHD_dynamic.c | 6 +- source/blender/python/BPY_interface.c | 201 +++++++++++---------- source/blender/python/api2_2x/Draw.c | 7 + .../blender/python/api2_2x/bpy_internal_import.c | 6 +- source/blender/src/header_text.c | 1 + source/blender/src/imagepaint.c | 3 +- .../gameengine/GameLogic/SCA_PythonController.cpp | 4 +- source/gameengine/Ketsji/KX_CameraActuator.cpp | 2 +- source/gameengine/Ketsji/KX_PolygonMaterial.cpp | 2 + .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 2 +- 10 files changed, 127 insertions(+), 107 deletions(-) diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c index 2065ac2ed33..88efd47fa66 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c @@ -340,7 +340,11 @@ static void node_dynamic_pyerror_print(bNode *node) PyGILState_STATE gilstate = PyGILState_Ensure(); fprintf(stderr, "\nError in dynamic node script \"%s\":\n", node->name); - if (PyErr_Occurred()) { PyErr_Print(); } + if (PyErr_Occurred()) { + PyErr_Print(); + PyErr_Clear(); + PySys_SetObject("last_traceback", NULL); + } else { fprintf(stderr, "Not a valid dynamic node Python script.\n"); } PyGILState_Release(gilstate); diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index 7b992dff472..c46c6c083b2 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -97,6 +97,17 @@ PyObject *bpy_pydriver_Dict = NULL; PyObject *bpy_orig_syspath_List = NULL; +static void BPY_Err_Clear(void) +{ + /* 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", NULL); + + PyErr_Clear(); +} + /* * set up a weakref list for Armatures * creates list in __main__ module dict @@ -107,30 +118,29 @@ static int setup_armature_weakrefs() PyObject *maindict; PyObject *main_module; PyObject *list; - char *list_name = ARM_WEAKREF_LIST_NAME; + PyObject *list_name = PyString_FromString(ARM_WEAKREF_LIST_NAME); main_module = PyImport_AddModule( "__main__"); if(main_module){ - PyObject *weakreflink; maindict= PyModule_GetDict(main_module); /* check if there is already a dict entry for the armature weakrefs, * and delete if so before making another one */ - - weakreflink= PyDict_GetItemString(maindict,list_name); - if( weakreflink != NULL ) { - PyDict_DelItemString(maindict,list_name); - Py_XDECREF( weakreflink ); - } + + if (PyDict_DelItem(maindict, list_name)==-1) + PyErr_Clear(); list= PyList_New(0); - if (PyDict_SetItemString(maindict, list_name, list) == -1){ - printf("Oops - setup_armature_weakrefs()\n"); + if (PyDict_SetItem(maindict, list_name, list) == -1){ + PyErr_Print(); + BPY_Err_Clear(); Py_DECREF(list); + Py_DECREF(list_name); return 0; } Py_DECREF(list); /* the dict owns it now */ } + Py_DECREF(list_name); return 1; } @@ -532,16 +542,6 @@ static PyObject *traceback_getFilename( PyObject * tb ) else return PyString_FromString("unknown"); } -static void BPY_Err_Clear(void) -{ - /* 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); - - PyErr_Clear(); -} /**************************************************************************** * Description: Blender Python error handler. This catches the error and * stores filename and line number in a global @@ -1137,6 +1137,7 @@ void BPY_free_finished_script( Script * script ) if( PyErr_Occurred( ) ) { /* if script ended after filesel */ PyErr_Print( ); /* eventual errors are handled now */ + BPY_Err_Clear( ); error_pyscript( ); } @@ -1245,10 +1246,9 @@ static int bpy_pydriver_create_dict(void) if (mod) { PyDict_SetItemString(d, "Blender", mod); PyDict_SetItemString(d, "b", mod); - Py_DECREF(mod); - Py_DECREF(mod); + Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ } else { - PyErr_Clear(); + BPY_Err_Clear(); } mod = PyImport_ImportModule("math"); @@ -1258,18 +1258,18 @@ static int bpy_pydriver_create_dict(void) /* Only keep for backwards compat! - just import all math into root, they are standard */ PyDict_SetItemString(d, "math", mod); PyDict_SetItemString(d, "m", mod); - Py_DECREF(mod); - Py_DECREF(mod); - } + Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ + } else { + BPY_Err_Clear(); + } mod = PyImport_ImportModule("Blender.Noise"); if (mod) { PyDict_SetItemString(d, "noise", mod); PyDict_SetItemString(d, "n", mod); - Py_DECREF(mod); - Py_DECREF(mod); + Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ } else { - PyErr_Clear(); + BPY_Err_Clear(); } /* If there's a Blender text called pydrivers.py, import it. @@ -1279,10 +1279,9 @@ static int bpy_pydriver_create_dict(void) if (mod) { PyDict_SetItemString(d, "pydrivers", mod); PyDict_SetItemString(d, "p", mod); - Py_DECREF(mod); - Py_DECREF(mod); + Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ } else { - PyErr_Clear(); + BPY_Err_Clear(); } } /* short aliases for some Get() functions: */ @@ -1297,7 +1296,7 @@ static int bpy_pydriver_create_dict(void) Py_DECREF(fcn); } } else { - PyErr_Clear(); + BPY_Err_Clear(); } /* TODO - change these */ @@ -1311,7 +1310,7 @@ static int bpy_pydriver_create_dict(void) Py_DECREF(fcn); } } else { - PyErr_Clear(); + BPY_Err_Clear(); } /* ma(matname) == Blender.Material.Get(matname) */ @@ -1324,7 +1323,7 @@ static int bpy_pydriver_create_dict(void) Py_DECREF(fcn); } } else { - PyErr_Clear(); + BPY_Err_Clear(); } return 0; @@ -1350,6 +1349,7 @@ static float pydriver_error(IpoDriver *driver) { fprintf(stderr, "\nError in Ipo Driver: No Object\nThis is the failed Python expression:\n'%s'\n\n", driver->name); PyErr_Print(); + BPY_Err_Clear(); return 0.0f; } @@ -1445,7 +1445,7 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) return; } - Py_XDECREF(retval); + Py_DECREF(retval); retval = NULL; /* try to find NUM_TARGETS */ @@ -1578,9 +1578,9 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase con->flag |= PYCON_SCRIPTERROR; /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); ReleaseGlobalDictionary(globals); @@ -1589,7 +1589,7 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase return; } - if (retval) {Py_XDECREF( retval );} + Py_DECREF( retval ); retval = NULL; gval = PyDict_GetItemString(globals, "doConstraint"); @@ -1597,9 +1597,9 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase printf("ERROR: no doConstraint function in constraint!\n"); /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); ReleaseGlobalDictionary(globals); @@ -1612,15 +1612,15 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase if (PyFunction_Check(gval)) { pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop); retval = PyObject_CallObject(gval, pyargs); - Py_XDECREF(pyargs); + Py_DECREF(pyargs); } else { printf("ERROR: doConstraint is supposed to be a function!\n"); con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); ReleaseGlobalDictionary(globals); @@ -1634,9 +1634,9 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase con->flag |= PYCON_SCRIPTERROR; /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); ReleaseGlobalDictionary(globals); @@ -1650,10 +1650,10 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase printf("Error in PyConstraint - doConstraint: Function not returning a matrix!\n"); con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); + Py_DECREF(retval); ReleaseGlobalDictionary(globals); @@ -1667,10 +1667,10 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase printf("Error in PyConstraint - doConstraint: Matrix returned is the wrong size!\n"); con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); + Py_DECREF(retval); ReleaseGlobalDictionary(globals); @@ -1687,10 +1687,10 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase } /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); + Py_DECREF(idprop); + Py_DECREF(srcmat); + Py_DECREF(tarmats); + Py_DECREF(retval); /* clear globals */ ReleaseGlobalDictionary(globals); @@ -1745,10 +1745,10 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) con->flag |= PYCON_SCRIPTERROR; /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); ReleaseGlobalDictionary(globals); @@ -1757,17 +1757,17 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) return; } - Py_XDECREF(retval); + Py_DECREF(retval); retval = NULL; /* try to find doTarget function to set the target matrix */ gval = PyDict_GetItemString(globals, "doTarget"); if (!gval) { /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); ReleaseGlobalDictionary(globals); @@ -1780,16 +1780,16 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) if (PyFunction_Check(gval)) { pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop); retval = PyObject_CallObject(gval, pyargs); - Py_XDECREF(pyargs); + Py_DECREF(pyargs); } else { printf("ERROR: doTarget is supposed to be a function!\n"); con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); ReleaseGlobalDictionary(globals); @@ -1804,10 +1804,10 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); ReleaseGlobalDictionary(globals); @@ -1819,11 +1819,11 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) if (!PyObject_TypeCheck(retval, &matrix_Type)) { con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); + Py_DECREF(retval); ReleaseGlobalDictionary(globals); @@ -1837,11 +1837,11 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) printf("Error in PyConstraint - doTarget: Matrix returned is the wrong size!\n"); con->flag |= PYCON_SCRIPTERROR; - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); + Py_DECREF(retval); ReleaseGlobalDictionary(globals); @@ -1858,11 +1858,11 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) } /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); + Py_DECREF(tar); + Py_DECREF(subtar); + Py_DECREF(idprop); + Py_DECREF(tarmat); + Py_DECREF(retval); /* clear globals */ ReleaseGlobalDictionary(globals); @@ -1897,7 +1897,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) con->flag |= PYCON_SCRIPTERROR; /* free temp objects */ - Py_XDECREF(idprop); + Py_DECREF(idprop); PyGILState_Release(gilstate); @@ -1913,7 +1913,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) /* free temp objects */ ReleaseGlobalDictionary( globals ); - Py_XDECREF(idprop); + Py_DECREF(idprop); PyGILState_Release(gilstate); @@ -1928,7 +1928,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) printf("ERROR: getSettings is supposed to be a function!\n"); ReleaseGlobalDictionary( globals ); - Py_XDECREF(idprop); + Py_DECREF(idprop); PyGILState_Release(gilstate); @@ -1941,7 +1941,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) /* free temp objects */ ReleaseGlobalDictionary(globals); - Py_XDECREF(idprop); + Py_DECREF(idprop); PyGILState_Release(gilstate); @@ -1952,7 +1952,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) ReleaseGlobalDictionary(globals); /* free temp objects */ - Py_XDECREF(idprop); + Py_DECREF(idprop); Py_DECREF(retval); PyGILState_Release(gilstate); @@ -2107,6 +2107,7 @@ static int bpy_button_eval_error(char *expr) { fprintf(stderr, "\nError in button evaluation:\nThis is the failed Python expression:\n'%s'\n\n", expr); PyErr_Print(); + BPY_Err_Clear(); return -1; } diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c index 2af2261808b..57b3869d775 100644 --- a/source/blender/python/api2_2x/Draw.c +++ b/source/blender/python/api2_2x/Draw.c @@ -614,6 +614,9 @@ static void exit_pydraw( SpaceScript * sc, short err ) if( err ) { PyErr_Print( ); + PyErr_Clear( ); + PySys_SetObject("last_traceback", NULL); + script->flags = 0; /* mark script struct for deletion */ SCRIPT_SET_NULL(script); script->scriptname[0] = '\0'; @@ -838,6 +841,8 @@ static void exec_but_callback(void *pyobj, void *data) if (!result) { Py_DECREF(pyvalue); PyErr_Print( ); + PyErr_Clear( ); + PySys_SetObject("last_traceback", NULL); error_pyscript( ); } Py_XDECREF( result ); @@ -1129,6 +1134,8 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args ) if (!result) { PyErr_Print( ); + PyErr_Clear( ); + PySys_SetObject("last_traceback", NULL); error_pyscript( ); } else { /* copied from do_clever_numbuts in toolbox.c */ diff --git a/source/blender/python/api2_2x/bpy_internal_import.c b/source/blender/python/api2_2x/bpy_internal_import.c index d022fddeb57..9d2d15e0991 100644 --- a/source/blender/python/api2_2x/bpy_internal_import.c +++ b/source/blender/python/api2_2x/bpy_internal_import.c @@ -84,6 +84,8 @@ PyObject *importText( char *name ) if( PyErr_Occurred( ) ) { PyErr_Print( ); + PyErr_Clear( ); + PySys_SetObject("last_traceback", NULL); free_compiled_text( text ); return NULL; } @@ -138,6 +140,8 @@ PyObject *reimportText( PyObject *module ) /* if compile failed.... return this error */ if( PyErr_Occurred( ) ) { PyErr_Print( ); + PyErr_Clear( ); + PySys_SetObject("last_traceback", NULL); free_compiled_text( text ); return NULL; } @@ -182,7 +186,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k Py_XDECREF( exception ); Py_XDECREF( err ); Py_XDECREF( tb ); - printf( "imported from text buffer...\n" ); + /* printf( "imported from text buffer...\n" ); */ } else { PyErr_Restore( exception, err, tb ); } diff --git a/source/blender/src/header_text.c b/source/blender/src/header_text.c index 050ff192df6..850b7d6cab1 100644 --- a/source/blender/src/header_text.c +++ b/source/blender/src/header_text.c @@ -74,6 +74,7 @@ #include "BIF_toolbox.h" #include "BKE_global.h" +#include "BKE_scene.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_sca.h" diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c index 09666f4819d..ede6679b9f5 100644 --- a/source/blender/src/imagepaint.c +++ b/source/blender/src/imagepaint.c @@ -1921,7 +1921,7 @@ static void rect_to_uvspace_persp( } /* This works as we need it to but we can save a few steps and not use it */ - +#if 0 static float angle_2d_clockwise(const float p1[2], const float p2[2], const float p3[2]) { float v1[2], v2[2]; @@ -1931,6 +1931,7 @@ static float angle_2d_clockwise(const float p1[2], const float p2[2], const floa return -atan2(v1[0]*v2[1] - v1[1]*v2[0], v1[0]*v2[0]+v1[1]*v2[1]); } +#endif #define ISECT_1 (1) #define ISECT_2 (1<<1) diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp index 0e6b9d1e8f1..1c5b597f937 100644 --- a/source/gameengine/GameLogic/SCA_PythonController.cpp +++ b/source/gameengine/GameLogic/SCA_PythonController.cpp @@ -300,7 +300,7 @@ bool SCA_PythonController::Compile() * 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( (char *)"last_traceback", Py_None); + PySys_SetObject( (char *)"last_traceback", NULL); PyErr_Clear(); /* just to be sure */ return false; @@ -358,7 +358,7 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr) * 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( (char *)"last_traceback", Py_None); + PySys_SetObject( (char *)"last_traceback", NULL); PyErr_Clear(); /* just to be sure */ //PyRun_SimpleString(m_scriptText.Ptr()); diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp index 0118e490773..329d31cfa25 100644 --- a/source/gameengine/Ketsji/KX_CameraActuator.cpp +++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp @@ -611,7 +611,7 @@ int KX_CameraActuator::pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF if (self->m_ob) self->m_ob->UnregisterActuator(self); - if (self->m_ob = (SCA_IObject*)gameobj) + if ((self->m_ob = (SCA_IObject*)gameobj)) self->m_ob->RegisterActuator(self); return 0; diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp index 56a1daa7544..056442f77d9 100644 --- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp +++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp @@ -109,6 +109,8 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI else { PyErr_Print(); + PyErr_Clear(); + PySys_SetObject( (char *)"last_traceback", NULL); } } else diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 858416bae6a..3e1e0294321 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -1346,7 +1346,7 @@ struct OcclusionBuffer static int clip(const btVector4* pi,btVector4* po) { btScalar s[2*NP]; - btVector4 pn[2*NP], *p; + btVector4 pn[2*NP]; int i, j, m, n, ni; // deal with near clipping for(i=0, m=0;i