aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorMattias EngdegÄrd2022-09-19 10:55:09 +0200
committerMattias EngdegÄrd2022-09-19 19:30:03 +0200
commit60102016e416e5c19fa5945aeb80693dac7ff2e6 (patch)
tree69979ff773d7031634e7bc4f4388abc4ae104717 /lisp
parenta7c65fc6660878e244432a5b25fb3a4ff20e8604 (diff)
downloademacs-60102016e416e5c19fa5945aeb80693dac7ff2e6.tar.gz
emacs-60102016e416e5c19fa5945aeb80693dac7ff2e6.zip
Abolish max-specpdl-size (bug#57911)
The max-lisp-eval-depth limit is sufficient to prevent unbounded stack growth including the specbind stack; simplify matters for the user by not having them to worry about two different limits. This change turns max-specpdl-size into a harmless variable with no effects, to keep existing code happy. * lisp/subr.el (max-specpdl-size): Define as an ordinary (but obsolete) dynamic variable. * admin/grammars/Makefile.in: * doc/lispintro/emacs-lisp-intro.texi (Loops & Recursion): * doc/lispref/control.texi (Cleanups): * doc/lispref/edebug.texi (Checking Whether to Stop): * doc/lispref/eval.texi (Eval): * doc/lispref/variables.texi (Local Variables): * doc/misc/calc.texi (Recursion Depth): Update documentation. * etc/NEWS: Announce. * src/eval.c (FletX): Use safe iteration to guard against circular bindings list. (syms_of_eval): Remove old max-specpdl-size definition. (init_eval_once, restore_stack_limits, call_debugger) (signal_or_quit, grow_specpdl_allocation): * leim/Makefile.in: * lisp/Makefile.in: * lisp/calc/calc-stuff.el (calc-more-recursion-depth) (calc-less-recursion-depth): * lisp/calc/calc.el (calc-do): * lisp/cedet/semantic/ede-grammar.el (ede-proj-makefile-insert-rules): * lisp/cedet/semantic/grammar.el (semantic-grammar-batch-build-one-package): * lisp/cus-start.el (standard): * lisp/emacs-lisp/comp.el (comp--native-compile): * lisp/emacs-lisp/edebug.el (edebug-max-depth): (edebug-read-and-maybe-wrap-form, edebug-default-enter): * lisp/emacs-lisp/regexp-opt.el (regexp-opt): * lisp/eshell/esh-mode.el (eshell-mode): * lisp/loadup.el (max-specpdl-size): * lisp/mh-e/mh-e.el (mh-invisible-headers): * lisp/net/shr.el (shr-insert-document, shr-descend): * lisp/play/hanoi.el (hanoi-internal): * lisp/progmodes/cperl-mode.el: * src/fileio.c (Fdo_auto_save): Remove references to and modifications of max-specpdl-size.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/Makefile.in8
-rw-r--r--lisp/calc/calc-stuff.el8
-rw-r--r--lisp/calc/calc.el3
-rw-r--r--lisp/cedet/semantic/ede-grammar.el7
-rw-r--r--lisp/cedet/semantic/grammar.el1
-rw-r--r--lisp/cus-start.el1
-rw-r--r--lisp/emacs-lisp/comp.el1
-rw-r--r--lisp/emacs-lisp/edebug.el6
-rw-r--r--lisp/emacs-lisp/regexp-opt.el1
-rw-r--r--lisp/eshell/esh-mode.el1
-rw-r--r--lisp/loadup.el4
-rw-r--r--lisp/mh-e/mh-e.el4
-rw-r--r--lisp/net/shr.el62
-rw-r--r--lisp/play/hanoi.el5
-rw-r--r--lisp/progmodes/cperl-mode.el1
-rw-r--r--lisp/subr.el8
16 files changed, 50 insertions, 71 deletions
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index c73a623cce9..bcf4a3146d4 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -70,9 +70,7 @@ BYTE_COMPILE_FLAGS = \
70 --eval "(setq load-prefer-newer t byte-compile-warnings 'all)" \ 70 --eval "(setq load-prefer-newer t byte-compile-warnings 'all)" \
71 $(BYTE_COMPILE_EXTRA_FLAGS) 71 $(BYTE_COMPILE_EXTRA_FLAGS)
72# ... but we must prefer .elc files for those in the early bootstrap. 72# ... but we must prefer .elc files for those in the early bootstrap.
73# A larger `max-specpdl-size' is needed for emacs-lisp/comp.el. 73compile-first: BYTE_COMPILE_FLAGS = $(BYTE_COMPILE_EXTRA_FLAGS)
74compile-first: BYTE_COMPILE_FLAGS = \
75 --eval '(setq max-specpdl-size 5000)' $(BYTE_COMPILE_EXTRA_FLAGS)
76 74
77# Files to compile before others during a bootstrap. This is done to 75# Files to compile before others during a bootstrap. This is done to
78# speed up the bootstrap process. They're ordered by size, so we use 76# speed up the bootstrap process. They're ordered by size, so we use
@@ -342,8 +340,8 @@ compile-first: $(COMPILE_FIRST)
342 340
343.PHONY: compile-targets 341.PHONY: compile-targets
344# TARGETS is set dynamically in the recursive call from 'compile-main'. 342# TARGETS is set dynamically in the recursive call from 'compile-main'.
345# Do not build comp.el unless necessary not to exceed max-specpdl-size and 343# Do not build comp.el unless necessary not to exceed max-lisp-eval-depth
346# max-lisp-eval-depth in normal builds. 344# in normal builds.
347ifneq ($(HAVE_NATIVE_COMP),yes) 345ifneq ($(HAVE_NATIVE_COMP),yes)
348compile-targets: $(filter-out ./emacs-lisp/comp-cstr.elc,$(filter-out ./emacs-lisp/comp.elc,$(TARGETS))) 346compile-targets: $(filter-out ./emacs-lisp/comp-cstr.elc,$(filter-out ./emacs-lisp/comp.elc,$(TARGETS)))
349else 347else
diff --git a/lisp/calc/calc-stuff.el b/lisp/calc/calc-stuff.el
index 0e8ea42bedc..758b9201843 100644
--- a/lisp/calc/calc-stuff.el
+++ b/lisp/calc/calc-stuff.el
@@ -52,18 +52,14 @@ With a prefix, push that prefix as a number onto the stack."
52 (calc-less-recursion-depth n) 52 (calc-less-recursion-depth n)
53 (let ((n (if n (prefix-numeric-value n) 2))) 53 (let ((n (if n (prefix-numeric-value n) 2)))
54 (if (> n 1) 54 (if (> n 1)
55 (setq max-specpdl-size (* max-specpdl-size n) 55 (setq max-lisp-eval-depth (* max-lisp-eval-depth n))))
56 max-lisp-eval-depth (* max-lisp-eval-depth n))))
57 (message "max-lisp-eval-depth is now %d" max-lisp-eval-depth)))) 56 (message "max-lisp-eval-depth is now %d" max-lisp-eval-depth))))
58 57
59(defun calc-less-recursion-depth (n) 58(defun calc-less-recursion-depth (n)
60 (interactive "P") 59 (interactive "P")
61 (let ((n (if n (prefix-numeric-value n) 2))) 60 (let ((n (if n (prefix-numeric-value n) 2)))
62 (if (> n 1) 61 (if (> n 1)
63 (setq max-specpdl-size 62 (setq max-lisp-eval-depth (max (/ max-lisp-eval-depth n) 200))))
64 (max (/ max-specpdl-size n) 600)
65 max-lisp-eval-depth
66 (max (/ max-lisp-eval-depth n) 200))))
67 (message "max-lisp-eval-depth is now %d" max-lisp-eval-depth)) 63 (message "max-lisp-eval-depth is now %d" max-lisp-eval-depth))
68 64
69 65
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index 5077c8c8528..c0f87ad3d42 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -1625,8 +1625,7 @@ See calc-keypad for details."
1625 (error 1625 (error
1626 (if (and (eq (car err) 'error) 1626 (if (and (eq (car err) 'error)
1627 (stringp (nth 1 err)) 1627 (stringp (nth 1 err))
1628 (string-match "max-specpdl-size\\|max-lisp-eval-depth" 1628 (string-search "max-lisp-eval-depth" (nth 1 err)))
1629 (nth 1 err)))
1630 (error (substitute-command-keys 1629 (error (substitute-command-keys
1631 "Computation got stuck or ran too long. Type \\`M' to increase the limit")) 1630 "Computation got stuck or ran too long. Type \\`M' to increase the limit"))
1632 (setq calc-aborted-prefix nil) 1631 (setq calc-aborted-prefix nil)
diff --git a/lisp/cedet/semantic/ede-grammar.el b/lisp/cedet/semantic/ede-grammar.el
index ff9f991ff4a..40ff8fc86d3 100644
--- a/lisp/cedet/semantic/ede-grammar.el
+++ b/lisp/cedet/semantic/ede-grammar.el
@@ -177,10 +177,9 @@ Lays claim to all -by.el, and -wy.el files."
177 177
178(cl-defmethod ede-proj-makefile-insert-rules :after ((this semantic-ede-proj-target-grammar)) 178(cl-defmethod ede-proj-makefile-insert-rules :after ((this semantic-ede-proj-target-grammar))
179 "Insert rules needed by THIS target. 179 "Insert rules needed by THIS target.
180This raises `max-specpdl-size' and `max-lisp-eval-depth', which can be 180This raises `max-lisp-eval-depth', which can be needed for the compilation
181needed for the compilation of the resulting parsers." 181of the resulting parsers."
182 (insert (format "%s: EMACSFLAGS+= --eval '(setq max-specpdl-size 1500 \ 182 (insert (format "%s: EMACSFLAGS+= --eval '(setq max-lisp-eval-depth 700)'\n"
183max-lisp-eval-depth 700)'\n"
184 (oref this name)))) 183 (oref this name))))
185 184
186(cl-defmethod ede-proj-makefile-insert-dist-dependencies ((this semantic-ede-proj-target-grammar)) 185(cl-defmethod ede-proj-makefile-insert-dist-dependencies ((this semantic-ede-proj-target-grammar))
diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el
index 72037f47108..8ba0e346fff 100644
--- a/lisp/cedet/semantic/grammar.el
+++ b/lisp/cedet/semantic/grammar.el
@@ -1009,7 +1009,6 @@ Return non-nil if there were no errors, nil if errors."
1009 packagename (byte-compile-dest-file packagename)) 1009 packagename (byte-compile-dest-file packagename))
1010 (let (;; Some complex grammar table expressions need a few 1010 (let (;; Some complex grammar table expressions need a few
1011 ;; more resources than the default. 1011 ;; more resources than the default.
1012 (max-specpdl-size (max 3000 max-specpdl-size))
1013 (max-lisp-eval-depth (max 1000 max-lisp-eval-depth)) 1012 (max-lisp-eval-depth (max 1000 max-lisp-eval-depth))
1014 ) 1013 )
1015 ;; byte compile the resultant file 1014 ;; byte compile the resultant file
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 0e1cb4589da..d7fb56c9854 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -251,7 +251,6 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
251 ;; emacs.c 251 ;; emacs.c
252 (report-emacs-bug-address emacsbug string) 252 (report-emacs-bug-address emacsbug string)
253 ;; eval.c 253 ;; eval.c
254 (max-specpdl-size limits integer)
255 (max-lisp-eval-depth limits integer) 254 (max-lisp-eval-depth limits integer)
256 (max-mini-window-height limits 255 (max-mini-window-height limits
257 (choice (const :tag "quarter screen" nil) 256 (choice (const :tag "quarter screen" nil)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index a9087313b18..35acbff9b17 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -4044,7 +4044,6 @@ the deferred compilation mechanism."
4044 (list "Not a function symbol or file" function-or-file))) 4044 (list "Not a function symbol or file" function-or-file)))
4045 (catch 'no-native-compile 4045 (catch 'no-native-compile
4046 (let* ((print-symbols-bare t) 4046 (let* ((print-symbols-bare t)
4047 (max-specpdl-size (max max-specpdl-size 5000))
4048 (data function-or-file) 4047 (data function-or-file)
4049 (comp-native-compiling t) 4048 (comp-native-compiling t)
4050 (byte-native-qualities nil) 4049 (byte-native-qualities nil)
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 31c05057bfa..67704bdb51c 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -129,7 +129,7 @@ contains an infinite loop. When Edebug is instrumenting code
129containing very large quoted lists, it may reach this limit and give 129containing very large quoted lists, it may reach this limit and give
130the error message \"Too deep - perhaps infinite loop in spec?\". 130the error message \"Too deep - perhaps infinite loop in spec?\".
131Make this limit larger to countermand that, but you may also need to 131Make this limit larger to countermand that, but you may also need to
132increase `max-lisp-eval-depth' and `max-specpdl-size'." 132increase `max-lisp-eval-depth'."
133 :type 'integer 133 :type 'integer
134 :version "26.1") 134 :version "26.1")
135 135
@@ -1107,8 +1107,7 @@ purpose by adding an entry to this alist, and setting
1107 edebug-best-error 1107 edebug-best-error
1108 edebug-error-point 1108 edebug-error-point
1109 ;; Do this once here instead of several times. 1109 ;; Do this once here instead of several times.
1110 (max-lisp-eval-depth (+ 800 max-lisp-eval-depth)) 1110 (max-lisp-eval-depth (+ 800 max-lisp-eval-depth)))
1111 (max-specpdl-size (+ 2000 max-specpdl-size)))
1112 (let ((no-match 1111 (let ((no-match
1113 (catch 'no-match 1112 (catch 'no-match
1114 (setq result (edebug-read-and-maybe-wrap-form1)) 1113 (setq result (edebug-read-and-maybe-wrap-form1))
@@ -2317,7 +2316,6 @@ and run its entry function, and set up `edebug-before' and
2317 ;; but not inside an unwind-protect. 2316 ;; but not inside an unwind-protect.
2318 ;; Doing it here also keeps it from growing too large. 2317 ;; Doing it here also keeps it from growing too large.
2319 (max-lisp-eval-depth (+ 100 max-lisp-eval-depth)) ; too much?? 2318 (max-lisp-eval-depth (+ 100 max-lisp-eval-depth)) ; too much??
2320 (max-specpdl-size (+ 200 max-specpdl-size))
2321 2319
2322 (debugger edebug-debugger) ; only while edebug is active. 2320 (debugger edebug-debugger) ; only while edebug is active.
2323 (edebug-outside-debug-on-error debug-on-error) 2321 (edebug-outside-debug-on-error debug-on-error)
diff --git a/lisp/emacs-lisp/regexp-opt.el b/lisp/emacs-lisp/regexp-opt.el
index cae5dd00d1d..4d5a39458d2 100644
--- a/lisp/emacs-lisp/regexp-opt.el
+++ b/lisp/emacs-lisp/regexp-opt.el
@@ -133,7 +133,6 @@ usually more efficient than that of a simplified version:
133 (save-match-data 133 (save-match-data
134 ;; Recurse on the sorted list. 134 ;; Recurse on the sorted list.
135 (let* ((max-lisp-eval-depth 10000) 135 (let* ((max-lisp-eval-depth 10000)
136 (max-specpdl-size 10000)
137 (completion-ignore-case nil) 136 (completion-ignore-case nil)
138 (completion-regexp-list nil) 137 (completion-regexp-list nil)
139 (open (cond ((stringp paren) paren) (paren "\\("))) 138 (open (cond ((stringp paren) paren) (paren "\\(")))
diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el
index 69069183a3f..8f11e6f04a4 100644
--- a/lisp/eshell/esh-mode.el
+++ b/lisp/eshell/esh-mode.el
@@ -331,7 +331,6 @@ and the hook `eshell-exit-hook'."
331 (setq-local require-final-newline nil) 331 (setq-local require-final-newline nil)
332 332
333 (setq-local max-lisp-eval-depth (max 3000 max-lisp-eval-depth)) 333 (setq-local max-lisp-eval-depth (max 3000 max-lisp-eval-depth))
334 (setq-local max-specpdl-size (max 6000 max-lisp-eval-depth))
335 334
336 (setq-local eshell-last-input-start (point-marker)) 335 (setq-local eshell-last-input-start (point-marker))
337 (setq-local eshell-last-input-end (point-marker)) 336 (setq-local eshell-last-input-end (point-marker))
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 634a3314361..c01c827a75e 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -244,9 +244,7 @@
244(load "language/indonesian") 244(load "language/indonesian")
245 245
246(load "indent") 246(load "indent")
247(let ((max-specpdl-size (max max-specpdl-size 1800))) 247(load "emacs-lisp/cl-generic")
248 ;; A particularly demanding file to load; 1600 does not seem to be enough.
249 (load "emacs-lisp/cl-generic"))
250(load "simple") 248(load "simple")
251(load "emacs-lisp/seq") 249(load "emacs-lisp/seq")
252(load "emacs-lisp/nadvice") 250(load "emacs-lisp/nadvice")
diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el
index 0ad934107d3..9a04d890973 100644
--- a/lisp/mh-e/mh-e.el
+++ b/lisp/mh-e/mh-e.el
@@ -2831,9 +2831,7 @@ removed and entries from `mh-invisible-header-fields' are added."
2831 (setq mh-invisible-header-fields-compiled 2831 (setq mh-invisible-header-fields-compiled
2832 (concat 2832 (concat
2833 "^" 2833 "^"
2834 ;; workaround for insufficient default 2834 (regexp-opt fields t)))
2835 (let ((max-specpdl-size 1000))
2836 (regexp-opt fields t))))
2837 (setq mh-invisible-header-fields-compiled nil)))) 2835 (setq mh-invisible-header-fields-compiled nil))))
2838 2836
2839;; Compile invisible header fields. 2837;; Compile invisible header fields.
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index 54ce9b1a41c..d56420eb02e 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -373,7 +373,6 @@ DOM should be a parse tree as generated by
373 shr-width 373 shr-width
374 (* shr-width (frame-char-width))) 374 (* shr-width (frame-char-width)))
375 (shr--window-width))) 375 (shr--window-width)))
376 (max-specpdl-size max-specpdl-size)
377 (shr--link-targets nil) 376 (shr--link-targets nil)
378 (hscroll (window-hscroll)) 377 (hscroll (window-hscroll))
379 ;; `bidi-display-reordering' is supposed to be only used for 378 ;; `bidi-display-reordering' is supposed to be only used for
@@ -625,41 +624,34 @@ size, and full-buffer size."
625 (shr-stylesheet shr-stylesheet) 624 (shr-stylesheet shr-stylesheet)
626 (shr-depth (1+ shr-depth)) 625 (shr-depth (1+ shr-depth))
627 (start (point))) 626 (start (point)))
628 ;; shr uses many frames per nested node. 627 (when style
629 (if (and (> shr-depth (/ max-specpdl-size 15)) 628 (if (string-match-p "color\\|display\\|border-collapse" style)
630 (not (and shr-offer-extend-specpdl 629 (setq shr-stylesheet (nconc (shr-parse-style style)
631 (y-or-n-p "Too deeply nested to render properly; increase `max-specpdl-size'?") 630 shr-stylesheet))
632 (setq max-specpdl-size (* max-specpdl-size 2))))) 631 (setq style nil)))
633 (setq shr-warning 632 ;; If we have a display:none, then just ignore this part of the DOM.
634 "Not rendering the complete page because of too-deep nesting") 633 (unless (or (equal (cdr (assq 'display shr-stylesheet)) "none")
634 (and shr-discard-aria-hidden
635 (equal (dom-attr dom 'aria-hidden) "true")))
636 ;; We don't use shr-indirect-call here, since shr-descend is
637 ;; the central bit of shr.el, and should be as fast as
638 ;; possible. Having one more level of indirection with its
639 ;; negative effect on performance is deemed unjustified in
640 ;; this case.
641 (cond (external
642 (funcall external dom))
643 ((fboundp function)
644 (funcall function dom))
645 (t
646 (shr-generic dom)))
647 (when-let ((id (dom-attr dom 'id)))
648 (push (cons id (set-marker (make-marker) start)) shr--link-targets))
649 ;; If style is set, then this node has set the color.
635 (when style 650 (when style
636 (if (string-match-p "color\\|display\\|border-collapse" style) 651 (shr-colorize-region
637 (setq shr-stylesheet (nconc (shr-parse-style style) 652 start (point)
638 shr-stylesheet)) 653 (cdr (assq 'color shr-stylesheet))
639 (setq style nil))) 654 (cdr (assq 'background-color shr-stylesheet)))))))
640 ;; If we have a display:none, then just ignore this part of the DOM.
641 (unless (or (equal (cdr (assq 'display shr-stylesheet)) "none")
642 (and shr-discard-aria-hidden
643 (equal (dom-attr dom 'aria-hidden) "true")))
644 ;; We don't use shr-indirect-call here, since shr-descend is
645 ;; the central bit of shr.el, and should be as fast as
646 ;; possible. Having one more level of indirection with its
647 ;; negative effect on performance is deemed unjustified in
648 ;; this case.
649 (cond (external
650 (funcall external dom))
651 ((fboundp function)
652 (funcall function dom))
653 (t
654 (shr-generic dom)))
655 (when-let ((id (dom-attr dom 'id)))
656 (push (cons id (set-marker (make-marker) start)) shr--link-targets))
657 ;; If style is set, then this node has set the color.
658 (when style
659 (shr-colorize-region
660 start (point)
661 (cdr (assq 'color shr-stylesheet))
662 (cdr (assq 'background-color shr-stylesheet))))))))
663 655
664(defun shr-fill-text (text) 656(defun shr-fill-text (text)
665 (if (zerop (length text)) 657 (if (zerop (length text))
diff --git a/lisp/play/hanoi.el b/lisp/play/hanoi.el
index 58fb82b6ed0..1a4b6dbeb11 100644
--- a/lisp/play/hanoi.el
+++ b/lisp/play/hanoi.el
@@ -149,10 +149,9 @@ BITS must be of length nrings. Start at START-TIME."
149 (setq show-trailing-whitespace nil) 149 (setq show-trailing-whitespace nil)
150 (unwind-protect 150 (unwind-protect
151 (let* 151 (let*
152 (;; These lines can cause Emacs to crash if you ask for too 152 (;; This line can cause Emacs to crash if you ask for too
153 ;; many rings. If you uncomment them, on most systems you 153 ;; many rings. If you uncomment it, on most systems you
154 ;; can get 10,000+ rings. 154 ;; can get 10,000+ rings.
155 ;;(max-specpdl-size (max max-specpdl-size (* nrings 15)))
156 ;;(max-lisp-eval-depth (max max-lisp-eval-depth (+ nrings 20))) 155 ;;(max-lisp-eval-depth (max max-lisp-eval-depth (+ nrings 20)))
157 (vert (not hanoi-horizontal-flag)) 156 (vert (not hanoi-horizontal-flag))
158 (pole-width (length (format "%d" (max 0 (1- nrings))))) 157 (pole-width (length (format "%d" (max 0 (1- nrings)))))
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 614ee60fa03..c3704a05dbb 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -3718,7 +3718,6 @@ This is part of `cperl-find-pods-heres' (below)."
3718 overshoot 3718 overshoot
3719 warning-message))) 3719 warning-message)))
3720 3720
3721;; Debugging this may require (setq max-specpdl-size 2000)...
3722(defun cperl-find-pods-heres (&optional min max non-inter end ignore-max end-of-here-doc) 3721(defun cperl-find-pods-heres (&optional min max non-inter end ignore-max end-of-here-doc)
3723 "Scan the buffer for hard-to-parse Perl constructions. 3722 "Scan the buffer for hard-to-parse Perl constructions.
3724If `cperl-pod-here-fontify' is non-nil after evaluation, 3723If `cperl-pod-here-fontify' is non-nil after evaluation,
diff --git a/lisp/subr.el b/lisp/subr.el
index d7cdc28abba..59f9308f31e 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1859,6 +1859,14 @@ be a list of the form returned by `event-start' and `event-end'."
1859;; in warnings when using `values' in let-bindings. 1859;; in warnings when using `values' in let-bindings.
1860;;(make-obsolete-variable 'values "no longer used" "28.1") 1860;;(make-obsolete-variable 'values "no longer used" "28.1")
1861 1861
1862(defvar max-specpdl-size 2500
1863 "Former limit on specbindings, now without effect.
1864This variable used to limit the size of the specpdl stack which,
1865among other things, holds dynamic variable bindings and `unwind-protect'
1866activations. To prevent runaway recursion, use `max-lisp-eval-depth'
1867instead; it will indirectly limit the specpdl stack size as well.")
1868(make-obsolete-variable 'max-specpdl-size nil "29.1")
1869
1862 1870
1863;;;; Alternate names for functions - these are not being phased out. 1871;;;; Alternate names for functions - these are not being phased out.
1864 1872