The below patch works around the issue that Allegro does not record
the source file location for methods defined inside a defgeneric form.
The idea is that if the source location of a method is not found, then
the defgeneric form is almost certainly the right place.
For example:
(defgeneric foo (x)
(:method ((x fixnum)) (/ 1 0)))
Calling (foo 123) and hitting "v" in the traceback would result in
"Unknown source location for (method common-lisp-user::foo)" but with
the patch leads correctly to the defgeneric form.
(For methods defined outside the defgeneric form, the source location
recording works fine.)
*** swank-allegro.lisp 10 Jun 2008 19:55:30 +0200 1.102
--- swank-allegro.lisp 10 Jun 2008 21:19:20 +0200
***************
*** 414,419 ****
--- 414,426 ----
(fspec-definition-locations next)))
(t
(let ((defs (excl::find-source-file fspec)))
+ (when (and (null defs)
+ (listp fspec)
+ (string= (car fspec) '#:method))
+ ;; If methods are defined in a defgeneric form, the source location is
+ ;; recorded for the gf but not for the methods. Therefore fall back to
+ ;; the gf as the likely place of definition.
+ (setq defs (excl::find-source-file (second fspec))))
(if (null defs)
(list
(list (list nil fspec)