From: Paul Eggert Date: Fri, 4 Oct 2013 06:51:50 +0000 (-0700) Subject: * bytecode.c (exec_byte_code): Use some more volatile variables X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1395 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=157fec2e190a84345138a0cc69e35f177c4d4a56;p=emacs.git * bytecode.c (exec_byte_code): Use some more volatile variables to work around local variables getting clobbered by longjmp. Port to pre-C99, which doesn't allow decls after stmts. --- diff --git a/src/ChangeLog b/src/ChangeLog index 85411622ba1..4fae03d6965 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2013-10-04 Paul Eggert + + * bytecode.c (exec_byte_code): Use some more volatile variables + to work around local variables getting clobbered by longjmp. + Port to pre-C99, which doesn't allow decls after stmts. + 2013-10-03 Paul Eggert * lisp.h (eassert): Assume that COND is true when optimizing. diff --git a/src/bytecode.c b/src/bytecode.c index f7ccd35cbba..b9cb36c871f 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -332,7 +332,7 @@ struct byte_stack /* A list of currently active byte-code execution value stacks. Fbyte_code adds an entry to the head of this list before it starts - processing byte-code, and it removed the entry again when it is + processing byte-code, and it removes the entry again when it is done. Signaling an error truncates the list analogous to gcprolist. */ @@ -501,19 +501,22 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args) { ptrdiff_t count = SPECPDL_INDEX (); + ptrdiff_t volatile count_volatile; #ifdef BYTE_CODE_METER - int this_op = 0; + int volatile this_op = 0; int prev_op; #endif int op; /* Lisp_Object v1, v2; */ Lisp_Object *vectorp; + Lisp_Object *volatile vectorp_volatile; #ifdef BYTE_CODE_SAFE - ptrdiff_t const_length; - Lisp_Object *stacke; - ptrdiff_t bytestr_length; + ptrdiff_t volatile const_length; + Lisp_Object *volatile stacke; + ptrdiff_t volatile bytestr_length; #endif struct byte_stack stack; + struct byte_stack volatile stack_volatile; Lisp_Object *top; Lisp_Object result; enum handlertype type; @@ -1119,16 +1122,25 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, PUSH_HANDLER (c, tag, type); c->bytecode_dest = dest; c->bytecode_top = top; + count_volatile = count; + stack_volatile = stack; + vectorp_volatile = vectorp; + if (sys_setjmp (c->jmp)) { struct handler *c = handlerlist; + int dest; top = c->bytecode_top; - int dest = c->bytecode_dest; + dest = c->bytecode_dest; handlerlist = c->next; PUSH (c->val); CHECK_RANGE (dest); + stack = stack_volatile; stack.pc = stack.byte_string_start + dest; } + + count = count_volatile; + vectorp = vectorp_volatile; NEXT; }