(let ((class1 (type-class-info type1))
(class2 (type-class-info type2)))
(if (eq class1 class2)
- (funcall (funcall simple class1) type1 type2)
+ (funcall (the function (funcall simple class1)) type1 type2)
(let ((complex2 (funcall cslot2 class2)))
+ (declare (type (or function null) complex2))
(if complex2
(funcall complex2 type1 type2)
(let ((complex1 (funcall cslot1 class1)))
+ (declare (type (or function null) complex1))
(if complex1
(if complex-arg1-p
(funcall complex1 type1 type2)
;;; when no next method exists. -- WHN 2002-04-07
;;;
;;; (We miss CLOS! -- CSR and WHN)
-(defun invoke-complex-subtypep-arg1-method (type1 type2)
+(defun invoke-complex-subtypep-arg1-method (type1 type2 &optional subtypep win)
(let* ((type-class (type-class-info type1))
(method-fun (type-class-complex-subtypep-arg1 type-class)))
(if method-fun
(funcall (the function method-fun) type1 type2)
- (values nil nil))))
+ (values subtypep win))))
+
+;;; KLUDGE: This function is dangerous, as its overuse could easily
+;;; cause stack exhaustion through unbounded recursion. We only use
+;;; it in one place; maybe it ought not to be a function at all?
+(defun invoke-complex-=-other-method (type1 type2)
+ (let* ((type-class (type-class-info type1))
+ (method-fun (type-class-complex-= type-class)))
+ (if method-fun
+ (funcall (the function method-fun) type2 type1)
+ (values nil t))))
(!defun-from-collected-cold-init-forms !type-class-cold-init)