[Python-checkins] CVS: python/dist/src/Python pythonrun.c,2.129,2.130

Ka-Ping Yee ping@users.sourceforge.net
Fri, 23 Mar 2001 07:36:44 -0800


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv14436

Modified Files:
	pythonrun.c 
Log Message:
Allow sys.excepthook and sys.exitfunc to quietly exit with a sys.exit().
sys.exitfunc gets the last word on the exit status of the program.


Index: pythonrun.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/pythonrun.c,v
retrieving revision 2.129
retrieving revision 2.130
diff -C2 -r2.129 -r2.130
*** pythonrun.c	2001/03/23 04:01:07	2.129
--- pythonrun.c	2001/03/23 15:36:41	2.130
***************
*** 800,803 ****
--- 800,832 ----
  
  void
+ PyRun_HandleSystemExit(PyObject* value)
+ {
+ 	if (Py_FlushLine())
+ 		PyErr_Clear();
+ 	fflush(stdout);
+ 	if (value == NULL || value == Py_None)
+ 		Py_Exit(0);
+ 	if (PyInstance_Check(value)) {
+ 		/* The error code should be in the `code' attribute. */
+ 		PyObject *code = PyObject_GetAttrString(value, "code");
+ 		if (code) {
+ 			Py_DECREF(value);
+ 			value = code;
+ 			if (value == Py_None)
+ 				Py_Exit(0);
+ 		}
+ 		/* If we failed to dig out the 'code' attribute,
+ 		   just let the else clause below print the error. */
+ 	}
+ 	if (PyInt_Check(value))
+ 		Py_Exit((int)PyInt_AsLong(value));
+ 	else {
+ 		PyObject_Print(value, stderr, Py_PRINT_RAW);
+ 		PySys_WriteStderr("\n");
+ 		Py_Exit(1);
+ 	}
+ }
+ 
+ void
  PyErr_PrintEx(int set_sys_last_vars)
  {
***************
*** 810,842 ****
  
  	if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
! 		if (Py_FlushLine())
! 			PyErr_Clear();
! 		fflush(stdout);
! 		if (v == NULL || v == Py_None)
! 			Py_Exit(0);
! 		if (PyInstance_Check(v)) {
! 			/* we expect the error code to be store in the
! 			   `code' attribute
! 			*/
! 			PyObject *code = PyObject_GetAttrString(v, "code");
! 			if (code) {
! 				Py_DECREF(v);
! 				v = code;
! 				if (v == Py_None)
! 					Py_Exit(0);
! 			}
! 			/* if we failed to dig out the "code" attribute,
! 			   then just let the else clause below print the
! 			   error
! 			*/
! 		}
! 		if (PyInt_Check(v))
! 			Py_Exit((int)PyInt_AsLong(v));
! 		else {
! 			/* OK to use real stderr here */
! 			PyObject_Print(v, stderr, Py_PRINT_RAW);
! 			fprintf(stderr, "\n");
! 			Py_Exit(1);
! 		}
  	}
  	if (set_sys_last_vars) {
--- 839,843 ----
  
  	if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
! 		PyRun_HandleSystemExit(v);
  	}
  	if (set_sys_last_vars) {
***************
*** 854,857 ****
--- 855,862 ----
  			PyErr_Fetch(&exception2, &v2, &tb2);
  			PyErr_NormalizeException(&exception2, &v2, &tb2);
+ 			if (PyErr_GivenExceptionMatches(
+ 				exception2, PyExc_SystemExit)) {
+ 				PyRun_HandleSystemExit(v2);
+ 			}
  			if (Py_FlushLine())
  				PyErr_Clear();
***************
*** 1255,1263 ****
  		Py_INCREF(exitfunc);
  		PySys_SetObject("exitfunc", (PyObject *)NULL);
- 		f = PySys_GetObject("stderr");
  		res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
  		if (res == NULL) {
! 			if (f)
! 			    PyFile_WriteString("Error in sys.exitfunc:\n", f);
  			PyErr_Print();
  		}
--- 1260,1268 ----
  		Py_INCREF(exitfunc);
  		PySys_SetObject("exitfunc", (PyObject *)NULL);
  		res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
  		if (res == NULL) {
! 			if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
! 				PySys_WriteStderr("Error in sys.exitfunc:\n");
! 			}
  			PyErr_Print();
  		}