[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17170] trunk/blender/source: make sure BPY_Err_Handle clears python errors, even if the exception cant be printed.

Campbell Barton ideasman42 at gmail.com
Wed Oct 22 09:09:15 CEST 2008


Revision: 17170
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17170
Author:   campbellbarton
Date:     2008-10-22 09:09:15 +0200 (Wed, 22 Oct 2008)

Log Message:
-----------
make sure BPY_Err_Handle clears python errors, even if the exception cant be printed. Added PyErr_Clear() incase there are other references to exception data (sys.exc_info() from python)

Modified Paths:
--------------
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp

Modified: trunk/blender/source/blender/python/BPY_interface.c
===================================================================
--- trunk/blender/source/blender/python/BPY_interface.c	2008-10-22 07:02:30 UTC (rev 17169)
+++ trunk/blender/source/blender/python/BPY_interface.c	2008-10-22 07:09:15 UTC (rev 17170)
@@ -532,6 +532,16 @@
 	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  
@@ -542,6 +552,7 @@
 
 	if( !script_name ) {
 		printf( "Error: script has NULL name\n" );
+		BPY_Err_Clear();
 		return;
 	}
 
@@ -568,8 +579,9 @@
 		} else {
 			g_script_error.lineno = -1;
 		}
-		/* this avoids an abort in Python 2.3's garbage collecting: */
-		PyErr_Clear(  );
+		/* this avoids an abort in Python 2.3's garbage collecting:
+		PyErr_Clear() */
+		BPY_Err_Clear(); /* Calls PyErr_Clear as well */
 		return;
 	} else {
 		PyErr_NormalizeException( &exception, &err, &tb );
@@ -579,6 +591,7 @@
 
 		if( !tb ) {
 			printf( "\nCan't get traceback\n" );
+			BPY_Err_Clear(); /* incase there is still some data hanging about */
 			return;
 		}
 
@@ -617,11 +630,7 @@
 		Py_DECREF( tb );
 	}
 	
-	/* 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);
+	BPY_Err_Clear();
 	return;
 }
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp	2008-10-22 07:02:30 UTC (rev 17169)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp	2008-10-22 07:09:15 UTC (rev 17170)
@@ -268,6 +268,7 @@
 			 * 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(); /* just to be sure */
 			
 			return;
 		}
@@ -311,6 +312,7 @@
 		 * 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(); /* just to be sure */
 		
 		//PyRun_SimpleString(m_scriptText.Ptr());
 	}





More information about the Bf-blender-cvs mailing list