diff options
| author | Mattias EngdegÄrd | 2022-09-19 10:55:09 +0200 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2022-09-19 19:30:03 +0200 |
| commit | 60102016e416e5c19fa5945aeb80693dac7ff2e6 (patch) | |
| tree | 69979ff773d7031634e7bc4f4388abc4ae104717 /lisp | |
| parent | a7c65fc6660878e244432a5b25fb3a4ff20e8604 (diff) | |
| download | emacs-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.in | 8 | ||||
| -rw-r--r-- | lisp/calc/calc-stuff.el | 8 | ||||
| -rw-r--r-- | lisp/calc/calc.el | 3 | ||||
| -rw-r--r-- | lisp/cedet/semantic/ede-grammar.el | 7 | ||||
| -rw-r--r-- | lisp/cedet/semantic/grammar.el | 1 | ||||
| -rw-r--r-- | lisp/cus-start.el | 1 | ||||
| -rw-r--r-- | lisp/emacs-lisp/comp.el | 1 | ||||
| -rw-r--r-- | lisp/emacs-lisp/edebug.el | 6 | ||||
| -rw-r--r-- | lisp/emacs-lisp/regexp-opt.el | 1 | ||||
| -rw-r--r-- | lisp/eshell/esh-mode.el | 1 | ||||
| -rw-r--r-- | lisp/loadup.el | 4 | ||||
| -rw-r--r-- | lisp/mh-e/mh-e.el | 4 | ||||
| -rw-r--r-- | lisp/net/shr.el | 62 | ||||
| -rw-r--r-- | lisp/play/hanoi.el | 5 | ||||
| -rw-r--r-- | lisp/progmodes/cperl-mode.el | 1 | ||||
| -rw-r--r-- | lisp/subr.el | 8 |
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. | 73 | compile-first: BYTE_COMPILE_FLAGS = $(BYTE_COMPILE_EXTRA_FLAGS) |
| 74 | compile-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. |
| 347 | ifneq ($(HAVE_NATIVE_COMP),yes) | 345 | ifneq ($(HAVE_NATIVE_COMP),yes) |
| 348 | compile-targets: $(filter-out ./emacs-lisp/comp-cstr.elc,$(filter-out ./emacs-lisp/comp.elc,$(TARGETS))) | 346 | compile-targets: $(filter-out ./emacs-lisp/comp-cstr.elc,$(filter-out ./emacs-lisp/comp.elc,$(TARGETS))) |
| 349 | else | 347 | else |
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. |
| 180 | This raises `max-specpdl-size' and `max-lisp-eval-depth', which can be | 180 | This raises `max-lisp-eval-depth', which can be needed for the compilation |
| 181 | needed for the compilation of the resulting parsers." | 181 | of 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" |
| 183 | max-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 | |||
| 129 | containing very large quoted lists, it may reach this limit and give | 129 | containing very large quoted lists, it may reach this limit and give |
| 130 | the error message \"Too deep - perhaps infinite loop in spec?\". | 130 | the error message \"Too deep - perhaps infinite loop in spec?\". |
| 131 | Make this limit larger to countermand that, but you may also need to | 131 | Make this limit larger to countermand that, but you may also need to |
| 132 | increase `max-lisp-eval-depth' and `max-specpdl-size'." | 132 | increase `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. |
| 3724 | If `cperl-pod-here-fontify' is non-nil after evaluation, | 3723 | If `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. | ||
| 1864 | This variable used to limit the size of the specpdl stack which, | ||
| 1865 | among other things, holds dynamic variable bindings and `unwind-protect' | ||
| 1866 | activations. To prevent runaway recursion, use `max-lisp-eval-depth' | ||
| 1867 | instead; 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 | ||