aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorGerd Möllmann2024-10-19 04:50:24 +0200
committerGerd Möllmann2024-10-19 04:50:24 +0200
commitd864c26b207362b4591dc821fe8bae1394c61281 (patch)
tree280fc2df9dd8a8065061387fe62eea82c32ebd7a /src/bytecode.c
parent95a30325a84b9a3cefbfbd800141b6ffdfb3e26c (diff)
parent1854f2751e3f73e1e5f12f6de993b6357de1766b (diff)
downloademacs-d864c26b207362b4591dc821fe8bae1394c61281.tar.gz
emacs-d864c26b207362b4591dc821fe8bae1394c61281.zip
Merge branch 'master' into scratch/igc
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 07104a4c80e..31f7404cbd1 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -30,11 +30,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
30#include "window.h" 30#include "window.h"
31#include "puresize.h" 31#include "puresize.h"
32 32
33/* Work around GCC bug 54561. */
34#if GNUC_PREREQ (4, 3, 0)
35# pragma GCC diagnostic ignored "-Wclobbered"
36#endif
37
38/* Define BYTE_CODE_SAFE true to enable some minor sanity checking, 33/* Define BYTE_CODE_SAFE true to enable some minor sanity checking,
39 useful for debugging the byte compiler. It defaults to false. */ 34 useful for debugging the byte compiler. It defaults to false. */
40 35
@@ -551,6 +546,12 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
551 for (ptrdiff_t i = nargs - rest; i < nonrest; i++) 546 for (ptrdiff_t i = nargs - rest; i < nonrest; i++)
552 PUSH (Qnil); 547 PUSH (Qnil);
553 548
549 unsigned char volatile saved_quitcounter;
550#if GCC_LINT && __GNUC__ && !__clang__
551 Lisp_Object *volatile saved_vectorp;
552 unsigned char const *volatile saved_bytestr_data;
553#endif
554
554 while (true) 555 while (true)
555 { 556 {
556 int op; 557 int op;
@@ -982,15 +983,23 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
982 983
983 if (sys_setjmp (c->jmp)) 984 if (sys_setjmp (c->jmp))
984 { 985 {
986 quitcounter = saved_quitcounter;
985 struct handler *c = handlerlist; 987 struct handler *c = handlerlist;
986 handlerlist = c->next; 988 handlerlist = c->next;
987 top = c->bytecode_top; 989 top = c->bytecode_top;
988 op = c->bytecode_dest; 990 op = c->bytecode_dest;
991 bc = &current_thread->bc;
989 struct bc_frame *fp = bc->fp; 992 struct bc_frame *fp = bc->fp;
990 993
991 Lisp_Object fun = fp->fun; 994 Lisp_Object fun = fp->fun;
992 Lisp_Object bytestr = AREF (fun, CLOSURE_CODE); 995 Lisp_Object bytestr = AREF (fun, CLOSURE_CODE);
993 Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS); 996 Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS);
997#if GCC_LINT && __GNUC__ && !__clang__
998 /* These useless assignments pacify GCC 14.2.1 x86-64
999 <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21161>. */
1000 bytestr_data = saved_bytestr_data;
1001 vectorp = saved_vectorp;
1002#endif
994 bytestr_data = SDATA (bytestr); 1003 bytestr_data = SDATA (bytestr);
995 vectorp = XVECTOR (vector)->contents; 1004 vectorp = XVECTOR (vector)->contents;
996 if (BYTE_CODE_SAFE) 1005 if (BYTE_CODE_SAFE)
@@ -1004,6 +1013,11 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
1004 goto op_branch; 1013 goto op_branch;
1005 } 1014 }
1006 1015
1016 saved_quitcounter = quitcounter;
1017#if GCC_LINT && __GNUC__ && !__clang__
1018 saved_vectorp = vectorp;
1019 saved_bytestr_data = bytestr_data;
1020#endif
1007 NEXT; 1021 NEXT;
1008 } 1022 }
1009 1023