X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefstruct.lisp;h=5ba663c4640d79b40e887d920412d0308ae0c91d;hb=85483d976cc2d779493985f77f39efefb2ea622b;hp=10a1a4073599cb119eaef363f99211d474211f43;hpb=f12f2c5a8ae794dc414dd6a42e0b25740d576aa1;p=sbcl.git diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 10a1a40..5ba663c 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -931,14 +931,17 @@ ;;; !DEFSTRUCT-WITH-ALTERNATE-METACLASS weirdosities (defun %compiler-set-up-layout (dd &optional - ;; Several special cases (STRUCTURE-OBJECT - ;; itself, and structures with alternate - ;; metaclasses) call this function directly, - ;; and they're all at the base of the - ;; instance class structure, so this is - ;; a handy default. - (inherits (vector (find-layout t) - (find-layout 'instance)))) + ;; Several special cases + ;; (STRUCTURE-OBJECT itself, and + ;; structures with alternate + ;; metaclasses) call this function + ;; directly, and they're all at the + ;; base of the instance class + ;; structure, so this is a handy + ;; default. (But note + ;; FUNCALLABLE-STRUCTUREs need + ;; assistance here) + (inherits (vector (find-layout t)))) (multiple-value-bind (classoid layout old-layout) (multiple-value-bind (clayout clayout-p) @@ -1522,6 +1525,15 @@ reversed-result) (incf index)) (nreverse reversed-result)))) + (case dd-type + ;; We don't support inheritance of alternate metaclass stuff, + ;; and it's not a general-purpose facility, so sanity check our + ;; own code. + (structure + (aver (eq superclass-name 't))) + (funcallable-structure + (aver (eq superclass-name 'function))) + (t (bug "Unknown DD-TYPE in ALTERNATE-METACLASS: ~S" dd-type))) (setf (dd-alternate-metaclass dd) (list superclass-name metaclass-name metaclass-constructor) @@ -1580,7 +1592,7 @@ `(progn (eval-when (:compile-toplevel :load-toplevel :execute) - (%compiler-set-up-layout ',dd)) + (%compiler-set-up-layout ',dd ',(inherits-for-structure dd))) ;; slot readers and writers (declaim (inline ,@(mapcar #'dsd-accessor-name dd-slots))) @@ -1644,7 +1656,7 @@ ;; Note: This has an ALTERNATE-METACLASS only because of blind ;; clueless imitation of the CMU CL code -- dunno if or why it's ;; needed. -- WHN - (dd-alternate-metaclass dd) '(instance) + (dd-alternate-metaclass dd) '(t) (dd-slots dd) nil (dd-length dd) 1 (dd-type dd) 'structure)