1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-26 07:33:47 +00:00

Don't bind search-spaces-regexp around possible autoload (Bug#35802)

* lisp/isearch.el (isearch-search-fun-default): Move possible autoload
trigger outside let-binding of search-spaces-regexp.
* lisp/char-fold.el (char-fold-make-table): Remove no longer needed
workaround.

* lisp/info.el (Info-search-whitespace-regexp):
* lisp/isearch.el (search-whitespace-regexp):
* src/search.c (syms_of_search) <search-spaces-regexp>: Add warning
about adding capturing groups to the value.

* test/lisp/char-fold-tests.el: Remove, binding search-spaces-regexp
to a different should be considered a bug.
This commit is contained in:
Noam Postavsky 2019-06-21 07:09:44 -04:00
parent b59ffd2290
commit 648fdbbcec
5 changed files with 32 additions and 29 deletions

View File

@ -28,7 +28,6 @@
(defun char-fold-make-table ()
(let* ((equiv (make-char-table 'char-fold-table))
(equiv-multi (make-char-table 'char-fold-table))
(search-spaces-regexp nil) ; workaround for bug#35802
(table (unicode-property-table-internal 'decomposition)))
(set-char-table-extra-slot equiv 0 equiv-multi)

View File

@ -349,7 +349,9 @@ This only has an effect if `Info-hide-note-references' is non-nil."
This applies to Info search for regular expressions.
You might want to use something like \"[ \\t\\r\\n]+\" instead.
In the Customization buffer, that is `[' followed by a space,
a tab, a carriage return (control-M), a newline, and `]+'."
a tab, a carriage return (control-M), a newline, and `]+'. Don't
add any capturing groups into this value; that can change the
numbering of existing capture groups in unexpected ways."
:type 'regexp
:group 'info)

View File

@ -129,8 +129,10 @@ regexp incremental search. If the value is nil, or
then each space you type matches literally, against one space.
You might want to use something like \"[ \\t\\r\\n]+\" instead.
In the Customization buffer, that is `[' followed by a space,
a tab, a carriage return (control-M), a newline, and `]+'."
In the Customization buffer, that is `[' followed by a space, a
tab, a carriage return (control-M), a newline, and `]+'. Don't
add any capturing groups into this value; that can change the
numbering of existing capture groups in unexpected ways."
:type '(choice (const :tag "Match Spaces Literally" nil)
regexp)
:version "24.3")
@ -3263,25 +3265,31 @@ Can be changed via `isearch-search-fun-function' for special needs."
(defun isearch-search-fun-default ()
"Return default functions to use for the search."
(lambda (string &optional bound noerror count)
;; Use lax versions to not fail at the end of the word while
;; the user adds and removes characters in the search string
;; (or when using nonincremental word isearch)
(let ((search-spaces-regexp (when (cond
(isearch-regexp isearch-regexp-lax-whitespace)
(t isearch-lax-whitespace))
(let (;; Evaluate this before binding `search-spaces-regexp' which
;; can break all sorts of regexp searches. In particular,
;; calling `isearch-regexp-function' can trigger autoloading
;; (Bug#35802).
(regexp
(cond (isearch-regexp-function
(let ((lax (and (not bound)
(isearch--lax-regexp-function-p))))
(when lax
(setq isearch-adjusted t))
(if (functionp isearch-regexp-function)
(funcall isearch-regexp-function string lax)
(word-search-regexp string lax))))
(isearch-regexp string)
(t (regexp-quote string))))
;; Use lax versions to not fail at the end of the word while
;; the user adds and removes characters in the search string
;; (or when using nonincremental word isearch)
(search-spaces-regexp (when (if isearch-regexp
isearch-regexp-lax-whitespace
isearch-lax-whitespace)
search-whitespace-regexp)))
(funcall
(if isearch-forward #'re-search-forward #'re-search-backward)
(cond (isearch-regexp-function
(let ((lax (and (not bound) (isearch--lax-regexp-function-p))))
(when lax
(setq isearch-adjusted t))
(if (functionp isearch-regexp-function)
(funcall isearch-regexp-function string lax)
(word-search-regexp string lax))))
(isearch-regexp string)
(t (regexp-quote string)))
bound noerror count))))
regexp bound noerror count))))
(defun isearch-search-string (string bound noerror)
"Search for the first occurrence of STRING or its translation.

View File

@ -3390,7 +3390,9 @@ syms_of_search (void)
Some commands use this for user-specified regexps.
Spaces that occur inside character classes or repetition operators
or other such regexp constructs are not replaced with this.
A value of nil (which is the normal value) means treat spaces literally. */);
A value of nil (which is the normal value) means treat spaces
literally. Note that a value with capturing groups can change the
numbering of existing capture groups in unexpected ways. */);
Vsearch_spaces_regexp = Qnil;
DEFSYM (Qinhibit_changing_match_data, "inhibit-changing-match-data");

View File

@ -124,13 +124,5 @@
;; Ensure it took less than a second.
(should (< (- (time-to-seconds) time) 1))))))
(ert-deftest char-fold--test-bug-35802 ()
(let* ((char-code-property-alist ; initial value
(cons '(decomposition . "uni-decomposition.el")
char-code-property-alist))
(search-spaces-regexp "\\(\\s-\\|\n\\)+")
(char-fold-table (char-fold-make-table)))
(char-fold--test-match-exactly "" "ä")))
(provide 'char-fold-tests)
;;; char-fold-tests.el ends here