]> git.eshelyaron.com Git - emacs.git/commitdiff
cl-generic: Signal an error when a type specializer won't work
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 12 Mar 2024 16:00:17 +0000 (12:00 -0400)
committerEshel Yaron <me@eshelyaron.com>
Fri, 15 Mar 2024 08:58:35 +0000 (09:58 +0100)
* lisp/emacs-lisp/cl-generic.el (cl--generic--unreachable-types): New var.
(cl-generic-generalizers :extra "typeof"): Use it to signal an
error for those types we can't handle.

(cherry picked from commit 3e96dd4f8851a45c66ebc9b8666ae449cc4c2725)

lisp/emacs-lisp/cl-generic.el

index 51d1e2dcae2d90c6f4f3f6cc8637cb63e48f5934..949bf70cd7a45aac41e6621ac226c16499086da1 100644 (file)
@@ -1332,6 +1332,12 @@ These match if the argument is `eql' to VAL."
 
 ;;; Dispatch on "normal types".
 
+(defconst cl--generic--unreachable-types
+  ;; FIXME: Try to make that list empty?
+  '(fixnum bignum boolean keyword
+    special-form subr-primitive subr-native-elisp)
+  "Built-in classes on which we cannot dispatch for technical reasons.")
+
 (defun cl--generic-type-specializers (tag &rest _)
   (and (symbolp tag)
        (let ((class (cl--find-class tag)))
@@ -1352,6 +1358,8 @@ This currently works for built-in types and types built on top of records."
    (and (symbolp type)
         (not (eq type t)) ;; Handled by the `t-generalizer'.
         (let ((class (cl--find-class type)))
+          (when (memq type cl--generic--unreachable-types)
+            (error "Dispatch on %S is currently not supported" type))
           (memq (type-of class)
                 '(built-in-class cl-structure-class eieio--class)))
         (list cl--generic-typeof-generalizer))