#277 closed defect (fixed)
reinitialize-instance on class metaobjects incorrect
| Reported by: | rschlatte | Owned by: | rschlatte | 
|---|---|---|---|
| Priority: | blocker | Milestone: | 1.1.0 | 
| Component: | (A)MOP | Version: | |
| Keywords: | Cc: | ||
| Parent Tickets: | 
Description
Reported by Pascal Costanza:
Consider the following test case:
CL-USER(1): (use-package :mop)
T
CL-USER(2): (defclass a () ())
#<STANDARD-CLASS A {794563AA}>
CL-USER(3): (defclass b (a) ())
#<STANDARD-CLASS B {62F6FB59}>
CL-USER(4): (finalize-inheritance (find-class 'a))
NIL
CL-USER(5): (finalize-inheritance (find-class 'b))
NIL
CL-USER(6): (class-precedence-list (find-class 'b))
(#<STANDARD-CLASS B {62F6FB59}> #<STANDARD-CLASS A {794563AA}> #<STANDARD-CLASS STANDARD-OBJECT {23309E87}> #<BUILT-IN-CLASS T {100C62C8}>)
CL-USER(7): (reinitialize-instance (find-class 'b))
#<STANDARD-CLASS B {62F6FB59}>
CL-USER(8): (class-precedence-list (find-class 'b))
(#<STANDARD-CLASS B {62F6FB59}> #<STANDARD-CLASS STANDARD-OBJECT {23309E87}> #<BUILT-IN-CLASS T {100C62C8}>)
The invocation of reinitialize-instance obviously reinitialized the direct-superclasses slot, and thus removed the superclass a.
However, according to the HyperSpec?, the general protocol for reinitialize-instance is always that slots for which no initargs are provided through reinitialize-instance should be left untouched. This also restated implicitly in the CLOS MOP specification, for example in the section "Initialization of Class Metaobjects:" The defaulted superclass list is specified to be only assigned during initialization, but not during reinitialization.
Change History (3)
comment:1 Changed 13 years ago by
| Milestone: | → 1.1.0 | 
|---|---|
| Priority: | major → blocker | 
comment:2 Changed 13 years ago by
| Resolution: | → fixed | 
|---|---|
| Status: | new → closed | 
comment:3 Changed 13 years ago by
Note: See
        TracTickets for help on using
        tickets.
    
(In [14293]) Don't clobber class objects when re-initializing.