+;;; We might be passed classoids with invalid layouts; in any pairwise
+;;; class comparison, we must ensure that both are valid before
+;;; proceeding.
+(defun ensure-classoid-valid (classoid layout)
+ (aver (eq classoid (layout-classoid layout)))
+ (when (layout-invalid layout)
+ (if (typep classoid 'standard-classoid)
+ (let ((class (classoid-pcl-class classoid)))
+ (cond
+ ((sb!pcl:class-finalized-p class)
+ (sb!pcl::force-cache-flushes class))
+ ((sb!pcl::class-has-a-forward-referenced-superclass-p class)
+ (error "Invalid, unfinalizeable class ~S (classoid ~S)."
+ class classoid))
+ (t (sb!pcl:finalize-inheritance class))))
+ (error "Don't know how to ensure validity of ~S (not ~
+ a STANDARD-CLASSOID)." classoid))))
+
+(defun ensure-both-classoids-valid (class1 class2)
+ (do ((layout1 (classoid-layout class1) (classoid-layout class1))
+ (layout2 (classoid-layout class2) (classoid-layout class2))
+ (i 0 (+ i 1)))
+ ((and (not (layout-invalid layout1)) (not (layout-invalid layout2))))
+ (aver (< i 2))
+ (ensure-classoid-valid class1 layout1)
+ (ensure-classoid-valid class2 layout2)))
+
+(defun update-object-layout-or-invalid (object layout)
+ (if (typep (classoid-of object) 'standard-classoid)
+ (sb!pcl::check-wrapper-validity object)
+ (%layout-invalid-error object layout)))
+