]> git.eshelyaron.com Git - emacs.git/commitdiff
Add some basic checking for function type declarations
authorAndrea Corallo <acorallo@gnu.org>
Wed, 24 Jul 2024 12:08:31 +0000 (14:08 +0200)
committerEshel Yaron <me@eshelyaron.com>
Thu, 25 Jul 2024 08:39:25 +0000 (10:39 +0200)
* lisp/emacs-lisp/byte-run.el (byte-run--anonymize-arg-list): New function.
(byte-run--set-function-type): Add some basic checking for
the function type being declared.

(cherry picked from commit baf9f1210a3e44aa19d9ac90e5a4faca214127a7)

lisp/emacs-lisp/byte-run.el

index 270339880586b21187804290f7d7e9ef17fe3fd9..53c62952f96f53a3ad77488ce11b2758628e6778 100644 (file)
@@ -222,12 +222,27 @@ So far, FUNCTION can only be a symbol, not a lambda expression."
                  (cadr elem)))
               val)))))
 
+(defalias 'byte-run--anonymize-arg-list
+  #'(lambda (arg-list)
+      (mapcar (lambda (x)
+                (if (memq x '(&optional &rest))
+                    x
+                 t))
+              arg-list)))
+
 (defalias 'byte-run--set-function-type
-  #'(lambda (f _args val &optional f2)
+  #'(lambda (f args val &optional f2)
       (when (and f2 (not (eq f2 f)))
         (error
          "`%s' does not match top level function `%s' inside function type \
 declaration" f2 f))
+      (unless (and  (length= val 3)
+                    (eq (car val) 'function)
+                    (listp (car (cdr val))))
+        (error "Type `%s' is not valid a function type" val))
+      (unless (equal (byte-run--anonymize-arg-list args)
+                     (byte-run--anonymize-arg-list (car (cdr val))))
+        (error "Type `%s' incompatible with function arguments `%s'" val args))
       (list 'function-put (list 'quote f)
             ''function-type (list 'quote val))))