defclass: don't create class at compile time
This lead to problems in code that defined validate-superclass methods for custom metaclasses. Such methods are not installed at compile time, giving errors when we called validate-superclass from ensure-class during compilation.
This commit is contained in:
parent
6d33095ddd
commit
f020031047
1 changed files with 15 additions and 6 deletions
|
|
@ -45,12 +45,21 @@
|
|||
(si::simple-program-error "Illegal defclass form: superclasses and slots should be lists"))
|
||||
(unless (and (symbolp name) (every #'symbolp superclasses))
|
||||
(si::simple-program-error "Illegal defclass form: superclasses and class name are not valid"))
|
||||
`(eval-when (compile load eval)
|
||||
,(ext:register-with-pde
|
||||
form
|
||||
`(load-defclass ',name ',superclasses
|
||||
,(compress-slot-forms slots)
|
||||
,(process-class-options options))))))
|
||||
;; According to the X3J13 cleanup issue
|
||||
;; CLOS-MACRO-COMPILATION:MINIMAL, at compile time we only need
|
||||
;; to ensure that
|
||||
;; * The class name may appear in subsequent type declarations.
|
||||
;; * The class name can be used as a specializer in subsequent
|
||||
;; DEFMETHOD forms.
|
||||
;; Doing more at compile time leads to problems with the mop as
|
||||
;; for example validate-superclass methods might not be installed
|
||||
;; at compile time.
|
||||
(si:create-type-name name)
|
||||
(ext:register-with-pde
|
||||
form
|
||||
`(load-defclass ',name ',superclasses
|
||||
,(compress-slot-forms slots)
|
||||
,(process-class-options options)))))
|
||||
|
||||
(defun compress-slot-forms (slot-definitions)
|
||||
(declare (si::c-local))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue