emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r114506: * eval.c (clobbered_eassert): New macro.


From: Paul Eggert
Subject: [Emacs-diffs] trunk r114506: * eval.c (clobbered_eassert): New macro.
Date: Thu, 03 Oct 2013 06:31:17 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 114506
revision-id: address@hidden
parent: address@hidden
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Wed 2013-10-02 23:31:06 -0700
message:
  * eval.c (clobbered_eassert): New macro.
  
  (internal_catch, internal_condition_case)
  (internal_condition_case_1, internal_condition_case_2)
  (internal_condition_case_n): Use it instead of eassert
  when the argument contains locals clobbered by longjmp.
  Don't use clobbered locals outside of clobbered_eassert.
  (internal_lisp_condition_case): Use a volatile variable
  to work around a local variable's getting clobbered.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/eval.c                     eval.c-20091113204419-o5vbwnq5f7feedwu-237
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-10-03 04:58:56 +0000
+++ b/src/ChangeLog     2013-10-03 06:31:06 +0000
@@ -1,3 +1,14 @@
+2013-10-03  Paul Eggert  <address@hidden>
+
+       * eval.c (clobbered_eassert): New macro.
+       (internal_catch, internal_condition_case)
+       (internal_condition_case_1, internal_condition_case_2)
+       (internal_condition_case_n): Use it instead of eassert
+       when the argument contains locals clobbered by longjmp.
+       Don't use clobbered locals outside of clobbered_eassert.
+       (internal_lisp_condition_case): Use a volatile variable
+       to work around a local variable's getting clobbered.
+
 2013-10-03  Stefan Monnier  <address@hidden>
 
        * lisp.h (struct handler): Merge struct handler and struct catchtag.

=== modified file 'src/eval.c'
--- a/src/eval.c        2013-10-03 04:58:56 +0000
+++ b/src/eval.c        2013-10-03 06:31:06 +0000
@@ -1072,6 +1072,12 @@
   return internal_catch (tag, Fprogn, XCDR (args));
 }
 
+/* Assert that E is true, as a comment only.  Use this instead of
+   eassert (E) when E contains variables that might be clobbered by a
+   longjmp.  */
+
+#define clobbered_eassert(E) ((void) 0)
+
 /* Set up a catch, then call C function FUNC on argument ARG.
    FUNC should return a Lisp_Object.
    This is how catches are done from within C code.  */
@@ -1089,14 +1095,14 @@
   if (! sys_setjmp (c->jmp))
     {
       Lisp_Object val = (*func) (arg);
-      eassert (handlerlist == c);
-      handlerlist = c->next;
+      clobbered_eassert (handlerlist == c);
+      handlerlist = handlerlist->next;
       return val;
     }
   else
     { /* Throw works by a longjmp that comes right here.  */
       Lisp_Object val = handlerlist->val;
-      eassert (handlerlist == c);
+      clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return val;
     }
@@ -1252,6 +1258,7 @@
        be added to handlerlist last.  So we build in `clauses' a table that
        contains `handlers' but in reverse order.  */
     Lisp_Object *clauses = alloca (clausenb * sizeof (Lisp_Object *));
+    Lisp_Object *volatile clauses_volatile = clauses;
     int i = clausenb;
     for (val = handlers; CONSP (val); val = XCDR (val))
       clauses[--i] = XCAR (val);
@@ -1266,7 +1273,7 @@
          {
            ptrdiff_t count = SPECPDL_INDEX ();
            Lisp_Object val = handlerlist->val;
-           Lisp_Object *chosen_clause = clauses;
+           Lisp_Object *chosen_clause = clauses_volatile;
            for (c = handlerlist->next; c != oldhandlerlist; c = c->next)
              chosen_clause++;
            handlerlist = oldhandlerlist;
@@ -1316,14 +1323,14 @@
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
-      eassert (handlerlist == c);
+      clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return (*hfun) (val);
     }
 
   val = (*bfun) ();
-  eassert (handlerlist == c);
-  handlerlist = c->next;
+  clobbered_eassert (handlerlist == c);
+  handlerlist = handlerlist->next;
   return val;
 }
 
@@ -1340,14 +1347,14 @@
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
-      eassert (handlerlist == c);
+      clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return (*hfun) (val);
     }
 
   val = (*bfun) (arg);
-  eassert (handlerlist == c);
-  handlerlist = c->next;
+  clobbered_eassert (handlerlist == c);
+  handlerlist = handlerlist->next;
   return val;
 }
 
@@ -1368,14 +1375,14 @@
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
-      eassert (handlerlist == c);
+      clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return (*hfun) (val);
     }
 
   val = (*bfun) (arg1, arg2);
-  eassert (handlerlist == c);
-  handlerlist = c->next;
+  clobbered_eassert (handlerlist == c);
+  handlerlist = handlerlist->next;
   return val;
 }
 
@@ -1398,14 +1405,14 @@
   if (sys_setjmp (c->jmp))
     {
       Lisp_Object val = handlerlist->val;
-      eassert (handlerlist == c);
+      clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
       return (*hfun) (val, nargs, args);
     }
 
   val = (*bfun) (nargs, args);
-  eassert (handlerlist == c);
-  handlerlist = c->next;
+  clobbered_eassert (handlerlist == c);
+  handlerlist = handlerlist->next;
   return val;
 }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]