From acbe8da4f886ad733401631a870ff58f8c0ad9a4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 15 Apr 1993 15:33:52 +0000 Subject: (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. --- Modules/regexpr.h | 2 +- Parser/intrcheck.c | 9 +++++++++ Python/ceval.c | 19 ++++++++++++++----- 3 files changed, 24 insertions(+), 6 deletions(-) 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 @@ Last modified: Mon Nov 4 15:49:46 1991 ylo #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 @@ initintr() { 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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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 @@ eval_code(co, globals, locals, arg) 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 @@ eval_code(co, globals, locals, arg) locals = globals; } +#ifdef LLTRACE + lltrace = dictlookup(globals, "__lltrace__") != NULL; +#endif + f = newframeobject( current_frame, /*back*/ co, /*code*/ @@ -1523,6 +1529,7 @@ locals_2_fast(f, clear) { /* 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 @@ locals_2_fast(f, clear) 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 @@ locals_2_fast(f, clear) if (setlistitem(fast, j, value) != 0) err_clear(); } + err_setval(error_type, error_value); } void -- cgit v0.12