Add some basic checking for function type declarations

* 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.
This commit is contained in:
Andrea Corallo 2024-07-24 14:08:31 +02:00
parent df25bd12fc
commit baf9f1210a

View 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))))