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.
This commit is contained in:
parent
5f992d1990
commit
bcd0115e4d
2 changed files with 15 additions and 6 deletions
|
@ -810,7 +810,7 @@ by more than one line to cross a string literal."
|
||||||
(setq last-sexp (nth 2 ppss)))
|
(setq last-sexp (nth 2 ppss)))
|
||||||
(setq depth (car ppss))
|
(setq depth (car ppss))
|
||||||
;; Skip over newlines within strings.
|
;; Skip over newlines within strings.
|
||||||
(nth 3 ppss))
|
(and (not (eobp)) (nth 3 ppss)))
|
||||||
(let ((string-start (nth 8 ppss)))
|
(let ((string-start (nth 8 ppss)))
|
||||||
(setq ppss (parse-partial-sexp (point) (point-max)
|
(setq ppss (parse-partial-sexp (point) (point-max)
|
||||||
nil nil ppss 'syntax-table))
|
nil nil ppss 'syntax-table))
|
||||||
|
@ -826,17 +826,22 @@ by more than one line to cross a string literal."
|
||||||
indent-stack)))))
|
indent-stack)))))
|
||||||
(prog1
|
(prog1
|
||||||
(let (indent)
|
(let (indent)
|
||||||
(cond ((= (forward-line 1) 1) nil)
|
(cond ((= (forward-line 1) 1)
|
||||||
;; Negative depth, probably some kind of syntax error.
|
;; Can't move to the next line, apparently end of buffer.
|
||||||
|
nil)
|
||||||
((null indent-stack)
|
((null indent-stack)
|
||||||
;; Reset state.
|
;; Negative depth, probably some kind of syntax
|
||||||
|
;; error. Reset the state.
|
||||||
(setq ppss (parse-partial-sexp (point) (point))))
|
(setq ppss (parse-partial-sexp (point) (point))))
|
||||||
((car indent-stack))
|
((car indent-stack))
|
||||||
((integerp (setq indent (calculate-lisp-indent ppss)))
|
((integerp (setq indent (calculate-lisp-indent ppss)))
|
||||||
(setf (car indent-stack) indent))
|
(setf (car indent-stack) indent))
|
||||||
((consp indent) ; (COLUMN CONTAINING-SEXP-START)
|
((consp indent) ; (COLUMN CONTAINING-SEXP-START)
|
||||||
(car indent))
|
(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"))))
|
(t (error "This shouldn't happen"))))
|
||||||
(setf (lisp-indent-state-stack state) indent-stack)
|
(setf (lisp-indent-state-stack state) indent-stack)
|
||||||
(setf (lisp-indent-state-ppss-point state) ppss-point)
|
(setf (lisp-indent-state-ppss-point state) ppss-point)
|
||||||
|
|
|
@ -284,7 +284,11 @@ Expected initialization file: `%s'\"
|
||||||
(lisp-indent-line)
|
(lisp-indent-line)
|
||||||
(should (equal (buffer-string) "prompt> foo"))))
|
(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)
|
(provide 'lisp-mode-tests)
|
||||||
;;; lisp-mode-tests.el ends here
|
;;; lisp-mode-tests.el ends here
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue