Index: swank-abcl.lisp
===================================================================
RCS file: /project/slime/cvsroot/slime/swank-abcl.lisp,v
retrieving revision 1.65
diff -c -r1.65 swank-abcl.lisp
--- swank-abcl.lisp	21 Jun 2009 07:22:56 -0000	1.65
+++ swank-abcl.lisp	14 Jul 2009 16:35:44 -0000
@@ -16,7 +16,7 @@
 
 (defun sys::break (&optional (format-control "BREAK called") 
                    &rest format-arguments)
-  (let ((*saved-backtrace* (backtrace-as-list-ignoring-swank-calls)))
+  (let ((*saved-backtrace* (sys:backtrace-as-list)))
     (with-simple-restart (continue "Return from BREAK.")
       (invoke-debugger
        (sys::%make-condition 'simple-condition
@@ -256,26 +271,28 @@
 
 (defvar *sldb-topframe*)
 
-(defun backtrace-as-list-ignoring-swank-calls ()
-  (let ((list (ext:backtrace-as-list)))
-    (subseq list (1+ (or (position (intern "SWANK-DEBUGGER-HOOK" 'swank) list :key 'car) -1)))))
-
 (defimplementation call-with-debugging-environment (debugger-loop-fn)
-  (let ((*sldb-topframe* (car (backtrace-as-list-ignoring-swank-calls)) #+nil (excl::int-newest-frame)))
+  (let* ((+magic-token+ (intern "SWANK-DEBUGGER-HOOK" 'swank))
+         (*sldb-topframe* (second (member +magic-token+ (sys:backtrace-as-list)
+                                          :key #'(lambda (frame)
+                                                   (car (sys:frame-to-list frame)))))))
     (funcall debugger-loop-fn)))
 
+(defun backtrace-as-list (start end)
+  "Like SYS:BACKTRACE-AS-LIST but without initial SWANK frames."
+  (let ((backtrace (sys:backtrace-as-list)))
+    (subseq (or (member *sldb-topframe* backtrace) backtrace)
+            start end)))
+
 (defun nth-frame (index)
-  (nth index (backtrace-as-list-ignoring-swank-calls)))
+  (nth index (backtrace-as-list 0 nil)))
 
 (defimplementation compute-backtrace (start end)
   (let ((end (or end most-positive-fixnum)))
-    (loop for f in (subseq (backtrace-as-list-ignoring-swank-calls) start end)
-          collect f)))
+    (backtrace-as-list start end)))
 
 (defimplementation print-frame (frame stream)
-  (write-string (string-trim '(#\space #\newline)
-                             (prin1-to-string frame))
-                stream))
+  (write-string (sys:frame-to-string frame) stream))
 
 (defimplementation frame-locals (index)
   `(,(list :name "??" :id 0 :value "??")))
