Umm, did you test this against code like

(defun f (x y)
  (let ((y x)
          (x y))
   ...))

where there ARE both formal and local variables with the same name?

--
Bradford W. Miller
Cognitive/Computer Scientist/Engineer

Raytheon, Inc.
1847 West Main Road
Portsmouth, RI  02871-1087

(401) 842-3578



"Willem Broekema" <metawilm@gmail.com>
Sent by: slime-devel-bounces@common-lisp.net

06/10/2008 04:28 PM

To
slime-devel@common-lisp.net
cc
Subject
[slime-devel] Patch: suppress duplicated frame variables (Allegro)





The Allegro debugger sometimes includes a local variable more than
once as a variable in a frame.
E.g.

(defun f (x y)
  (declare (optimize debug))
  (zut (bar x) y))

Allegro itself lists the frame variables as:

Compiled lexical environment:
0(required): x: 1
1(required): y: 2
2(local): y: 2

This patch suppresses the duplicates as shown by Slime (which does not
show the "required" / "local" labels).

- Willem


--- swank-allegro.lisp                 10 Jun 2008 19:55:30 +0200                 1.102
+++ swank-allegro.lisp                 10 Jun 2008 22:16:09 +0200                
@@ -173,11 +173,16 @@
  (debugger:output-frame stream frame :moderate))

(defimplementation frame-locals (index)
-  (let ((frame (nth-frame index)))
-    (loop for i from 0 below (debugger:frame-number-vars frame)
-                   collect (list :name (debugger:frame-var-name frame i)
-                                                   :id 0
-                                                   :value (debugger:frame-var-value frame i)))))
+  (let* ((frame (nth-frame index))
+         (locals (loop for i from 0 below (debugger:frame-number-vars frame)
+                     collect (cons (debugger:frame-var-name frame i)
+                                   (debugger:frame-var-value frame i)))))
+    ;; Remove e.g. function arguments duplicated as local variables.
+    (setq locals (delete-duplicates locals :test (lambda (x y)
+                                                   (and (eq (car x) (car y))
+                                                        (eq (cdr x)
(cdr y))))))
+    (loop for (name . val) in locals
+          collect (list :name name :id 0 :value val))))

(defimplementation frame-var-value (frame var)
  (let ((frame (nth-frame frame)))
_______________________________________________
slime-devel site list
slime-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/slime-devel