2009/7/13 Mark Evenson evenson@panix.com:
I'm not totally convinced as to what would happen to the eql-specialization cache in the face of subsequent redefinitions, but can't really come up with a good counter-example.
More precisely it's not only eql-specialized method cache, but cache for all the (effective) methods.
When generic function is called, correct code must be executed, according to the passed arguments, taking into account all the methods defined, class precedence lists for argument classes, method combination of the generic function.
Calculation of the correct code is expensive, therefore a cache is used. When we call (FN X Y) first time, effective method is calculated based on X and Y, and stored in cache of the generic function FN.
This mechanism was already in place, but it wasn't used for eql-specialized methods. Instead full clos dispatch was performed every time for every generic function having at least one eql-specialized method. Full CLOS dispatch in ABCL includes generation some lisp code at runtime, and compiling it.
My fix just extends the chaching mechanism to handle eql-specialized methods too.
Redefinitions are handled as before: function FINALIZE-GENERIC-FUNCTION just clears the cache. This function is called every time when new method is added to a generic function (but it seems not to be called when class hierarchy changes, probably that's what was referred by the old ABCL home: "ABCL's CLOS is slow and does not handle on-the-fly redefinition of classes correctly").
Christophe Rhodes in sbcl-help once pointed me to "Efficient Method Dispatch in PCL" by Kiczales and Rodriguez. Maybe you'll find it useful (I personally still haven't worked through this 15 pages doc; but the quick glance i made at that time gave me understanding that CLOS dispatch is optimized by caching and therefore helped to understand the ABCL code now).
Best regards, - Anton