aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index ce075c86afd..48a29c22d55 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -29,11 +29,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
29#include "window.h" 29#include "window.h"
30#include "puresize.h" 30#include "puresize.h"
31 31
32/* Work around GCC bug 54561. */
33#if GNUC_PREREQ (4, 3, 0)
34# pragma GCC diagnostic ignored "-Wclobbered"
35#endif
36
37/* Define BYTE_CODE_SAFE true to enable some minor sanity checking, 32/* Define BYTE_CODE_SAFE true to enable some minor sanity checking,
38 useful for debugging the byte compiler. It defaults to false. */ 33 useful for debugging the byte compiler. It defaults to false. */
39 34
@@ -536,6 +531,12 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
536 for (ptrdiff_t i = nargs - rest; i < nonrest; i++) 531 for (ptrdiff_t i = nargs - rest; i < nonrest; i++)
537 PUSH (Qnil); 532 PUSH (Qnil);
538 533
534 unsigned char volatile saved_quitcounter;
535#if GCC_LINT && __GNUC__ && !__clang__
536 Lisp_Object *volatile saved_vectorp;
537 unsigned char const *volatile saved_bytestr_data;
538#endif
539
539 while (true) 540 while (true)
540 { 541 {
541 int op; 542 int op;
@@ -967,15 +968,23 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
967 968
968 if (sys_setjmp (c->jmp)) 969 if (sys_setjmp (c->jmp))
969 { 970 {
971 quitcounter = saved_quitcounter;
970 struct handler *c = handlerlist; 972 struct handler *c = handlerlist;
971 handlerlist = c->next; 973 handlerlist = c->next;
972 top = c->bytecode_top; 974 top = c->bytecode_top;
973 op = c->bytecode_dest; 975 op = c->bytecode_dest;
976 bc = &current_thread->bc;
974 struct bc_frame *fp = bc->fp; 977 struct bc_frame *fp = bc->fp;
975 978
976 Lisp_Object fun = fp->fun; 979 Lisp_Object fun = fp->fun;
977 Lisp_Object bytestr = AREF (fun, CLOSURE_CODE); 980 Lisp_Object bytestr = AREF (fun, CLOSURE_CODE);
978 Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS); 981 Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS);
982#if GCC_LINT && __GNUC__ && !__clang__
983 /* These useless assignments pacify GCC 14.2.1 x86-64
984 <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21161>. */
985 bytestr_data = saved_bytestr_data;
986 vectorp = saved_vectorp;
987#endif
979 bytestr_data = SDATA (bytestr); 988 bytestr_data = SDATA (bytestr);
980 vectorp = XVECTOR (vector)->contents; 989 vectorp = XVECTOR (vector)->contents;
981 if (BYTE_CODE_SAFE) 990 if (BYTE_CODE_SAFE)
@@ -989,6 +998,11 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
989 goto op_branch; 998 goto op_branch;
990 } 999 }
991 1000
1001 saved_quitcounter = quitcounter;
1002#if GCC_LINT && __GNUC__ && !__clang__
1003 saved_vectorp = vectorp;
1004 saved_bytestr_data = bytestr_data;
1005#endif
992 NEXT; 1006 NEXT;
993 } 1007 }
994 1008