]> git.eshelyaron.com Git - emacs.git/commitdiff
Rewrite string-greaterp and string> using string-lessp
authorMattias Engdegård <mattiase@acm.org>
Wed, 16 Mar 2022 15:24:24 +0000 (16:24 +0100)
committerMattias Engdegård <mattiase@acm.org>
Mon, 4 Apr 2022 07:49:31 +0000 (09:49 +0200)
Since string-lessp has its own byte-op, using it is much faster than
calling string-greaterp even with the need to bind a temporary
variable.

* lisp/emacs-lisp/byte-opt.el (byte-optimize-string-greaterp): New.
(string-greaterp, string>): Set byte-optimizer.

lisp/emacs-lisp/byte-opt.el

index 0a79bf9b797895f89e53ba3b4055373d43b9b42a..39bb6224595c0b6e6ecbc6b106de1a7d7a8503b8 100644 (file)
@@ -1049,6 +1049,14 @@ See Info node `(elisp) Integer Basics'."
         form          ; No improvement.
       (cons 'concat (nreverse newargs)))))
 
+(defun byte-optimize-string-greaterp (form)
+  ;; Rewrite in terms of `string-lessp' which has its own bytecode.
+  (pcase (cdr form)
+    (`(,a ,b) (let ((arg1 (make-symbol "arg1")))
+                `(let ((,arg1 ,a))
+                   (string-lessp ,b ,arg1))))
+    (_ form)))
+
 (put 'identity 'byte-optimizer #'byte-optimize-identity)
 (put 'memq 'byte-optimizer #'byte-optimize-memq)
 (put 'memql  'byte-optimizer #'byte-optimize-member)
@@ -1072,6 +1080,9 @@ See Info node `(elisp) Integer Basics'."
 (put 'string= 'byte-optimizer #'byte-optimize-binary-predicate)
 (put 'string-equal 'byte-optimizer #'byte-optimize-binary-predicate)
 
+(put 'string-greaterp 'byte-optimizer #'byte-optimize-string-greaterp)
+(put 'string> 'byte-optimizer #'byte-optimize-string-greaterp)
+
 (put 'concat 'byte-optimizer #'byte-optimize-concat)
 
 ;; I'm not convinced that this is necessary.  Doesn't the optimizer loop