[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search 8875d2a 137/332: Avoid infinite recursion in
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search 8875d2a 137/332: Avoid infinite recursion in circular programs |
Date: |
Tue, 1 Dec 2020 15:48:29 -0500 (EST) |
branch: externals/el-search
commit 8875d2a0a595163072ff99862148f75199c99a9e
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Avoid infinite recursion in circular programs
Prevent heuristic matching go into an infinite recursion in circular
programs like '#1=(1 . #1#).
---
el-search.el | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/el-search.el b/el-search.el
index dfe3b78..601ce4d 100644
--- a/el-search.el
+++ b/el-search.el
@@ -958,19 +958,25 @@ non-nil else."
atom-list))))))
(defun el-search--flatten-tree (tree)
- (let ((elements ()))
+ (let ((elements ())
+ (walked-objects ;to avoid infinite recursion for circular TREEs
+ (make-hash-table :test #'eq))
+ (gc-cons-percentage 0.8)) ;Why is binding it here more effective than
binding it more top-level?
(cl-labels ((walker (object)
(if (or (not (sequencep object)) (stringp object)
(null object)
(char-table-p object) (bool-vector-p object))
(push object elements)
- (if (consp object)
- (progn
- (while (consp object)
- (walker (car object))
- (setq object (cdr object)))
- (when object ;dotted list
- (walker object)))
- (cl-loop for elt being the elements of object do
(walker elt))))))
+ (unless (gethash object walked-objects)
+ (puthash object t walked-objects)
+ (if (consp object)
+ (progn
+ (while (consp object)
+ (walker (car object))
+ (setq object (cdr object))
+ (when (gethash object walked-objects)
(setq object nil)))
+ (when object ;dotted list
+ (walker object)))
+ (cl-loop for elt being the elements of object do
(walker elt)))))))
(walker tree)
elements)))
- [elpa] externals/el-search 94b79e5 149/332: Add new pattern type `de-morgan', (continued)
- [elpa] externals/el-search 94b79e5 149/332: Add new pattern type `de-morgan', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 3b73e0e 154/332: Extend heuristic matching to top-level sexps, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 0cff5d2 153/332: Recompile search pattern when resuming searches, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 51a539a 158/332: Implement multi-buffer query-replace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 56d9f20 165/332: Add some useful commands for *El Occur* buffers, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 40217c0 174/332: Fix replacing matches with nil, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1bfe7c0 110/332: Simplify `el-search--transform-nontrivial-lpat', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 6ff7aa4 116/332: Work around Emacs bug#24542, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 817c902 123/332: Document change-revision transformer function; make a defcustom, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2d6aad6 132/332: Explicitly `error' when trying to jump to invalid search head, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8875d2a 137/332: Avoid infinite recursion in circular programs,
Stefan Monnier <=
- [elpa] externals/el-search f02e86f 142/332: New command `el-search-from-beginning', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 4b6a363 138/332: Improve handling of reader errors in el-search-atom-list, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 806bfc4 157/332: Add new command `el-search-this-sexp', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c66d1da 160/332: Make the el-search-object struct contain an alist of properties, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 4a6c3e2 162/332: Some details, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d412688 199/332: Update copyrights of some packages, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search cf465e0 203/332: * el-search/el-search.el: Add two more autoload cookies, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 42c776a 207/332: * el-search/el-search.el: Tweak el-search-jump-to-search-head, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ce97e9d 108/332: el-search: bump version to 0.2.2, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e5bd647 214/332: * el-search/el-search.el: Work around Emacs Bug#29857, Stefan Monnier, 2020/12/01