aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2014-04-12 22:51:11 -0400
committerStefan Monnier2014-04-12 22:51:11 -0400
commit285d6d5d0fde973a31986877fb04a85be0e362ea (patch)
treee9bd39a901d35c8ed680999e306f633e27712d90 /src
parenta9108bf189e6cccfe568348ec604b9eecd17a125 (diff)
downloademacs-285d6d5d0fde973a31986877fb04a85be0e362ea.tar.gz
emacs-285d6d5d0fde973a31986877fb04a85be0e362ea.zip
* src/bytecode.c (exec_byte_code): Rework the volatiles. Most importantly,
make sure stack.byte_string_start is not de-adjusted by pushhandler.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/bytecode.c17
2 files changed, 10 insertions, 12 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2d7307412b2..e07e900b27d 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
12014-04-13 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * bytecode.c (exec_byte_code): Rework the volatiles. Most importantly,
4 make sure stack.byte_string_start is not de-adjusted by pushhandler.
5
12014-04-12 Paul Eggert <eggert@cs.ucla.edu> 62014-04-12 Paul Eggert <eggert@cs.ucla.edu>
2 7
3 * keyboard.c (Fopen_dribble_file): Avoid some races. (Bug#17187) 8 * keyboard.c (Fopen_dribble_file): Avoid some races. (Bug#17187)
diff --git a/src/bytecode.c b/src/bytecode.c
index 0ea646a9741..f1bdfd9d9c5 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -501,7 +501,6 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
501 Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args) 501 Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args)
502{ 502{
503 ptrdiff_t count = SPECPDL_INDEX (); 503 ptrdiff_t count = SPECPDL_INDEX ();
504 ptrdiff_t volatile count_volatile;
505#ifdef BYTE_CODE_METER 504#ifdef BYTE_CODE_METER
506 int volatile this_op = 0; 505 int volatile this_op = 0;
507 int prev_op; 506 int prev_op;
@@ -509,14 +508,12 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
509 int op; 508 int op;
510 /* Lisp_Object v1, v2; */ 509 /* Lisp_Object v1, v2; */
511 Lisp_Object *vectorp; 510 Lisp_Object *vectorp;
512 Lisp_Object *volatile vectorp_volatile;
513#ifdef BYTE_CODE_SAFE 511#ifdef BYTE_CODE_SAFE
514 ptrdiff_t volatile const_length; 512 ptrdiff_t const_length;
515 Lisp_Object *volatile stacke; 513 Lisp_Object *stacke;
516 ptrdiff_t volatile bytestr_length; 514 ptrdiff_t bytestr_length;
517#endif 515#endif
518 struct byte_stack stack; 516 struct byte_stack stack;
519 struct byte_stack volatile stack_volatile;
520 Lisp_Object *top; 517 Lisp_Object *top;
521 Lisp_Object result; 518 Lisp_Object result;
522 enum handlertype type; 519 enum handlertype type;
@@ -1122,9 +1119,6 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1122 PUSH_HANDLER (c, tag, type); 1119 PUSH_HANDLER (c, tag, type);
1123 c->bytecode_dest = dest; 1120 c->bytecode_dest = dest;
1124 c->bytecode_top = top; 1121 c->bytecode_top = top;
1125 count_volatile = count;
1126 stack_volatile = stack;
1127 vectorp_volatile = vectorp;
1128 1122
1129 if (sys_setjmp (c->jmp)) 1123 if (sys_setjmp (c->jmp))
1130 { 1124 {
@@ -1135,12 +1129,11 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1135 handlerlist = c->next; 1129 handlerlist = c->next;
1136 PUSH (c->val); 1130 PUSH (c->val);
1137 CHECK_RANGE (dest); 1131 CHECK_RANGE (dest);
1138 stack = stack_volatile; 1132 /* Might have been re-set by longjmp! */
1133 stack.byte_string_start = SDATA (stack.byte_string);
1139 stack.pc = stack.byte_string_start + dest; 1134 stack.pc = stack.byte_string_start + dest;
1140 } 1135 }
1141 1136
1142 count = count_volatile;
1143 vectorp = vectorp_volatile;
1144 NEXT; 1137 NEXT;
1145 } 1138 }
1146 1139