Skip to content

Commit 8c25431

Browse files
authored
Merge pull request #1024 from Wilfred/emacs-fix-stack-overflow
Emacs: fix stack overflow on large files
2 parents b090fe2 + 97cf026 commit 8c25431

File tree

1 file changed

+33
-40
lines changed

1 file changed

+33
-40
lines changed

emacs/merlin-imenu.el

+33-40
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,10 @@
1414
(require 'subr-x)
1515
(require 'merlin)
1616

17-
;;; enable depth and size threshold for OCaml modules with big size
18-
(setq max-lisp-eval-depth 10000)
19-
(setq max-specpdl-size 10000)
20-
2117
;; lists of different outline items
22-
(defvar-local value-list nil)
23-
(defvar-local type-list nil)
24-
(defvar-local exception-list nil)
18+
(defvar-local merlin-imenu--value-list nil)
19+
(defvar-local merlin-imenu--type-list nil)
20+
(defvar-local merlin-imenu--exception-list nil)
2521

2622
(defun merlin-imenu-compute-position (line col)
2723
"Get location of the item."
@@ -47,44 +43,41 @@
4743
(type (propertize type 'face 'font-lock-doc-face)))
4844
(if (string= type "null") name (concat name " : " type))))
4945

50-
(defun merlin-imenu-parse-outline-item (prefix item)
51-
"Parse one item of the outline tree."
52-
(let* ((line (cdr (assoc 'line (assoc 'start item))))
53-
(col (cdr (assoc 'col (assoc 'start item))))
54-
(name (cdr (assoc 'name item)))
55-
(kind (cdr (assoc 'kind item)))
56-
(type (cdr (assoc 'type item)))
57-
(sub-trees (cdr (assoc 'children item)))
58-
(entry (merlin-imenu-create-entry prefix name type kind line col))
59-
(position (merlin-imenu-compute-position line col))
60-
(marker (cons entry (set-marker (make-marker) position))))
61-
(cond ((string= kind "Value")
62-
(setq value-list (cons marker value-list)))
63-
((string= kind "Type")
64-
(setq type-list (cons marker type-list)))
65-
((string= kind "Exn")
66-
(setq exception-list (cons marker exception-list))))
67-
(if (and (listp sub-trees) (not (null sub-trees)))
68-
(merlin-imenu-parse-outline-tree (concat prefix entry ".") sub-trees))))
69-
70-
(defun merlin-imenu-parse-outline-tree (prefix outline)
71-
"Parse outline tree."
72-
(when (not (null outline))
73-
(merlin-imenu-parse-outline-item prefix (car outline))
74-
(merlin-imenu-parse-outline-tree prefix (cdr outline))))
46+
(defun merlin-imenu-parse-outline (prefix outline)
47+
(dolist (item outline)
48+
(let* ((line (cdr (assoc 'line (assoc 'start item))))
49+
(col (cdr (assoc 'col (assoc 'start item))))
50+
(name (cdr (assoc 'name item)))
51+
(kind (cdr (assoc 'kind item)))
52+
(type (cdr (assoc 'type item)))
53+
(sub-trees (cdr (assoc 'children item)))
54+
(entry (merlin-imenu-create-entry prefix name type kind line col))
55+
(position (merlin-imenu-compute-position line col))
56+
(marker (cons entry (set-marker (make-marker) position))))
57+
(cond ((string= kind "Value")
58+
(setq merlin-imenu--value-list (cons marker merlin-imenu--value-list)))
59+
((string= kind "Type")
60+
(setq merlin-imenu--type-list (cons marker merlin-imenu--type-list)))
61+
((string= kind "Exn")
62+
(setq merlin-imenu--exception-list (cons marker merlin-imenu--exception-list))))
63+
(when sub-trees
64+
(merlin-imenu-parse-outline (concat prefix entry ".") sub-trees)))))
7565

7666
(defun merlin-imenu-create-index ()
7767
"Create data for imenu using the merlin outline feature."
7868
;; Reset local vars
79-
(setq value-list nil
80-
type-list nil
81-
exception-list nil)
69+
(setq merlin-imenu--value-list nil
70+
merlin-imenu--type-list nil
71+
merlin-imenu--exception-list nil)
8272
;; Read outline tree
83-
(merlin-imenu-parse-outline-tree "" (merlin/call "outline"))
84-
(let ((index ()))
85-
(when value-list (push (cons "Value" value-list) index))
86-
(when exception-list (push (cons "Exception" exception-list) index))
87-
(when type-list (push (cons "Type" type-list) index))
73+
(merlin-imenu-parse-outline "" (merlin/call "outline"))
74+
(let ((index nil))
75+
(when merlin-imenu--value-list
76+
(push (cons "Value" merlin-imenu--value-list) index))
77+
(when merlin-imenu--exception-list
78+
(push (cons "Exception" merlin-imenu--exception-list) index))
79+
(when merlin-imenu--type-list
80+
(push (cons "Type" merlin-imenu--type-list) index))
8881
index))
8982

9083
;;;###autoload

0 commit comments

Comments
 (0)