Index: /trunk/source/level-1/l1-lisp-threads.lisp
===================================================================
--- /trunk/source/level-1/l1-lisp-threads.lisp	(revision 14366)
+++ /trunk/source/level-1/l1-lisp-threads.lisp	(revision 14367)
@@ -852,4 +852,16 @@
     (if (= i n)
       (return p))))
+
+(defun nth-function-frame (n start-frame context)
+  (declare (fixnum n))
+  (do* ((p start-frame (parent-frame p context))
+	(i -1)
+	(q (last-frame-ptr context)))
+       ((or (null p) (eq p q) (%stack< q p context)))
+    (declare (fixnum i))
+    (when (function-frame-p p context)
+      (incf i)
+      (if (= i n)
+        (return p)))))
 
 ;;; True if the object is in one of the heap areas
Index: /trunk/source/level-1/l1-readloop-lds.lisp
===================================================================
--- /trunk/source/level-1/l1-readloop-lds.lisp	(revision 14366)
+++ /trunk/source/level-1/l1-readloop-lds.lisp	(revision 14367)
@@ -102,16 +102,14 @@
 (define-toplevel-command :break r () "list restarts" (list-restarts))
 
-(define-toplevel-command :break set (n frame value) "Set <n>th item of frame <frame> to <value>"
-  (let* ((frame-sp (nth-raw-frame frame *break-frame* nil)))
-    (if frame-sp
-        (toplevel-print (list (set-nth-value-in-frame frame-sp n nil value)))
-        (format *debug-io* "No frame with number ~D~%" frame))))
 
 (define-toplevel-command :break nframes ()
   "print the number of stack frames accessible from this break loop"
   (do* ((p *break-frame* (parent-frame p nil))
-        (i 0 (1+ i))
+        (i 0 )
         (last (last-frame-ptr)))
-      ((eql p last) (toplevel-print (list i)))))
+      ((eql p last) (toplevel-print (list i)))
+    (declare (fixnum i))
+    (when (function-frame-p p nil)
+      (incf i))))
 
 (define-toplevel-command :global ? () "help"
@@ -149,10 +147,10 @@
 
 (define-toplevel-command :break return-from-frame (i &rest values) "Return VALUES from the I'th stack frame"
-  (let* ((frame-sp (nth-raw-frame  i *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame  i *break-frame* nil)))
     (if frame-sp
       (apply #'return-from-frame frame-sp values))))
 
 (define-toplevel-command :break apply-in-frame (i function &rest args) "Applies FUNCTION to ARGS in the execution context of the Ith stack frame"
-  (let* ((frame-sp (nth-raw-frame  i *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame  i *break-frame* nil)))
     (if frame-sp
       (apply-in-frame frame-sp function args))))
@@ -167,10 +165,10 @@
 
 (define-toplevel-command :break v (n frame-number) "Return value <n> in frame <frame-number>"
-  (let* ((frame-sp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame frame-number *break-frame* nil)))
     (if frame-sp
       (toplevel-print (list (nth-value-in-frame frame-sp n nil))))))
 
 (define-toplevel-command :break arg (name frame-number) "Return value of argument named <name> in frame <frame-number>"
-  (let* ((frame-sp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame frame-number *break-frame* nil)))
     (when frame-sp
       (multiple-value-bind (lfun pc) (cfp-lfun frame-sp)
@@ -184,5 +182,5 @@
 
 (define-toplevel-command :break set-arg (name frame-number new) "Set value of argument named <name> in frame <frame-number> to value <new>."
-  (let* ((frame-sp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame frame-number *break-frame* nil)))
     (when frame-sp
       (multiple-value-bind (lfun pc) (cfp-lfun frame-sp)
@@ -194,5 +192,5 @@
 (define-toplevel-command :break local (name frame-number) "Return value of local denoted by <name> in frame <frame-number> <name> can either be a symbol - in which case the most recent
 binding of that symbol is used - or an integer index into the frame's set of local bindings."
-  (let* ((frame-sp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame frame-number *break-frame* nil)))
     (when frame-sp
       (multiple-value-bind (lfun pc) (cfp-lfun frame-sp)
@@ -206,5 +204,5 @@
 
 (define-toplevel-command :break set-local (name frame-number new) "Set value of argument denoted <name> (see :LOCAL) in frame <frame-number> to value <new>."
-  (let* ((frame-sp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((frame-sp (nth-function-frame frame-number *break-frame* nil)))
     (when frame-sp
       (multiple-value-bind (lfun pc) (cfp-lfun frame-sp)
@@ -225,5 +223,5 @@
 (define-toplevel-command :break function (frame-number)
   "Returns the function invoked in backtrace frame <frame-number>.  This may be useful for, e.g., disassembly"
-  (let* ((cfp (nth-raw-frame frame-number *break-frame* nil)))
+  (let* ((cfp (nth-function-frame frame-number *break-frame* nil)))
     (when (and cfp (not (catch-csp-p cfp nil)))
       (let* ((function (cfp-lfun cfp)))
