emacs-elpa-diffs
[Top][All Lists]
Advanced

[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)))
 



reply via email to

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