From: kr <kr...@mo...> - 2003-06-13 07:56:12
|
pcl has improved greatly in sbcl-0.8.0 . great ! thanx to all the people who have been fixing this monster. i did however run across another serious bug, which has been around for countless years, and i think i fixed it. it has to do with forward-referenced classes and the class-precedence-list. below is a test case that reproduces the break in sbcl-0.8.0 , and after that is my little patch, that fixes this, at least for my purposes. note that i know next to nothing about pcl, so i have a hard time understanding whether my fix might have some unintended consequences somewhere deep in the guts of pcl. but so far so good. maybe some pcl gurus might want to give their blessings before it ends up on sourceforge... the bug: ------------------------------------------------------------- * (defclass xyw (foo) (bar)) #<STANDARD-CLASS XYW> * (describe *) #<STANDARD-CLASS XYW> is a class, it is an instance of STANDARD-CLASS. Its proper name is XYW. debugger invoked on condition of type UNBOUND-SLOT: The slot SB-PCL:CLASS-PRECEDENCE-LIST is unbound in the object #<STANDARD-CLASS XYW>. Within the debugger, you can type HELP for help. At any command prompt (within the debugger or not) you can type (SB-EXT:QUIT) to terminate the SBCL executable. The condition which caused the debugger to be entered is bound to *DEBUG-CONDITION*. You can suppress this message by clearing *DEBUG-BEGINNER-HELP-P*. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT ] Reduce debugger level (leaving debugger, returning to toplevel). 1: [TOPLEVEL] Restart at toplevel READ/EVAL/PRINT loop. ((SLOT-UNBOUND (T T T)) #<unavailable argument> #<unavailable argument> #<unavailable argument> #<STANDARD-CLASS XYW> SB-PCL:CLASS-PRECEDENCE-LIST) 0] ------------------------------------------------------------- the fix, against sbcl-0.8.0 : ------------------------------------------------------------- --- std-class.lisp.~1~ Mon May 19 05:14:02 2003 +++ std-class.lisp Thu Jun 12 23:45:37 2003 @@ -904,6 +904,11 @@ (update-inits class (compute-default-initargs class)) (update-shared-slot-values class) (update-ctors 'finalize-inheritance :class class)) + ;;kr030518: a newly created class with just a forward-referenced-superclass + ;; should not leave the class-precedence-list unbound. so the following + ;; form was added to fix a long-standing bug. + (when (class-has-a-forward-referenced-superclass-p class) + (update-cpl class (list class))) (unless finalizep (dolist (sub (class-direct-subclasses class)) (update-class sub nil)))) ------------------------------------------------------------- -- regards markus krummenacker |