[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-26 bcd0115: Fix lisp indent infloop on unfinished st
From: |
Noam Postavsky |
Subject: |
[Emacs-diffs] emacs-26 bcd0115: Fix lisp indent infloop on unfinished strings (Bug#37045) |
Date: |
Sat, 17 Aug 2019 09:51:27 -0400 (EDT) |
branch: emacs-26
commit bcd0115e4db49791a77566b80fabc4384d9ebf57
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
Fix lisp indent infloop on unfinished strings (Bug#37045)
* lisp/emacs-lisp/lisp-mode.el (lisp-indent-calc-next): Stop trying to
skip over strings if we've hit the end of buffer.
* test/lisp/emacs-lisp/lisp-mode-tests.el
(lisp-indent-unfinished-string): New test.
---
lisp/emacs-lisp/lisp-mode.el | 15 ++++++++++-----
test/lisp/emacs-lisp/lisp-mode-tests.el | 6 +++++-
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 74bf0c8..bde0a4e 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -810,7 +810,7 @@ by more than one line to cross a string literal."
(setq last-sexp (nth 2 ppss)))
(setq depth (car ppss))
;; Skip over newlines within strings.
- (nth 3 ppss))
+ (and (not (eobp)) (nth 3 ppss)))
(let ((string-start (nth 8 ppss)))
(setq ppss (parse-partial-sexp (point) (point-max)
nil nil ppss 'syntax-table))
@@ -826,17 +826,22 @@ by more than one line to cross a string literal."
indent-stack)))))
(prog1
(let (indent)
- (cond ((= (forward-line 1) 1) nil)
- ;; Negative depth, probably some kind of syntax error.
+ (cond ((= (forward-line 1) 1)
+ ;; Can't move to the next line, apparently end of buffer.
+ nil)
((null indent-stack)
- ;; Reset state.
+ ;; Negative depth, probably some kind of syntax
+ ;; error. Reset the state.
(setq ppss (parse-partial-sexp (point) (point))))
((car indent-stack))
((integerp (setq indent (calculate-lisp-indent ppss)))
(setf (car indent-stack) indent))
((consp indent) ; (COLUMN CONTAINING-SEXP-START)
(car indent))
- ;; This only happens if we're in a string.
+ ;; This only happens if we're in a string, but the
+ ;; loop should always skip over strings (unless we hit
+ ;; end of buffer, which is taken care of by the first
+ ;; clause).
(t (error "This shouldn't happen"))))
(setf (lisp-indent-state-stack state) indent-stack)
(setf (lisp-indent-state-ppss-point state) ppss-point)
diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el
b/test/lisp/emacs-lisp/lisp-mode-tests.el
index 6363244..e4ba929 100644
--- a/test/lisp/emacs-lisp/lisp-mode-tests.el
+++ b/test/lisp/emacs-lisp/lisp-mode-tests.el
@@ -284,7 +284,11 @@ Expected initialization file: `%s'\"
(lisp-indent-line)
(should (equal (buffer-string) "prompt> foo"))))
-
+(ert-deftest lisp-indent-unfinished-string ()
+ "Don't infloop on unfinished string (Bug#37045)."
+ (with-temp-buffer
+ (insert "\"\n")
+ (lisp-indent-region (point-min) (point-max))))
(provide 'lisp-mode-tests)
;;; lisp-mode-tests.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs-26 bcd0115: Fix lisp indent infloop on unfinished strings (Bug#37045),
Noam Postavsky <=