[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r115382: * src/lisp.h (FOR_EACH_TAIL): New macro.
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] trunk r115382: * src/lisp.h (FOR_EACH_TAIL): New macro. |
Date: |
Wed, 04 Dec 2013 22:10:51 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 115382
revision-id: address@hidden
parent: address@hidden
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Wed 2013-12-04 17:10:46 -0500
message:
* src/lisp.h (FOR_EACH_TAIL): New macro.
* src/fns.c (Fdelq): Use it to avoid inf-loops; remove QUIT.
modified:
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/fns.c fns.c-20091113204419-o5vbwnq5f7feedwu-203
src/lisp.h lisp.h-20091113204419-o5vbwnq5f7feedwu-253
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2013-12-04 21:08:21 +0000
+++ b/src/ChangeLog 2013-12-04 22:10:46 +0000
@@ -1,5 +1,8 @@
2013-12-04 Stefan Monnier <address@hidden>
+ * lisp.h (FOR_EACH_TAIL): New macro.
+ * fns.c (Fdelq): Use it to avoid inf-loops; remove QUIT.
+
* window.c (select_window): Call second wset_redisplay before we change
selected_window (bug#16034).
=== modified file 'src/fns.c'
--- a/src/fns.c 2013-11-29 19:47:58 +0000
+++ b/src/fns.c 2013-12-04 22:10:46 +0000
@@ -1537,15 +1537,12 @@
the value of a list `foo'. */)
(register Lisp_Object elt, Lisp_Object list)
{
- register Lisp_Object tail, prev;
- register Lisp_Object tem;
+ Lisp_Object tail, tortoise, prev = Qnil;
+ bool skip;
- tail = list;
- prev = Qnil;
- while (CONSP (tail))
+ FOR_EACH_TAIL (tail, list, tortoise, skip)
{
- CHECK_LIST_CONS (tail, list);
- tem = XCAR (tail);
+ Lisp_Object tem = XCAR (tail);
if (EQ (elt, tem))
{
if (NILP (prev))
@@ -1555,8 +1552,6 @@
}
else
prev = tail;
- tail = XCDR (tail);
- QUIT;
}
return list;
}
=== modified file 'src/lisp.h'
--- a/src/lisp.h 2013-11-30 09:25:31 +0000
+++ b/src/lisp.h 2013-12-04 22:10:46 +0000
@@ -4443,6 +4443,20 @@
memory_full (SIZE_MAX); \
} while (0)
+/* Loop over all tails of a list, checking for cycles.
+ FIXME: Make tortoise and n internal declarations.
+ FIXME: Unroll the loop body so we don't need `n'. */
+#define FOR_EACH_TAIL(hare, list, tortoise, n) \
+ for (tortoise = hare = (list), n = true; \
+ CONSP (hare); \
+ (hare = XCDR (hare), n = !n, \
+ (n \
+ ? ((EQ (hare, tortoise) \
+ && (xsignal1 (Qcircular_list, (list)), 0))) \
+ /* Move tortoise before the next iteration, in case */ \
+ /* the next iteration does an Fsetcdr. */ \
+ : (tortoise = XCDR (tortoise), 0))))
+
/* Do a `for' loop over alist values. */
#define FOR_EACH_ALIST_VALUE(head_var, list_var, value_var) \
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r115382: * src/lisp.h (FOR_EACH_TAIL): New macro.,
Stefan Monnier <=