[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40023] trunk/blender/source/blender/ python/generic/py_capi_utils.c: attempt to have a threadsafe version of PyC_ExceptionBuffer didnt work with UI script errors , reverting r39886.

Campbell Barton ideasman42 at gmail.com
Thu Sep 8 04:14:25 CEST 2011


Revision: 40023
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40023
Author:   campbellbarton
Date:     2011-09-08 02:14:24 +0000 (Thu, 08 Sep 2011)
Log Message:
-----------
attempt to have a threadsafe version of PyC_ExceptionBuffer didnt work with UI script errors, reverting r39886.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39886

Modified Paths:
--------------
    trunk/blender/source/blender/python/generic/py_capi_utils.c

Modified: trunk/blender/source/blender/python/generic/py_capi_utils.c
===================================================================
--- trunk/blender/source/blender/python/generic/py_capi_utils.c	2011-09-08 01:26:23 UTC (rev 40022)
+++ trunk/blender/source/blender/python/generic/py_capi_utils.c	2011-09-08 02:14:24 UTC (rev 40023)
@@ -209,6 +209,10 @@
 }
 
 /* returns the exception string as a new PyUnicode object, depends on external traceback module */
+#if 0
+
+/* this version uses traceback module but somehow fails on UI errors */
+
 PyObject *PyC_ExceptionBuffer(void)
 {
 	PyObject *traceback_mod= NULL;
@@ -236,7 +240,79 @@
 
 	return ret;
 }
+#else /* verbose, non-threadsafe version */
+PyObject *PyC_ExceptionBuffer(void)
+{
+	PyObject *stdout_backup = PySys_GetObject("stdout"); /* borrowed */
+	PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
+	PyObject *string_io = NULL;
+	PyObject *string_io_buf = NULL;
+	PyObject *string_io_mod= NULL;
+	PyObject *string_io_getvalue= NULL;
 
+	PyObject *error_type, *error_value, *error_traceback;
+
+	if (!PyErr_Occurred())
+		return NULL;
+
+	PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+	PyErr_Clear();
+
+	/* import io
+	 * string_io = io.StringIO()
+	 */
+
+	if(! (string_io_mod= PyImport_ImportModule("io")) ) {
+		goto error_cleanup;
+	}
+	else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
+		goto error_cleanup;
+	}
+	else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
+		goto error_cleanup;
+	}
+
+	Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
+	Py_INCREF(stderr_backup);
+
+	PySys_SetObject("stdout", string_io); // both of these are free'd when restoring
+	PySys_SetObject("stderr", string_io);
+
+	PyErr_Restore(error_type, error_value, error_traceback);
+	PyErr_Print(); /* print the error */
+	PyErr_Clear();
+
+	string_io_buf = PyObject_CallObject(string_io_getvalue, NULL);
+
+	PySys_SetObject("stdout", stdout_backup);
+	PySys_SetObject("stderr", stderr_backup);
+
+	Py_DECREF(stdout_backup); /* now sys owns the ref again */
+	Py_DECREF(stderr_backup);
+
+	Py_DECREF(string_io_mod);
+	Py_DECREF(string_io_getvalue);
+	Py_DECREF(string_io); /* free the original reference */
+
+	PyErr_Clear();
+	return string_io_buf;
+
+
+error_cleanup:
+	/* could not import the module so print the error and close */
+	Py_XDECREF(string_io_mod);
+	Py_XDECREF(string_io);
+
+	PyErr_Restore(error_type, error_value, error_traceback);
+	PyErr_Print(); /* print the error */
+	PyErr_Clear();
+
+	return NULL;
+}
+#endif
+
+
 /* string conversion, escape non-unicode chars, coerce must be set to NULL */
 const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
 {




More information about the Bf-blender-cvs mailing list