PyObject_Compare can raise an exception now.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4029e1b..245d31e 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -245,10 +245,14 @@
 	PyObject *args;
 {
 	PyObject *a, *b;
+	long c;
 
 	if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
 		return NULL;
-	return PyInt_FromLong((long)PyObject_Compare(a, b));
+	c = PyObject_Compare(a, b);
+	if (c && PyErr_Occurred())
+		return NULL;
+	return PyInt_FromLong(c);
 }
 
 static PyObject *
@@ -1073,7 +1077,13 @@
 		if (w == NULL)
 			w = x;
 		else {
-			if (PyObject_Compare(x, w) * sign > 0) {
+			int c = PyObject_Compare(x, w);
+			if (c && PyErr_Occurred()) {
+				Py_DECREF(x);
+				Py_XDECREF(w);
+				return NULL;
+			}
+			if (c * sign > 0) {
 				Py_DECREF(w);
 				w = x;
 			}
@@ -1360,8 +1370,8 @@
 			PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
 			return NULL;
 		}
-		Py_FlushLine();
-		if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
+		if (Py_FlushLine() != 0 ||
+		    PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
 			return NULL;
 	}
 	f = PySys_GetObject("stdin");
diff --git a/Python/ceval.c b/Python/ceval.c
index 7897006..bd312b2 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -456,6 +456,9 @@
 				if (PyObject_Compare(keyword, nm) == 0)
 					break;
 			}
+			/* Check errors from Compare */
+			if (PyErr_Occurred())
+				goto fail;
 			if (j >= co->co_argcount) {
 				if (kwdict == NULL) {
 					PyErr_Format(PyExc_TypeError,
@@ -2475,6 +2478,8 @@
 		Py_XDECREF(x);
 		if (cmp == 0)
 			return 1;
+		if (PyErr_Occurred())
+			return -1;
 	}
 	return 0;
 }
@@ -2507,6 +2512,8 @@
 		break;
 	default:
 		cmp = PyObject_Compare(v, w);
+		if (cmp && PyErr_Occurred())
+			return NULL;
 		switch (op) {
 		case LT: res = cmp <  0; break;
 		case LE: res = cmp <= 0; break;
diff --git a/Python/compile.c b/Python/compile.c
index 155142a..36304e3 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -666,7 +666,8 @@
 		if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
 			return i;
 	}
-	if (PyList_Append(list, v) != 0)
+	/* Check for error from PyObject_Compare */
+	if (PyErr_Occurred() || PyList_Append(list, v) != 0)
 		c->c_errors++;
 	return n;
 }