Commit 260b6c2c authored by Mattias Engdegård's avatar Mattias Engdegård

Merge consecutive constant `concat' args (bug#14769)

Suggested by Shigeru Fukaya <>

* lisp/emacs-lisp/byte-opt.el (byte-optimize-concat): New.
(concat): Add byte-optimizer.
parent 1bc1672f
......@@ -850,6 +850,33 @@
(byte-optimize-predicate form)))
(defun byte-optimize-concat (form)
"Merge adjacent constant arguments to `concat'."
(let ((args (cdr form))
(newargs nil))
(while args
(let ((strings nil)
(while (and args (macroexp-const-p (car args))
(setq val (eval (car args)))
(and (or (stringp val)
(and (or (listp val) (vectorp val))
(not (memq nil
(mapcar #'characterp val))))))))
(push val strings)
(setq args (cdr args)))
(when strings
(let ((s (apply #'concat (nreverse strings))))
(when (not (zerop (length s)))
(push s newargs)))))
(when args
(push (car args) newargs)
(setq args (cdr args))))
(if (= (length newargs) (length (cdr form)))
form ; No improvement.
(cons 'concat (nreverse newargs)))))
(put 'identity 'byte-optimizer 'byte-optimize-identity)
(put 'memq 'byte-optimizer 'byte-optimize-memq)
......@@ -892,6 +919,8 @@
(put 'car-safe 'byte-optimizer 'byte-optimize-predicate)
(put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate)
(put 'concat 'byte-optimizer 'byte-optimize-concat)
;; I'm not convinced that this is necessary. Doesn't the optimizer loop
;; take care of this? - Jamie
;; I think this may some times be necessary to reduce ie (quote 5) to 5,
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment