diff --git a/Python/ceval.c b/Python/ceval.c
index 36f0017..c01e16d 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -48,7 +48,7 @@
 static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
 static PyObject *do_call(PyObject *, PyObject ***, int, int);
 static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
-static PyObject *update_keyword_args(PyObject *, int, PyObject ***, PyObject *);
+static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
 static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
 static PyObject *load_args(PyObject ***, int);
 #define CALL_FLAG_VAR 1
@@ -493,8 +493,12 @@
 			for (j = 0; j < co->co_argcount; j++) {
 				PyObject *nm = PyTuple_GET_ITEM(
 					co->co_varnames, j);
-				if (PyObject_Compare(keyword, nm) == 0)
+				int cmp = PyObject_RichCompareBool(
+					keyword, nm, Py_EQ);
+				if (cmp > 0)
 					break;
+				else if (cmp < 0)
+					goto fail;
 			}
 			/* Check errors from Compare */
 			if (PyErr_Occurred())
@@ -512,7 +516,7 @@
 			}
 			else {
 				if (GETLOCAL(j) != NULL) {
-					PyErr_Format(PyExc_TypeError, 
+					PyErr_Format(PyExc_TypeError,
 					     "%.200s() got multiple "
 					     "values for keyword "
 					     "argument '%.400s'",
@@ -606,12 +610,12 @@
 	_PyCode_GETCODEPTR(co, &first_instr);
 	next_instr = first_instr;
 	stack_pointer = f->f_valuestack;
-	
+
 	why = WHY_NOT;
 	err = 0;
 	x = Py_None;	/* Not a reference, just anything non-NULL */
 	w = NULL;
-	
+
 	for (;;) {
 		/* Do periodic things.  Doing this every time through
 		   the loop would add too much overhead, so we do it
@@ -620,7 +624,7 @@
 		   event needs attention (e.g. a signal handler or
 		   async I/O handler); see Py_AddPendingCall() and
 		   Py_MakePendingCalls() above. */
-		
+
 		if (things_to_do || --tstate->ticker < 0) {
 			tstate->ticker = tstate->interp->checkinterval;
 			if (things_to_do) {
@@ -662,7 +666,7 @@
 #if defined(Py_DEBUG) || defined(LLTRACE)
 		f->f_lasti = INSTR_OFFSET();
 #endif
-		
+
 		opcode = NEXTOP();
 		if (HAS_ARG(opcode))
 			oparg = NEXTARG();
@@ -677,7 +681,7 @@
 
 #ifdef LLTRACE
 		/* Instruction tracing */
-		
+
 		if (lltrace) {
 			if (HAS_ARG(opcode)) {
 				printf("%d: %d, %d\n",
@@ -693,26 +697,26 @@
 		/* Main switch on opcode */
 
 		switch (opcode) {
-		
+
 		/* BEWARE!
 		   It is essential that any operation that fails sets either
 		   x to NULL, err to nonzero, or why to anything but WHY_NOT,
 		   and that no operation that succeeds does this! */
-		
+
 		/* case STOP_CODE: this is an error! */
-		
+
 		case POP_TOP:
 			v = POP();
 			Py_DECREF(v);
 			continue;
-		
+
 		case ROT_TWO:
 			v = POP();
 			w = POP();
 			PUSH(v);
 			PUSH(w);
 			continue;
-		
+
 		case ROT_THREE:
 			v = POP();
 			w = POP();
@@ -721,7 +725,7 @@
 			PUSH(x);
 			PUSH(w);
 			continue;
-		
+
 		case ROT_FOUR:
 			u = POP();
 			v = POP();
@@ -732,13 +736,13 @@
 			PUSH(w);
 			PUSH(v);
 			continue;
-		
+
 		case DUP_TOP:
 			v = TOP();
 			Py_INCREF(v);
 			PUSH(v);
 			continue;
-		
+
 		case DUP_TOPX:
 			switch (oparg) {
 			case 1:
@@ -819,7 +823,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case UNARY_NEGATIVE:
 			v = POP();
 			x = PyNumber_Negative(v);
@@ -827,7 +831,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case UNARY_NOT:
 			v = POP();
 			err = PyObject_IsTrue(v);
@@ -844,7 +848,7 @@
 				continue;
 			}
 			break;
-		
+
 		case UNARY_CONVERT:
 			v = POP();
 			x = PyObject_Repr(v);
@@ -852,7 +856,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-			
+
 		case UNARY_INVERT:
 			v = POP();
 			x = PyNumber_Invert(v);
@@ -860,7 +864,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_POWER:
 			w = POP();
 			v = POP();
@@ -870,7 +874,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_MULTIPLY:
 			w = POP();
 			v = POP();
@@ -880,7 +884,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_DIVIDE:
 			w = POP();
 			v = POP();
@@ -890,7 +894,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_MODULO:
 			w = POP();
 			v = POP();
@@ -900,7 +904,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_ADD:
 			w = POP();
 			v = POP();
@@ -925,7 +929,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_SUBTRACT:
 			w = POP();
 			v = POP();
@@ -950,7 +954,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_SUBSCR:
 			w = POP();
 			v = POP();
@@ -977,7 +981,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_LSHIFT:
 			w = POP();
 			v = POP();
@@ -987,7 +991,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_RSHIFT:
 			w = POP();
 			v = POP();
@@ -997,7 +1001,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_AND:
 			w = POP();
 			v = POP();
@@ -1007,7 +1011,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_XOR:
 			w = POP();
 			v = POP();
@@ -1017,7 +1021,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case BINARY_OR:
 			w = POP();
 			v = POP();
@@ -1037,7 +1041,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_MULTIPLY:
 			w = POP();
 			v = POP();
@@ -1047,7 +1051,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_DIVIDE:
 			w = POP();
 			v = POP();
@@ -1057,7 +1061,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_MODULO:
 			w = POP();
 			v = POP();
@@ -1067,7 +1071,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_ADD:
 			w = POP();
 			v = POP();
@@ -1092,7 +1096,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_SUBTRACT:
 			w = POP();
 			v = POP();
@@ -1117,7 +1121,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_LSHIFT:
 			w = POP();
 			v = POP();
@@ -1127,7 +1131,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_RSHIFT:
 			w = POP();
 			v = POP();
@@ -1137,7 +1141,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_AND:
 			w = POP();
 			v = POP();
@@ -1147,7 +1151,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_XOR:
 			w = POP();
 			v = POP();
@@ -1157,7 +1161,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case INPLACE_OR:
 			w = POP();
 			v = POP();
@@ -1188,7 +1192,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case STORE_SLICE+0:
 		case STORE_SLICE+1:
 		case STORE_SLICE+2:
@@ -1210,7 +1214,7 @@
 			Py_XDECREF(w);
 			if (err == 0) continue;
 			break;
-		
+
 		case DELETE_SLICE+0:
 		case DELETE_SLICE+1:
 		case DELETE_SLICE+2:
@@ -1231,7 +1235,7 @@
 			Py_XDECREF(w);
 			if (err == 0) continue;
 			break;
-		
+
 		case STORE_SUBSCR:
 			w = POP();
 			v = POP();
@@ -1243,7 +1247,7 @@
 			Py_DECREF(w);
 			if (err == 0) continue;
 			break;
-		
+
 		case DELETE_SUBSCR:
 			w = POP();
 			v = POP();
@@ -1311,7 +1315,7 @@
 			if (err == 0)
 				continue;
 			break;
-		
+
 		case PRINT_NEWLINE_TO:
 			w = stream = POP();
 			/* fall through to PRINT_NEWLINE */
@@ -1331,7 +1335,7 @@
 			Py_XDECREF(stream);
 			stream = NULL;
 			break;
-		
+
 
 #ifdef CASE_TOO_BIG
 		default: switch (opcode) {
@@ -1361,7 +1365,7 @@
 				break;
 			}
 			break;
-		
+
 		case LOAD_LOCALS:
 			if ((x = f->f_locals) == NULL) {
 				PyErr_SetString(PyExc_SystemError,
@@ -1371,7 +1375,7 @@
 			Py_INCREF(x);
 			PUSH(x);
 			break;
-		
+
 		case RETURN_VALUE:
 			retval = POP();
 			why = WHY_RETURN;
@@ -1386,7 +1390,7 @@
 			Py_DECREF(v);
 			Py_DECREF(w);
 			break;
-		
+
 		case POP_BLOCK:
 			{
 				PyTryBlock *b = PyFrame_BlockPop(f);
@@ -1396,7 +1400,7 @@
 				}
 			}
 			break;
-		
+
 		case END_FINALLY:
 			v = POP();
 			if (PyInt_Check(v)) {
@@ -1418,7 +1422,7 @@
 			}
 			Py_DECREF(v);
 			break;
-		
+
 		case BUILD_CLASS:
 			u = POP();
 			v = POP();
@@ -1429,7 +1433,7 @@
 			Py_DECREF(v);
 			Py_DECREF(w);
 			break;
-		
+
 		case STORE_NAME:
 			w = GETNAMEV(oparg);
 			v = POP();
@@ -1441,7 +1445,7 @@
 			err = PyDict_SetItem(x, w, v);
 			Py_DECREF(v);
 			break;
-		
+
 		case DELETE_NAME:
 			w = GETNAMEV(oparg);
 			if ((x = f->f_locals) == NULL) {
@@ -1450,7 +1454,7 @@
 				break;
 			}
 			if ((err = PyDict_DelItem(x, w)) != 0)
-				format_exc_check_arg(PyExc_NameError, 
+				format_exc_check_arg(PyExc_NameError,
 							NAME_ERROR_MSG ,w);
 			break;
 
@@ -1498,7 +1502,7 @@
 			}
 			Py_DECREF(v);
 			break;
-		
+
 		case STORE_ATTR:
 			w = GETNAMEV(oparg);
 			v = POP();
@@ -1507,7 +1511,7 @@
 			Py_DECREF(v);
 			Py_DECREF(u);
 			break;
-		
+
 		case DELETE_ATTR:
 			w = GETNAMEV(oparg);
 			v = POP();
@@ -1515,27 +1519,27 @@
 							/* del v.w */
 			Py_DECREF(v);
 			break;
-		
+
 		case STORE_GLOBAL:
 			w = GETNAMEV(oparg);
 			v = POP();
 			err = PyDict_SetItem(f->f_globals, w, v);
 			Py_DECREF(v);
 			break;
-		
+
 		case DELETE_GLOBAL:
 			w = GETNAMEV(oparg);
 			if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
 				format_exc_check_arg(
 				    PyExc_NameError, NAME_ERROR_MSG ,w);
 			break;
-		
+
 		case LOAD_CONST:
 			x = GETCONST(oparg);
 			Py_INCREF(x);
 			PUSH(x);
 			break;
-		
+
 		case LOAD_NAME:
 			w = GETNAMEV(oparg);
 			if ((x = f->f_locals) == NULL) {
@@ -1550,7 +1554,7 @@
 					x = PyDict_GetItem(f->f_builtins, w);
 					if (x == NULL) {
 						format_exc_check_arg(
-							    PyExc_NameError, 
+							    PyExc_NameError,
 							    NAME_ERROR_MSG ,w);
 						break;
 					}
@@ -1559,7 +1563,7 @@
 			Py_INCREF(x);
 			PUSH(x);
 			break;
-		
+
 		case LOAD_GLOBAL:
 			w = GETNAMEV(oparg);
 			x = PyDict_GetItem(f->f_globals, w);
@@ -1567,7 +1571,7 @@
 				x = PyDict_GetItem(f->f_builtins, w);
 				if (x == NULL) {
 					format_exc_check_arg(
-						    PyExc_NameError, 
+						    PyExc_NameError,
 						    NAME_ERROR_MSG ,w);
 					break;
 				}
@@ -1608,7 +1612,7 @@
 			}
 			SETLOCAL(oparg, NULL);
 			continue;
-		
+
 		case BUILD_TUPLE:
 			x = PyTuple_New(oparg);
 			if (x != NULL) {
@@ -1620,7 +1624,7 @@
 				continue;
 			}
 			break;
-		
+
 		case BUILD_LIST:
 			x =  PyList_New(oparg);
 			if (x != NULL) {
@@ -1632,13 +1636,13 @@
 				continue;
 			}
 			break;
-		
+
 		case BUILD_MAP:
 			x = PyDict_New();
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case LOAD_ATTR:
 			w = GETNAMEV(oparg);
 			v = POP();
@@ -1647,7 +1651,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case COMPARE_OP:
 			w = POP();
 			v = POP();
@@ -1680,7 +1684,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case IMPORT_NAME:
 			w = GETNAMEV(oparg);
 			x = PyDict_GetItemString(f->f_builtins, "__import__");
@@ -1706,7 +1710,7 @@
 			PUSH(x);
 			if (x != NULL) continue;
 			break;
-		
+
 		case IMPORT_STAR:
 			v = POP();
 			PyFrame_FastToLocals(f);
@@ -1732,7 +1736,7 @@
 		case JUMP_FORWARD:
 			JUMPBY(oparg);
 			continue;
-		
+
 		case JUMP_IF_FALSE:
 			err = PyObject_IsTrue(TOP());
 			if (err > 0)
@@ -1742,7 +1746,7 @@
 			else
 				break;
 			continue;
-		
+
 		case JUMP_IF_TRUE:
 			err = PyObject_IsTrue(TOP());
 			if (err > 0) {
@@ -1754,11 +1758,11 @@
 			else
 				break;
 			continue;
-		
+
 		case JUMP_ABSOLUTE:
 			JUMPTO(oparg);
 			continue;
-		
+
 		case FOR_LOOP:
 			/* for v in s: ...
 			   On entry: stack contains s, i.
@@ -1789,14 +1793,14 @@
 				}
 			}
 			break;
-		
+
 		case SETUP_LOOP:
 		case SETUP_EXCEPT:
 		case SETUP_FINALLY:
 			PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
 						STACK_LEVEL());
 			continue;
-		
+
 		case SET_LINENO:
 #ifdef LLTRACE
 			if (lltrace)
@@ -1827,13 +1831,13 @@
 		    if (PyCFunction_Check(func)) {
 			    if (PyCFunction_GET_FLAGS(func) == 0) {
 				    x = fast_cfunction(func,
-						       &stack_pointer, na);  
+						       &stack_pointer, na);
 			    } else {
 				    x = do_call(func, &stack_pointer,
 						na, nk);
 			    }
 		    } else {
-			    if (PyMethod_Check(func) 
+			    if (PyMethod_Check(func)
 				&& PyMethod_GET_SELF(func) != NULL) {
 				    /* optimize access to bound methods */
 				    PyObject *self = PyMethod_GET_SELF(func);
@@ -1844,11 +1848,11 @@
 				    *pfunc = self;
 				    na++;
 				    n++;
-			    } else 
+			    } else
 				    Py_INCREF(func);
 			    if (PyFunction_Check(func)) {
 				    x = fast_function(func, &stack_pointer,
-						      n, na, nk); 
+						      n, na, nk);
 			    } else {
 				    x = do_call(func, &stack_pointer,
 						na, nk);
@@ -1861,11 +1865,11 @@
 			    Py_DECREF(w);
 		    }
 		    PUSH(x);
-		    if (x != NULL) 
+		    if (x != NULL)
 			    continue;
 		    break;
 		}
-		
+
 		case CALL_FUNCTION_VAR:
 		case CALL_FUNCTION_KW:
 		case CALL_FUNCTION_VAR_KW:
@@ -1883,7 +1887,7 @@
 		    func = *pfunc;
 		    f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
 
-		    if (PyMethod_Check(func) 
+		    if (PyMethod_Check(func)
 			&& PyMethod_GET_SELF(func) != NULL) {
 			    PyObject *self = PyMethod_GET_SELF(func);
 			    Py_INCREF(self);
@@ -1893,7 +1897,7 @@
 			    *pfunc = self;
 			    na++;
 			    n++;
-		    } else 
+		    } else
 			    Py_INCREF(func);
 		    x = ext_do_call(func, &stack_pointer, flags, na, nk);
 		    Py_DECREF(func);
@@ -1903,11 +1907,11 @@
 			    Py_DECREF(w);
 		    }
 		    PUSH(x);
-		    if (x != NULL) 
+		    if (x != NULL)
 			    continue;
 		    break;
 		}
-		
+
 		case MAKE_FUNCTION:
 			v = POP(); /* code object */
 			x = PyFunction_New(v, f->f_globals);
@@ -1966,9 +1970,9 @@
 		} /* switch */
 
 	    on_error:
-		
+
 		/* Quickly continue if no error occurred */
-		
+
 		if (why == WHY_NOT) {
 			if (err == 0 && x != NULL) {
 #ifdef CHECKEXC
@@ -1986,7 +1990,7 @@
 		}
 
 		/* Double-check exception status */
-		
+
 		if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
 			if (!PyErr_Occurred()) {
 				PyErr_SetString(PyExc_SystemError,
@@ -2007,7 +2011,7 @@
 #endif
 
 		/* Log traceback info if this is a real exception */
-		
+
 		if (why == WHY_EXCEPTION) {
 			f->f_lasti = INSTR_OFFSET() - 1;
 			if (HAS_ARG(opcode))
@@ -2020,14 +2024,14 @@
 				call_exc_trace(&tstate->sys_profilefunc,
 					       (PyObject**)0, f);
 		}
-		
+
 		/* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
-		
+
 		if (why == WHY_RERAISE)
 			why = WHY_EXCEPTION;
 
 		/* Unwind stacks if a (pseudo) exception occurred */
-		
+
 		while (why != WHY_NOT && f->f_iblock > 0) {
 			PyTryBlock *b = PyFrame_BlockPop(f);
 			while (STACK_LEVEL() > b->b_level) {
@@ -2077,22 +2081,22 @@
 		} /* unwind stack */
 
 		/* End the loop if we still have an error (or return) */
-		
+
 		if (why != WHY_NOT)
 			break;
-		
+
 	} /* main loop */
-	
+
 	/* Pop remaining stack entries */
-	
+
 	while (!EMPTY()) {
 		v = POP();
 		Py_XDECREF(v);
 	}
-	
+
 	if (why != WHY_RETURN)
 		retval = NULL;
-	
+
 	if (f->f_trace) {
 		if (why == WHY_RETURN) {
 			if (call_trace(&f->f_trace, &f->f_trace, f,
@@ -2103,7 +2107,7 @@
 			}
 		}
 	}
-	
+
 	if (tstate->sys_profilefunc && why == WHY_RETURN) {
 		if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
 			       f, "return", retval)) {
@@ -2118,17 +2122,18 @@
 	--tstate->recursion_depth;
 
   fail: /* Jump here from prelude on failure */
-	
+
 	/* Restore previous frame and release the current one */
 
 	tstate->frame = f->f_back;
 	Py_DECREF(f);
-	
+
 	return retval;
 }
 
 static void
-set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
+set_exc_info(PyThreadState *tstate,
+	     PyObject *type, PyObject *value, PyObject *tb)
 {
 	PyFrameObject *frame;
 	PyObject *tmp_type, *tmp_value, *tmp_tb;
@@ -2224,7 +2229,7 @@
 		Py_XINCREF(value);
 		Py_XINCREF(tb);
 	}
-		
+
 	/* We support the following forms of raise:
 	   raise <class>, <classinstance>
 	   raise <class>, <argument tuple>
@@ -2315,7 +2320,7 @@
 {
 	int i;
 	PyObject *w;
-	
+
 	for (i = 0; i < argcnt; i++) {
 		if (! (w = PySequence_GetItem(v, i))) {
 			if (PyErr_ExceptionMatches(PyExc_IndexError))
@@ -2396,7 +2401,7 @@
 	PyThreadState *tstate = f->f_tstate;
 	PyObject *args, *what;
 	PyObject *res = NULL;
-	
+
 	if (tstate->tracing) {
 		/* Don't do recursive traces */
 		if (p_newtrace) {
@@ -2405,7 +2410,7 @@
 		}
 		return 0;
 	}
-	
+
 	args = PyTuple_New(3);
 	if (args == NULL)
 		goto cleanup;
@@ -2598,7 +2603,7 @@
         if (result == NULL && !PyErr_Occurred())
 		PyErr_SetString(PyExc_SystemError,
 			   "NULL result without error in call_object");
-        
+
         return result;
 }
 
@@ -2726,7 +2731,7 @@
 		d = NULL;
 		nd = 0;
 	}
-	
+
 	if (kw != NULL) {
 		int pos, i;
 		nk = PyDict_Size(kw);
@@ -2746,17 +2751,17 @@
 		k = NULL;
 		nk = 0;
 	}
-	
+
 	result = eval_code2(
 		(PyCodeObject *)PyFunction_GET_CODE(func),
 		PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
 		&PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
 		k, nk,
 		d, nd);
-	
+
 	if (k != NULL)
 		PyMem_DEL(k);
-	
+
 	return result;
 }
 
@@ -2778,7 +2783,7 @@
 		return (*meth)(self, NULL);
 	else if (na == 1) {
 		PyObject *arg = EXT_POP(*pp_stack);
-		PyObject *result =  (*meth)(self, arg); 
+		PyObject *result =  (*meth)(self, arg);
 		Py_DECREF(arg);
 		return result;
 	} else {
@@ -2790,7 +2795,7 @@
 }
 
 static PyObject *
-fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)  
+fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
 {
 	PyObject *co = PyFunction_GET_CODE(func);
 	PyObject *globals = PyFunction_GET_GLOBALS(func);
@@ -2802,7 +2807,7 @@
 		d = &PyTuple_GET_ITEM(argdefs, 0);
 		nd = ((PyTupleObject *)argdefs)->ob_size;
 	}
-	return eval_code2((PyCodeObject *)co, globals, 
+	return eval_code2((PyCodeObject *)co, globals,
 			  (PyObject *)NULL, (*pp_stack)-n, na,
 			  (*pp_stack)-2*nk, nk, d, nd);
 }
@@ -2826,7 +2831,7 @@
 		PyObject *key = EXT_POP(*pp_stack);
 		if (PyDict_GetItem(kwdict, key) != NULL) {
                         PyObject* fn = ((PyFunctionObject*) func)->func_name;
-                        PyErr_Format(PyExc_TypeError, 
+                        PyErr_Format(PyExc_TypeError,
                                      "%.200s%s got multiple values "
                                      "for keyword argument '%.400s'",
                                      fn ? PyString_AsString(fn) : "function",
@@ -3002,32 +3007,37 @@
 			x = PyLong_AsLong(v);
 			if (x==-1 && PyErr_Occurred()) {
 				PyObject *long_zero;
+				int cmp;
 
-				if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
-					/* It's not an overflow error, so just 
+				if (!PyErr_ExceptionMatches(
+					PyExc_OverflowError)) {
+					/* It's not an overflow error, so just
 					   signal an error */
 					return 0;
 				}
 
-				/* It's an overflow error, so we need to 
-				   check the sign of the long integer, 
-				   set the value to INT_MAX or 0, and clear 
+				/* Clear the OverflowError */
+				PyErr_Clear();
+
+				/* It's an overflow error, so we need to
+				   check the sign of the long integer,
+				   set the value to INT_MAX or 0, and clear
 				   the error. */
 
 				/* Create a long integer with a value of 0 */
-				long_zero = PyLong_FromLong( 0L );
+				long_zero = PyLong_FromLong(0L);
 				if (long_zero == NULL) return 0;
 
 				/* Check sign */
-				if (PyObject_Compare(long_zero, v) < 0)
+				cmp = PyObject_RichCompareBool(v, long_zero,
+							       Py_GT);
+				Py_DECREF(long_zero);
+				if (cmp < 0)
+					return 0;
+				else if (cmp > 0)
 					x = INT_MAX;
 				else
 					x = 0;
-				
-				/* Free the long integer we created, and clear the
-				   OverflowError */
-				Py_DECREF(long_zero);
-				PyErr_Clear();
 			}
 		} else {
 			PyErr_SetString(PyExc_TypeError,
@@ -3056,7 +3066,8 @@
 }
 
 static int
-assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
+assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
+	/* u[v:w] = x */
 {
 	int ilow = 0, ihigh = INT_MAX;
 	if (!_PyEval_SliceIndex(v, &ilow))
@@ -3072,8 +3083,7 @@
 static PyObject *
 cmp_outcome(int op, register PyObject *v, register PyObject *w)
 {
-	register int cmp;
-	register int res = 0;
+	int res = 0;
 	switch (op) {
 	case IS:
 	case IS_NOT:
@@ -3093,18 +3103,7 @@
 		res = PyErr_GivenExceptionMatches(v, w);
 		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;
-		case EQ: res = cmp == 0; break;
-		case NE: res = cmp != 0; break;
-		case GT: res = cmp >  0; break;
-		case GE: res = cmp >= 0; break;
-		/* XXX no default? (res is initialized to 0 though) */
-		}
+		return PyObject_RichCompare(v, w, op);
 	}
 	v = res ? Py_True : Py_False;
 	Py_INCREF(v);
@@ -3124,7 +3123,7 @@
 	}
 	return x;
 }
- 
+
 static int
 import_all_from(PyObject *locals, PyObject *v)
 {
@@ -3274,7 +3273,7 @@
 	    !PyCode_Check(prog) &&
 	    !PyFile_Check(prog)) {
 		PyErr_SetString(PyExc_TypeError,
-			   "exec: arg 1 must be a string, file, or code object");
+			"exec: arg 1 must be a string, file, or code object");
 		return -1;
 	}
 	if (!PyDict_Check(globals)) {
@@ -3311,7 +3310,7 @@
 	return 0;
 }
 
-static void 
+static void
 format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
 {
 	char *obj_str;
