Py_FlushLine and PyFile_WriteString now return error indicators
instead of calling PyErr_Clear().  Add checking of those errors.
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index f5405a3..fdfb8c6 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -56,12 +56,6 @@
 #include "windows.h"
 #endif
 
-#ifdef HAVE_GETPID
-#ifndef MS_WINDOWS
-#define HAVE_KILL
-#endif
-#endif
-
 extern char *Py_GetPath();
 
 extern grammar _PyParser_Grammar; /* From graminit.c */
@@ -260,7 +254,8 @@
 		return -1;
 	}
 	Py_DECREF(v);
-	Py_FlushLine();
+	if (Py_FlushLine())
+		PyErr_Clear();
 	return 0;
 }
 
@@ -302,7 +297,8 @@
 		return -1;
 	}
 	Py_DECREF(v);
-	Py_FlushLine();
+	if (Py_FlushLine())
+		PyErr_Clear();
 	return 0;
 }
 
@@ -321,20 +317,22 @@
 		return -1;
 	}
 	Py_DECREF(v);
-	Py_FlushLine();
+	if (Py_FlushLine())
+		PyErr_Clear();
 	return 0;
 }
 
 void
 PyErr_Print()
 {
+	int err = 0;
 	PyObject *exception, *v, *tb, *f;
 	PyErr_Fetch(&exception, &v, &tb);
-	Py_FlushLine();
-	fflush(stdout);
 	if (exception == NULL)
-		Py_FatalError("PyErr_Print called but no exception");
+		return 0;
 	if (exception == PyExc_SystemExit) {
+		err = Py_FlushLine();
+		fflush(stdout);
 		if (v == NULL || v == Py_None)
 			Py_Exit(0);
 		if (PyInt_Check(v))
@@ -353,8 +351,11 @@
 	if (f == NULL)
 		fprintf(stderr, "lost sys.stderr\n");
 	else {
-		PyTraceBack_Print(tb, f);
-		if (exception == PyExc_SyntaxError) {
+		err = Py_FlushLine();
+		fflush(stdout);
+		if (err == 0)
+			err = PyTraceBack_Print(tb, f);
+		if (err == 0 && exception == PyExc_SyntaxError) {
 			PyObject *message;
 			char *filename, *text;
 			int lineno, offset;
@@ -405,33 +406,43 @@
 				Py_INCREF(message);
 				Py_DECREF(v);
 				v = message;
+				/* Can't be bothered to check all those
+				   PyFile_WriteString() calls */
+				if (PyErr_Occurred())
+					err = -1;
 			}
 		}
-		if (PyClass_Check(exception)) {
+		if (err) {
+			/* Don't do anything else */
+		}
+		else if (PyClass_Check(exception)) {
 			PyObject* className =
 				((PyClassObject*)exception)->cl_name;
 			if (className == NULL)
-				PyFile_WriteString("<unknown>", f);
-			else {
-				if (PyFile_WriteObject(className, f,
-						       Py_PRINT_RAW) != 0)
-					PyErr_Clear();
+				err = PyFile_WriteString("<unknown>", f);
+			else
+				err = PyFile_WriteObject(className, f,
+							 Py_PRINT_RAW);
+		}
+		else
+			err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
+		if (err == 0) {
+			if (v != NULL && v != Py_None) {
+				err = PyFile_WriteString(": ", f);
+				if (err == 0)
+				  err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
 			}
-		} else {
-			if (PyFile_WriteObject(exception, f,
-					       Py_PRINT_RAW) != 0)
-				PyErr_Clear();
 		}
-		if (v != NULL && v != Py_None) {
-			PyFile_WriteString(": ", f);
-			if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
-				PyErr_Clear();
-		}
-		PyFile_WriteString("\n", f);
+		if (err == 0)
+			err = PyFile_WriteString("\n", f);
 	}
 	Py_XDECREF(exception);
 	Py_XDECREF(v);
 	Py_XDECREF(tb);
+	/* If an error happened here, don't show it.
+	   XXX This is wrong, but too many callers rely on this behavior. */
+	if (err != 0)
+		PyErr_Clear();
 }
 
 PyObject *