(I suggest a recompile after getting this, the ceval.c bugfix may be crucial!)

* Makefile: removed superfluous AR=ar, fixed misleading comment.
* ceval.c: fixed debugging code; save/restore errors in locals_2_fast.
* intrcheck.c: for SunOS etc., turn off syscall resumption.
* regexpr.h: bump number of registers to 100.
diff --git a/Modules/regexpr.h b/Modules/regexpr.h
index c0276ae..ef46554 100644
--- a/Modules/regexpr.h
+++ b/Modules/regexpr.h
@@ -24,7 +24,7 @@
 #define HAVE_PROTOTYPES
 #endif
 
-#define RE_NREGS	10  /* number of registers available */
+#define RE_NREGS	100  /* number of registers available */
 
 typedef struct re_pattern_buffer
 {
diff --git a/Parser/intrcheck.c b/Parser/intrcheck.c
index feab766..4636b3f 100644
--- a/Parser/intrcheck.c
+++ b/Parser/intrcheck.c
@@ -140,6 +140,15 @@
 {
 	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
 		signal(SIGINT, intcatcher);
+#ifdef SV_INTERRUPT
+	/* This is for SunOS and other modern BSD derivatives.
+	   It means that system calls (like read()) are not restarted
+	   after an interrupt.  This is necessary so interrupting a
+	   read() or readline() call works as expected.
+	   XXX On old BSD (pure 4.2 or older) you may have to do this
+	   differently! */
+	siginterrupt(SIGINT, 1);
+#endif
 }
 
 int
diff --git a/Python/ceval.c b/Python/ceval.c
index 1206570..935ce52 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -37,16 +37,18 @@
 #include "traceback.h"
 
 /* Turn this on if your compiler chokes on the big switch: */
-/* #define CASE_TOO_BIG 1 /**/
+/* #define CASE_TOO_BIG 1  	/**/
 
-#ifndef NDEBUG
+/* Turn this on if you want to debug the interpreter: */
+/* (This can be on even if NDEBUG is defined) */
+/* #define DEBUG 1  		/**/
+
+#if defined(DEBUG) || !defined(NDEBUG)
 /* For debugging the interpreter: */
 #define LLTRACE  1	/* Low-level trace feature */
 #define CHECKEXC 1	/* Double-check exception checking */
 #endif
 
-#define DEBUG
-
 
 /* Forward declarations */
 
@@ -183,7 +185,7 @@
 	char *name;		/* Name used by some instructions */
 	int needmerge = 0;
 #ifdef LLTRACE
-	int lltrace = dictlookup(globals, "__lltrace__") != NULL;
+	int lltrace;
 #endif
 #ifdef DEBUG
 	/* Make it easier to find out where we are with dbx */
@@ -233,6 +235,10 @@
 			locals = globals;
 	}
 
+#ifdef LLTRACE
+	lltrace = dictlookup(globals, "__lltrace__") != NULL;
+#endif
+
 	f = newframeobject(
 			current_frame,		/*back*/
 			co,			/*code*/
@@ -1523,6 +1529,7 @@
 {
 	/* Merge f->f_locals into f->f_fastlocals */
 	object *locals, *fast, *map;
+	object *error_type, *error_value;
 	int i;
 	if (f == NULL)
 		return;
@@ -1534,6 +1541,7 @@
 	if (!is_dictobject(locals) || !is_listobject(fast) ||
 	    !is_dictobject(map))
 		return;
+	err_get(&error_type, &error_value);
 	i = getdictsize(map);
 	while (--i >= 0) {
 		object *key;
@@ -1555,6 +1563,7 @@
 			if (setlistitem(fast, j, value) != 0)
 				err_clear();
 	}
+	err_setval(error_type, error_value);
 }
 
 void