Spaces:
Sleeping
Sleeping
;;;; (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 <exit-trap> | |
#: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 <entry-trap> | |
#: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 <apply-trap> | |
#: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 <step-trap> | |
#: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. | |