[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();
}