branch: externals/compat commit 021ffd154d8282b6114f108b433f0672d98ccff3 Author: Philip Kaludercic <phil...@posteo.net> Commit: Philip Kaludercic <phil...@posteo.net>
Handle legacy bytecode argument lists This appears to be necessary for some versions of Emacs 24.x. --- compat.el | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/compat.el b/compat.el index ed2c118..cc5adee 100644 --- a/compat.el +++ b/compat.el @@ -105,13 +105,35 @@ advice." (setq min-args (1+ min-args))) (setq max-args (1+ max-args))))) (cons min-args max-args)))) - ((byte-code-function-p func) + ((and (byte-code-function-p func) (numberp (aref func 0))) ;; See get_byte_code_arity from bytecode.c (let ((at (aref func 0))) (cons (logand at 127) (if (= (logand at 128) 0) (ash at -8) 'many)))) + ((and (byte-code-function-p func) (numberp (aref func 0))) + ;; See get_byte_code_arity from bytecode.c + (let ((at (aref func 0))) + (cons (logand at 127) + (if (= (logand at 128) 0) + (ash at -8) + 'many)))) + ((and (byte-code-function-p func) (listp (aref func 0))) + ;; Based on `byte-compile-make-args-desc', this is required for + ;; old versions of Emacs that don't use a integer for the argument + ;; list description, per e2abe5a13dffb08d6371b6a611bc39c3a9ac2bc6. + (let ((arglist (aref func 0)) (mandatory 0) nonrest) + (while (and arglist (not (memq (car arglist) '(&optional &rest)))) + (setq mandatory (1+ mandatory)) + (setq arglist (cdr arglist))) + (setq nonrest mandatory) + (when (eq (car arglist) '&optional) + (setq arglist (cdr arglist)) + (while (and arglist (not (eq (car arglist) '&rest))) + (setq nonrest (1+ nonrest)) + (setq arglist (cdr arglist)))) + (cons mandatory (if arglist 'many nonrest)))) ((autoloadp func) (autoload-do-load func) (compat-func-arity func))