]> git.eshelyaron.com Git - emacs.git/commitdiff
Make parse-partial-sexp signal an error if TO is smaller than FROM
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Aug 2021 13:24:15 +0000 (15:24 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Aug 2021 13:24:15 +0000 (15:24 +0200)
* src/syntax.c (Fparse_partial_sexp): Signal an error if TO is
smaller than FROM (bug#49944).

etc/NEWS
src/syntax.c
test/src/syntax-tests.el

index 02185a6fb48f0d9bf1f162307756b9e0cbf570af..c3993b74f6069235a580db9758809061a63529c3 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3108,6 +3108,12 @@ This is to keep the same behavior as Eshell.
 \f
 * Incompatible Lisp Changes in Emacs 28.1
 
+---
+** 'parse-partial-sexp' now signals an error it TO is smaller than FROM.
+Previously this would lead to the function interpreting FROM as TO and
+vice versa, which would be confusing when passing in OLDSTATE, which
+refers to the old state at FROM.
+
 +++
 ** 'overlays-in' now handles zero-length overlays slightly differently.
 Previosly, zero-length overlays at the end of the buffer were included
index 7bba336744a4dc5b206124afea4cb0bab31e2a99..6cbe0f6855fe1147aee66bc8097312bacb2ecc81 100644 (file)
@@ -3547,8 +3547,10 @@ DEFUN ("parse-partial-sexp", Fparse_partial_sexp, Sparse_partial_sexp, 2, 6, 0,
        doc: /* Parse Lisp syntax starting at FROM until TO; return status of parse at TO.
 Parsing stops at TO or when certain criteria are met;
  point is set to where parsing stops.
-If fifth arg OLDSTATE is omitted or nil,
- parsing assumes that FROM is the beginning of a function.
+
+If OLDSTATE is omitted or nil, parsing assumes that FROM is the
+ beginning of a function.  If not, OLDSTATE should be the state at
+ FROM.
 
 Value is a list of elements describing final state of parsing:
  0. depth in parens.
@@ -3594,6 +3596,9 @@ Sixth arg COMMENTSTOP non-nil means stop after the start of a comment.
   else
     target = TYPE_MINIMUM (EMACS_INT); /* We won't reach this depth.  */
 
+  if (XFIXNUM (to) < XFIXNUM (from))
+    error ("End position should be larger than start position.");
+
   validate_region (&from, &to);
   internalize_parse_state (oldstate, &state);
   scan_sexps_forward (&state, XFIXNUM (from), CHAR_TO_BYTE (XFIXNUM (from)),
index e4e3054d37a41a35510a80c7a2342402e1e3b333..bd89283dd14456cfe1a563b3a011466faac5b248 100644 (file)
@@ -500,4 +500,10 @@ the `parse-partial-sexp's are expected to stop.  See
 (syntax-pps-comments /* 56 76 77 58)
 (syntax-pps-comments /* 60 78 79)
 
+(ert-deftest test-from-to-parse-partial-sexp ()
+  (with-temp-buffer
+    (insert "foo")
+    (should (parse-partial-sexp 1 1))
+    (should-error (parse-partial-sexp 2 1))))
+
 ;;; syntax-tests.el ends here