emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/compat 021ffd1 59/99: Handle legacy bytecode argument l


From: ELPA Syncer
Subject: [elpa] externals/compat 021ffd1 59/99: Handle legacy bytecode argument lists
Date: Sun, 17 Oct 2021 05:57:57 -0400 (EDT)

branch: externals/compat
commit 021ffd154d8282b6114f108b433f0672d98ccff3
Author: Philip Kaludercic <philipk@posteo.net>
Commit: Philip Kaludercic <philipk@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))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]