diff options
| author | Stefan Monnier | 2014-04-12 22:51:11 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2014-04-12 22:51:11 -0400 |
| commit | 285d6d5d0fde973a31986877fb04a85be0e362ea (patch) | |
| tree | e9bd39a901d35c8ed680999e306f633e27712d90 /src/bytecode.c | |
| parent | a9108bf189e6cccfe568348ec604b9eecd17a125 (diff) | |
| download | emacs-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/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 17 |
1 files changed, 5 insertions, 12 deletions
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 | ||