[slime-devel] Patch: suppress duplicated frame variables (Allegro)

Willem Broekema metawilm at gmail.com
Tue Jun 10 20:26:49 UTC 2008


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)))



More information about the slime-devel mailing list