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.
This commit is contained in:
		| @@ -340,7 +340,11 @@ static void node_dynamic_pyerror_print(bNode *node) | |||||||
| 	PyGILState_STATE gilstate = PyGILState_Ensure(); | 	PyGILState_STATE gilstate = PyGILState_Ensure(); | ||||||
|  |  | ||||||
| 	fprintf(stderr, "\nError in dynamic node script \"%s\":\n", node->name); | 	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"); } | 	else { fprintf(stderr, "Not a valid dynamic node Python script.\n"); } | ||||||
|  |  | ||||||
| 	PyGILState_Release(gilstate); | 	PyGILState_Release(gilstate); | ||||||
|   | |||||||
| @@ -97,6 +97,17 @@ PyObject *bpy_pydriver_Dict = NULL; | |||||||
| PyObject *bpy_orig_syspath_List = 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 |  * set up a weakref list for Armatures | ||||||
|  *    creates list in __main__ module dict  |  *    creates list in __main__ module dict  | ||||||
| @@ -107,30 +118,29 @@ static int setup_armature_weakrefs() | |||||||
| 	PyObject *maindict; | 	PyObject *maindict; | ||||||
| 	PyObject *main_module; | 	PyObject *main_module; | ||||||
| 	PyObject *list; | 	PyObject *list; | ||||||
| 	char *list_name = ARM_WEAKREF_LIST_NAME; | 	PyObject *list_name = PyString_FromString(ARM_WEAKREF_LIST_NAME); | ||||||
|  |  | ||||||
| 	main_module = PyImport_AddModule( "__main__"); | 	main_module = PyImport_AddModule( "__main__"); | ||||||
| 	if(main_module){ | 	if(main_module){ | ||||||
| 		PyObject *weakreflink; |  | ||||||
| 		maindict= PyModule_GetDict(main_module); | 		maindict= PyModule_GetDict(main_module); | ||||||
|  |  | ||||||
| 		/* check if there is already a dict entry for the armature weakrefs, | 		/* check if there is already a dict entry for the armature weakrefs, | ||||||
| 		 * and delete if so before making another one */ | 		 * and delete if so before making another one */ | ||||||
|  | 		 | ||||||
| 		weakreflink= PyDict_GetItemString(maindict,list_name); | 		if (PyDict_DelItem(maindict, list_name)==-1) | ||||||
| 		if( weakreflink != NULL ) { | 			PyErr_Clear(); | ||||||
| 			PyDict_DelItemString(maindict,list_name); |  | ||||||
| 			Py_XDECREF( weakreflink ); |  | ||||||
| 		} |  | ||||||
| 		 | 		 | ||||||
| 		list= PyList_New(0); | 		list= PyList_New(0); | ||||||
| 		if (PyDict_SetItemString(maindict, list_name, list) == -1){ | 		if (PyDict_SetItem(maindict, list_name, list) == -1){ | ||||||
| 			printf("Oops - setup_armature_weakrefs()\n"); | 			PyErr_Print(); | ||||||
|  | 			BPY_Err_Clear(); | ||||||
| 			Py_DECREF(list); | 			Py_DECREF(list); | ||||||
|  | 			Py_DECREF(list_name); | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		Py_DECREF(list); /* the dict owns it now */ | 		Py_DECREF(list); /* the dict owns it now */ | ||||||
| 	} | 	} | ||||||
|  | 	Py_DECREF(list_name); | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -532,16 +542,6 @@ static PyObject *traceback_getFilename( PyObject * tb ) | |||||||
| 	else return PyString_FromString("unknown"); | 	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	 | * Description: Blender Python error handler. This catches the error and	 | ||||||
| * stores filename and line number in a global   | * 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 */ | 	if( PyErr_Occurred(  ) ) {	/* if script ended after filesel */ | ||||||
| 		PyErr_Print(  );	/* eventual errors are handled now */ | 		PyErr_Print(  );	/* eventual errors are handled now */ | ||||||
|  | 		BPY_Err_Clear(  ); | ||||||
| 		error_pyscript(  ); | 		error_pyscript(  ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -1245,10 +1246,9 @@ static int bpy_pydriver_create_dict(void) | |||||||
| 	if (mod) { | 	if (mod) { | ||||||
| 		PyDict_SetItemString(d, "Blender", mod); | 		PyDict_SetItemString(d, "Blender", mod); | ||||||
| 		PyDict_SetItemString(d, "b", mod); | 		PyDict_SetItemString(d, "b", mod); | ||||||
| 		Py_DECREF(mod); | 		Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ | ||||||
| 		Py_DECREF(mod); |  | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Clear(); | 		BPY_Err_Clear(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mod = PyImport_ImportModule("math"); | 	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 */ | 		/* Only keep for backwards compat! - just import all math into root, they are standard */ | ||||||
| 		PyDict_SetItemString(d, "math", mod); | 		PyDict_SetItemString(d, "math", mod); | ||||||
| 		PyDict_SetItemString(d, "m", mod); | 		PyDict_SetItemString(d, "m", mod); | ||||||
| 		Py_DECREF(mod); | 		Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ | ||||||
| 		Py_DECREF(mod); | 	} else { | ||||||
| 	}  | 		BPY_Err_Clear(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	mod = PyImport_ImportModule("Blender.Noise"); | 	mod = PyImport_ImportModule("Blender.Noise"); | ||||||
| 	if (mod) { | 	if (mod) { | ||||||
| 		PyDict_SetItemString(d, "noise", mod); | 		PyDict_SetItemString(d, "noise", mod); | ||||||
| 		PyDict_SetItemString(d, "n", mod); | 		PyDict_SetItemString(d, "n", mod); | ||||||
| 		Py_DECREF(mod); | 		Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ | ||||||
| 		Py_DECREF(mod); |  | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Clear(); | 		BPY_Err_Clear(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* If there's a Blender text called pydrivers.py, import it. | 	/* If there's a Blender text called pydrivers.py, import it. | ||||||
| @@ -1279,10 +1279,9 @@ static int bpy_pydriver_create_dict(void) | |||||||
| 		if (mod) { | 		if (mod) { | ||||||
| 			PyDict_SetItemString(d, "pydrivers", mod); | 			PyDict_SetItemString(d, "pydrivers", mod); | ||||||
| 			PyDict_SetItemString(d, "p", mod); | 			PyDict_SetItemString(d, "p", mod); | ||||||
| 			Py_DECREF(mod); | 			Py_DECREF(mod); /* 2 refs above are cleared with the dict, only decref the ref from PyImport_ImportModule */ | ||||||
| 			Py_DECREF(mod); |  | ||||||
| 		} else { | 		} else { | ||||||
| 			PyErr_Clear(); | 			BPY_Err_Clear(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	/* short aliases for some Get() functions: */ | 	/* short aliases for some Get() functions: */ | ||||||
| @@ -1297,7 +1296,7 @@ static int bpy_pydriver_create_dict(void) | |||||||
| 			Py_DECREF(fcn); | 			Py_DECREF(fcn); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Clear(); | 		BPY_Err_Clear(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	/* TODO - change these */ | 	/* TODO - change these */ | ||||||
| @@ -1311,7 +1310,7 @@ static int bpy_pydriver_create_dict(void) | |||||||
| 			Py_DECREF(fcn); | 			Py_DECREF(fcn); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Clear(); | 		BPY_Err_Clear(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* ma(matname) == Blender.Material.Get(matname) */ | 	/* ma(matname) == Blender.Material.Get(matname) */ | ||||||
| @@ -1324,7 +1323,7 @@ static int bpy_pydriver_create_dict(void) | |||||||
| 			Py_DECREF(fcn); | 			Py_DECREF(fcn); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Clear(); | 		BPY_Err_Clear(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return 0; | 	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); | 		fprintf(stderr, "\nError in Ipo Driver: No Object\nThis is the failed Python expression:\n'%s'\n\n", driver->name); | ||||||
| 	 | 	 | ||||||
| 	PyErr_Print(); | 	PyErr_Print(); | ||||||
|  | 	BPY_Err_Clear(); | ||||||
|  |  | ||||||
| 	return 0.0f; | 	return 0.0f; | ||||||
| } | } | ||||||
| @@ -1445,7 +1445,7 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) | |||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		retval = NULL; | 		retval = NULL; | ||||||
| 		 | 		 | ||||||
| 		/* try to find NUM_TARGETS */ | 		/* try to find NUM_TARGETS */ | ||||||
| @@ -1578,9 +1578,9 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase | |||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1589,7 +1589,7 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase | |||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (retval) {Py_XDECREF( retval );} | 	Py_DECREF( retval ); | ||||||
| 	retval = NULL; | 	retval = NULL; | ||||||
| 	 | 	 | ||||||
| 	gval = PyDict_GetItemString(globals, "doConstraint"); | 	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"); | 		printf("ERROR: no doConstraint function in constraint!\n"); | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1612,15 +1612,15 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase | |||||||
| 	if (PyFunction_Check(gval)) { | 	if (PyFunction_Check(gval)) { | ||||||
| 		pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop); | 		pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop); | ||||||
| 		retval = PyObject_CallObject(gval, pyargs); | 		retval = PyObject_CallObject(gval, pyargs); | ||||||
| 		Py_XDECREF(pyargs); | 		Py_DECREF(pyargs); | ||||||
| 	}  | 	}  | ||||||
| 	else { | 	else { | ||||||
| 		printf("ERROR: doConstraint is supposed to be a function!\n"); | 		printf("ERROR: doConstraint is supposed to be a function!\n"); | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1634,9 +1634,9 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase | |||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		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"); | 		printf("Error in PyConstraint - doConstraint: Function not returning a matrix!\n"); | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		Py_XDECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		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"); | 		printf("Error in PyConstraint - doConstraint: Matrix returned is the wrong size!\n"); | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(srcmat); | 		Py_DECREF(srcmat); | ||||||
| 		Py_XDECREF(tarmats); | 		Py_DECREF(tarmats); | ||||||
| 		Py_XDECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1687,10 +1687,10 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	/* free temp objects */ | 	/* free temp objects */ | ||||||
| 	Py_XDECREF(idprop); | 	Py_DECREF(idprop); | ||||||
| 	Py_XDECREF(srcmat); | 	Py_DECREF(srcmat); | ||||||
| 	Py_XDECREF(tarmats); | 	Py_DECREF(tarmats); | ||||||
| 	Py_XDECREF(retval); | 	Py_DECREF(retval); | ||||||
| 	 | 	 | ||||||
| 	/* clear globals */ | 	/* clear globals */ | ||||||
| 	ReleaseGlobalDictionary(globals); | 	ReleaseGlobalDictionary(globals); | ||||||
| @@ -1745,10 +1745,10 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1757,17 +1757,17 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Py_XDECREF(retval); | 	Py_DECREF(retval); | ||||||
| 	retval = NULL; | 	retval = NULL; | ||||||
| 	 | 	 | ||||||
| 	/* try to find doTarget function to set the target matrix */ | 	/* try to find doTarget function to set the target matrix */ | ||||||
| 	gval = PyDict_GetItemString(globals, "doTarget"); | 	gval = PyDict_GetItemString(globals, "doTarget"); | ||||||
| 	if (!gval) { | 	if (!gval) { | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1780,16 +1780,16 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 	if (PyFunction_Check(gval)) { | 	if (PyFunction_Check(gval)) { | ||||||
| 		pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop); | 		pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop); | ||||||
| 		retval = PyObject_CallObject(gval, pyargs); | 		retval = PyObject_CallObject(gval, pyargs); | ||||||
| 		Py_XDECREF(pyargs); | 		Py_DECREF(pyargs); | ||||||
| 	}  | 	}  | ||||||
| 	else { | 	else { | ||||||
| 		printf("ERROR: doTarget is supposed to be a function!\n"); | 		printf("ERROR: doTarget is supposed to be a function!\n"); | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1804,10 +1804,10 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 		 | 		 | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1819,11 +1819,11 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 	if (!PyObject_TypeCheck(retval, &matrix_Type)) { | 	if (!PyObject_TypeCheck(retval, &matrix_Type)) { | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		Py_XDECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		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"); | 		printf("Error in PyConstraint - doTarget: Matrix returned is the wrong size!\n"); | ||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(tar); | 		Py_DECREF(tar); | ||||||
| 		Py_XDECREF(subtar); | 		Py_DECREF(subtar); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_XDECREF(tarmat); | 		Py_DECREF(tarmat); | ||||||
| 		Py_XDECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		 | 		 | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
|  |  | ||||||
| @@ -1858,11 +1858,11 @@ void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	/* free temp objects */ | 	/* free temp objects */ | ||||||
| 	Py_XDECREF(tar); | 	Py_DECREF(tar); | ||||||
| 	Py_XDECREF(subtar); | 	Py_DECREF(subtar); | ||||||
| 	Py_XDECREF(idprop); | 	Py_DECREF(idprop); | ||||||
| 	Py_XDECREF(tarmat); | 	Py_DECREF(tarmat); | ||||||
| 	Py_XDECREF(retval); | 	Py_DECREF(retval); | ||||||
| 	 | 	 | ||||||
| 	/* clear globals */ | 	/* clear globals */ | ||||||
| 	ReleaseGlobalDictionary(globals); | 	ReleaseGlobalDictionary(globals); | ||||||
| @@ -1897,7 +1897,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) | |||||||
| 		con->flag |= PYCON_SCRIPTERROR; | 		con->flag |= PYCON_SCRIPTERROR; | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		 | 		 | ||||||
| 		PyGILState_Release(gilstate); | 		PyGILState_Release(gilstate); | ||||||
| 		 | 		 | ||||||
| @@ -1913,7 +1913,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) | |||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		ReleaseGlobalDictionary( globals ); | 		ReleaseGlobalDictionary( globals ); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
|  |  | ||||||
| 		PyGILState_Release(gilstate); | 		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"); | 		printf("ERROR: getSettings is supposed to be a function!\n"); | ||||||
| 		ReleaseGlobalDictionary( globals ); | 		ReleaseGlobalDictionary( globals ); | ||||||
| 		 | 		 | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		 | 		 | ||||||
| 		PyGILState_Release(gilstate); | 		PyGILState_Release(gilstate); | ||||||
| 		 | 		 | ||||||
| @@ -1941,7 +1941,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) | |||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		 | 		 | ||||||
| 		PyGILState_Release(gilstate); | 		PyGILState_Release(gilstate); | ||||||
| 		 | 		 | ||||||
| @@ -1952,7 +1952,7 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2) | |||||||
| 		ReleaseGlobalDictionary(globals); | 		ReleaseGlobalDictionary(globals); | ||||||
| 		 | 		 | ||||||
| 		/* free temp objects */ | 		/* free temp objects */ | ||||||
| 		Py_XDECREF(idprop); | 		Py_DECREF(idprop); | ||||||
| 		Py_DECREF(retval); | 		Py_DECREF(retval); | ||||||
| 		 | 		 | ||||||
| 		PyGILState_Release(gilstate); | 		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); | 	fprintf(stderr, "\nError in button evaluation:\nThis is the failed Python expression:\n'%s'\n\n", expr); | ||||||
|  |  | ||||||
| 	PyErr_Print(); | 	PyErr_Print(); | ||||||
|  | 	BPY_Err_Clear(); | ||||||
|  |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -614,6 +614,9 @@ static void exit_pydraw( SpaceScript * sc, short err ) | |||||||
|  |  | ||||||
| 	if( err ) { | 	if( err ) { | ||||||
| 		PyErr_Print(  ); | 		PyErr_Print(  ); | ||||||
|  | 		PyErr_Clear(  ); | ||||||
|  | 		PySys_SetObject("last_traceback", NULL); | ||||||
|  | 		 | ||||||
| 		script->flags = 0;	/* mark script struct for deletion */ | 		script->flags = 0;	/* mark script struct for deletion */ | ||||||
| 		SCRIPT_SET_NULL(script); | 		SCRIPT_SET_NULL(script); | ||||||
| 		script->scriptname[0] = '\0'; | 		script->scriptname[0] = '\0'; | ||||||
| @@ -838,6 +841,8 @@ static void exec_but_callback(void *pyobj, void *data) | |||||||
| 	if (!result) { | 	if (!result) { | ||||||
| 		Py_DECREF(pyvalue); | 		Py_DECREF(pyvalue); | ||||||
| 		PyErr_Print(  ); | 		PyErr_Print(  ); | ||||||
|  | 		PyErr_Clear(  ); | ||||||
|  | 		PySys_SetObject("last_traceback", NULL); | ||||||
| 		error_pyscript(  ); | 		error_pyscript(  ); | ||||||
| 	} | 	} | ||||||
| 	Py_XDECREF( result ); | 	Py_XDECREF( result ); | ||||||
| @@ -1129,6 +1134,8 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args ) | |||||||
| 	 | 	 | ||||||
| 	if (!result) { | 	if (!result) { | ||||||
| 		PyErr_Print(  ); | 		PyErr_Print(  ); | ||||||
|  | 		PyErr_Clear(  ); | ||||||
|  | 		PySys_SetObject("last_traceback", NULL); | ||||||
| 		error_pyscript(  ); | 		error_pyscript(  ); | ||||||
| 	} else { | 	} else { | ||||||
| 		/* copied from do_clever_numbuts in toolbox.c */ | 		/* copied from do_clever_numbuts in toolbox.c */ | ||||||
|   | |||||||
| @@ -84,6 +84,8 @@ PyObject *importText( char *name ) | |||||||
|  |  | ||||||
| 		if( PyErr_Occurred(  ) ) { | 		if( PyErr_Occurred(  ) ) { | ||||||
| 			PyErr_Print(  ); | 			PyErr_Print(  ); | ||||||
|  | 			PyErr_Clear(  ); | ||||||
|  | 			PySys_SetObject("last_traceback", NULL); | ||||||
| 			free_compiled_text( text ); | 			free_compiled_text( text ); | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 		} | 		} | ||||||
| @@ -138,6 +140,8 @@ PyObject *reimportText( PyObject *module ) | |||||||
| 	/* if compile failed.... return this error */ | 	/* if compile failed.... return this error */ | ||||||
| 	if( PyErr_Occurred(  ) ) { | 	if( PyErr_Occurred(  ) ) { | ||||||
| 		PyErr_Print(  ); | 		PyErr_Print(  ); | ||||||
|  | 		PyErr_Clear(  ); | ||||||
|  | 		PySys_SetObject("last_traceback", NULL); | ||||||
| 		free_compiled_text( text ); | 		free_compiled_text( text ); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| @@ -182,7 +186,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args,  PyObject * k | |||||||
| 		Py_XDECREF( exception ); | 		Py_XDECREF( exception ); | ||||||
| 		Py_XDECREF( err ); | 		Py_XDECREF( err ); | ||||||
| 		Py_XDECREF( tb ); | 		Py_XDECREF( tb ); | ||||||
| 		printf( "imported from text buffer...\n" ); | 		/* printf( "imported from text buffer...\n" ); */ | ||||||
| 	} else { | 	} else { | ||||||
| 		PyErr_Restore( exception, err, tb ); | 		PyErr_Restore( exception, err, tb ); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -74,6 +74,7 @@ | |||||||
| #include "BIF_toolbox.h" | #include "BIF_toolbox.h" | ||||||
|  |  | ||||||
| #include "BKE_global.h" | #include "BKE_global.h" | ||||||
|  | #include "BKE_scene.h" | ||||||
| #include "BKE_library.h" | #include "BKE_library.h" | ||||||
| #include "BKE_main.h" | #include "BKE_main.h" | ||||||
| #include "BKE_sca.h" | #include "BKE_sca.h" | ||||||
|   | |||||||
| @@ -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 */ | /* 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]) | static float angle_2d_clockwise(const float p1[2], const float p2[2], const float p3[2]) | ||||||
| { | { | ||||||
| 	float v1[2], v2[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]); | 	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_1 (1) | ||||||
| #define ISECT_2 (1<<1) | #define ISECT_2 (1<<1) | ||||||
|   | |||||||
| @@ -300,7 +300,7 @@ bool SCA_PythonController::Compile() | |||||||
| 		 * their user count. Not to mention holding references to wrapped data. | 		 * 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  | 		 * This is especially bad when the PyObject for the wrapped data is free'd, after blender  | ||||||
| 		 * has alredy dealocated the pointer */ | 		 * has alredy dealocated the pointer */ | ||||||
| 		PySys_SetObject( (char *)"last_traceback", Py_None); | 		PySys_SetObject( (char *)"last_traceback", NULL); | ||||||
| 		PyErr_Clear(); /* just to be sure */ | 		PyErr_Clear(); /* just to be sure */ | ||||||
| 		 | 		 | ||||||
| 		return false; | 		return false; | ||||||
| @@ -358,7 +358,7 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr) | |||||||
| 		 * their user count. Not to mention holding references to wrapped data. | 		 * 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  | 		 * This is especially bad when the PyObject for the wrapped data is free'd, after blender  | ||||||
| 		 * has alredy dealocated the pointer */ | 		 * has alredy dealocated the pointer */ | ||||||
| 		PySys_SetObject( (char *)"last_traceback", Py_None); | 		PySys_SetObject( (char *)"last_traceback", NULL); | ||||||
| 		PyErr_Clear(); /* just to be sure */ | 		PyErr_Clear(); /* just to be sure */ | ||||||
| 		 | 		 | ||||||
| 		//PyRun_SimpleString(m_scriptText.Ptr()); | 		//PyRun_SimpleString(m_scriptText.Ptr()); | ||||||
|   | |||||||
| @@ -611,7 +611,7 @@ int KX_CameraActuator::pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF | |||||||
| 	if (self->m_ob) | 	if (self->m_ob) | ||||||
| 		self->m_ob->UnregisterActuator(self);	 | 		self->m_ob->UnregisterActuator(self);	 | ||||||
|  |  | ||||||
| 	if (self->m_ob = (SCA_IObject*)gameobj) | 	if ((self->m_ob = (SCA_IObject*)gameobj)) | ||||||
| 		self->m_ob->RegisterActuator(self); | 		self->m_ob->RegisterActuator(self); | ||||||
| 	 | 	 | ||||||
| 	return 0; | 	return 0; | ||||||
|   | |||||||
| @@ -109,6 +109,8 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI | |||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			PyErr_Print(); | 			PyErr_Print(); | ||||||
|  | 			PyErr_Clear(); | ||||||
|  | 			PySys_SetObject( (char *)"last_traceback", NULL); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
|   | |||||||
| @@ -1346,7 +1346,7 @@ struct OcclusionBuffer | |||||||
| 	static int	clip(const btVector4* pi,btVector4* po) | 	static int	clip(const btVector4* pi,btVector4* po) | ||||||
| 	{ | 	{ | ||||||
| 		btScalar	s[2*NP]; | 		btScalar	s[2*NP]; | ||||||
| 		btVector4	pn[2*NP], *p; | 		btVector4	pn[2*NP]; | ||||||
| 		int			i, j, m, n, ni; | 		int			i, j, m, n, ni; | ||||||
| 		// deal with near clipping | 		// deal with near clipping | ||||||
| 		for(i=0, m=0;i<NP;++i) | 		for(i=0, m=0;i<NP;++i) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user