;;;; (ice-9 debugging steps) -- stepping through code from the debugger ;;; Copyright (C) 2002, 2004 Free Software Foundation, Inc. ;;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public ;; License as published by the Free Software Foundation; either ;; version 2.1 of the License, or (at your option) any later version. ;; ;; This library is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; Lesser General Public License for more details. ;; ;; You should have received a copy of the GNU Lesser General Public ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (define-module (ice-9 debugging steps) #:use-module (ice-9 debugging traps) #:use-module (ice-9 and-let-star) #:use-module (ice-9 debugger) #:use-module (ice-9 optargs) #:export (at-exit at-entry at-apply at-step at-next)) ;;; at-exit DEPTH BEHAVIOUR ;;; ;;; Install a behaviour to run when we exit the current frame. (define (at-exit depth behaviour) (install-trap (make #:depth depth #:single-shot #t #:behaviour behaviour))) ;;; at-entry BEHAVIOUR [COUNT] ;;; ;;; Install a behaviour to run when we get to the COUNT'th next frame ;;; entry. COUNT defaults to 1. (define* (at-entry behaviour #:optional (count 1)) (install-trap (make #:skip-count (- count 1) #:single-shot #t #:behaviour behaviour))) ;;; at-apply BEHAVIOUR [COUNT] ;;; ;;; Install a behaviour to run when we get to the COUNT'th next ;;; application. COUNT defaults to 1. (define* (at-apply behaviour #:optional (count 1)) (install-trap (make #:skip-count (- count 1) #:single-shot #t #:behaviour behaviour))) ;;; at-step BEHAVIOUR [COUNT [FILENAME [DEPTH]] ;;; ;;; Install BEHAVIOUR to run on the COUNT'th next application, frame ;;; entry or frame exit. COUNT defaults to 1. If FILENAME is ;;; specified and not #f, only frames that begin in the named file are ;;; counted. (define* (at-step behaviour #:optional (count 1) filename (depth 1000)) (install-trap (make #:file-name filename #:exit-depth depth #:skip-count (- count 1) #:single-shot #t #:behaviour behaviour))) ;; (or count (set! count 1)) ;; (letrec ((proc (lambda (trap-context) ;; ;; Behaviour whenever we enter or exit a frame. ;; (set! count (- count 1)) ;; (if (= count 0) ;; (begin ;; (remove-enter-frame-hook! step) ;; (remove-apply-frame-hook! step) ;; (behaviour trap-context))))) ;; (step (lambda (trap-context) ;; ;; Behaviour on frame entry: both execute the above ;; ;; and install it as an exit hook. ;; (if (or (not filename) ;; (equal? (frame-file-name (tc:frame trap-context)) ;; filename)) ;; (begin ;; (proc trap-context) ;; (at-exit (tc:depth trap-context) proc)))))) ;; (at-exit depth proc) ;; (add-enter-frame-hook! step) ;; (add-apply-frame-hook! step))) ;;; at-next BEHAVIOUR [COUNT] ;;; ;;; Install a behaviour to run when we get to the COUNT'th next frame ;;; entry in the same source file as the current location. COUNT ;;; defaults to 1. If the current location has no filename, fall back ;;; silently to `at-entry' behaviour. ;;; (ice-9 debugging steps) ends here.