Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#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 8 years ago by Mark Evenson

Milestone: 1.1.0
Priority: majorblocker

comment:2 Changed 8 years ago by rschlatte

Resolution: fixed
Status: newclosed

(In [14293]) Don't clobber class objects when re-initializing.

  • Also remove double-initialization via shared-initialize + one of intialize-instance / reinitialize-instance.
  • Reported by Pascal Costanza

comment:3 Changed 8 years ago by Mark Evenson

(In [14294]) Backport r14293: Don't clobber class objects when re-initializing.

  • Also remove double-initialization via shared-initialize + one of

intialize-instance / reinitialize-instance.

  • Reported by Pascal Costanza
Note: See TracTickets for help on using tickets.