[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r114506: * eval.c (clobbered_eassert): New macro.,
Paul Eggert <=