diff options
author | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-12-04 15:12:10 +0000 |
---|---|---|
committer | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-12-04 15:12:34 +0000 |
commit | 30f3432e9519f61882faa303e7851e761d2d18ea (patch) | |
tree | fbb216d979d5c7af77f4c4018ab4c4bf06b2a85e /test/automated | |
parent | 3a9df7589ae189fc34a5fab98e82d85d2d40433f (diff) | |
download | emacs-30f3432e9519f61882faa303e7851e761d2d18ea.tar.gz emacs-30f3432e9519f61882faa303e7851e761d2d18ea.tar.bz2 emacs-30f3432e9519f61882faa303e7851e761d2d18ea.zip |
* lisp/character-fold.el: Remove special case-folding support
(character-fold-to-regexp): Remove special code for
case-folding. Char-fold search still respects the
`case-fold-search' variable (i.e., f matches F). This only
removes the code that was added to ensure that f also matched
all chars that F matched. For instance, after this commit, f
no longer matches 𝔽.
This was necessary because the logic created a regexp with
2^(length of the string) redundant paths. So, when a very
long string "almost" matched, Emacs took a very long time to
figure out that it didn't. This became particularly relevant
because isearch's lazy-highlight does a search bounded by (1-
match-end) (which, in most circumstances, is a search that
almost matches). A recipe for this can be found in bug#22090.
Diffstat (limited to 'test/automated')
-rw-r--r-- | test/automated/character-fold-tests.el | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/test/automated/character-fold-tests.el b/test/automated/character-fold-tests.el index 40735e5df7f..4e8761e6f7b 100644 --- a/test/automated/character-fold-tests.el +++ b/test/automated/character-fold-tests.el @@ -98,6 +98,27 @@ ;; (character-fold--test-match-exactly "a12" "xxyy") )) +(ert-deftest character-fold--speed-test () + (dolist (string (append '("tty-set-up-initial-frame-face" + "tty-set-up-initial-frame-face-frame-faceframe-faceframe-faceframe-face") + (mapcar #'character-fold--random-word '(10 50 100 + 50 100)))) + (message "Testing %s" string) + ;; Make sure we didn't just fallback on the trivial search. + (should-not (string= (regexp-quote string) + (character-fold-to-regexp string))) + (with-temp-buffer + (save-excursion (insert string)) + (let ((time (time-to-seconds (current-time)))) + ;; Our initial implementation of case-folding in char-folding + ;; created a lot of redundant paths in the regexp. Because of + ;; that, if a really long string "almost" matches, the regexp + ;; engine took a long time to realise that it doesn't match. + (should-not (character-fold-search-forward (concat string "c") nil 'noerror)) + ;; Ensure it took less than a second. + (should (< (- (time-to-seconds (current-time)) + time) + 1)))))) (provide 'character-fold-tests) ;;; character-fold-tests.el ends here |