mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
(system vm trap-state): add-trap-at-frame-finish!
* module/system/vm/traps.scm: Fix a comment. * module/system/vm/trap-state.scm (<trap-state>): Add next-ephemeral-idx slot. (wrapper-at-index): Use eqv? instead of = to avoid type errors in user inputs. (next-ephemeral-index!, ephemeral-handler-for-index): New functions, allocate ephemeral trap ids for functions to be called only once. (add-trap-at-frame-finish!): New export, traps when a frame finishes.
This commit is contained in:
parent
6a4a1ef0f4
commit
df067433a5
2 changed files with 34 additions and 3 deletions
|
@ -38,7 +38,8 @@
|
||||||
|
|
||||||
add-trap-at-procedure-call!
|
add-trap-at-procedure-call!
|
||||||
add-trace-at-procedure-call!
|
add-trace-at-procedure-call!
|
||||||
add-trap-at-source-location!))
|
add-trap-at-source-location!
|
||||||
|
add-trap-at-frame-finish!))
|
||||||
|
|
||||||
(define %default-trap-handler (make-fluid))
|
(define %default-trap-handler (make-fluid))
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@
|
||||||
(define-record <trap-state>
|
(define-record <trap-state>
|
||||||
(handler default-trap-handler)
|
(handler default-trap-handler)
|
||||||
(next-idx 0)
|
(next-idx 0)
|
||||||
|
(next-ephemeral-idx -1)
|
||||||
(wrappers '()))
|
(wrappers '()))
|
||||||
|
|
||||||
(define (trap-wrapper<? t1 t2)
|
(define (trap-wrapper<? t1 t2)
|
||||||
|
@ -103,7 +105,7 @@
|
||||||
((null? wrappers)
|
((null? wrappers)
|
||||||
(warn "no wrapper found with index in trap-state" idx)
|
(warn "no wrapper found with index in trap-state" idx)
|
||||||
#f)
|
#f)
|
||||||
((= (trap-wrapper-index (car wrappers)) idx)
|
((eqv? (trap-wrapper-index (car wrappers)) idx)
|
||||||
(car wrappers))
|
(car wrappers))
|
||||||
(else
|
(else
|
||||||
(lp (cdr wrappers))))))
|
(lp (cdr wrappers))))))
|
||||||
|
@ -113,6 +115,11 @@
|
||||||
(set! (trap-state-next-idx trap-state) (1+ idx))
|
(set! (trap-state-next-idx trap-state) (1+ idx))
|
||||||
idx))
|
idx))
|
||||||
|
|
||||||
|
(define (next-ephemeral-index! trap-state)
|
||||||
|
(let ((idx (trap-state-next-ephemeral-idx trap-state)))
|
||||||
|
(set! (trap-state-next-ephemeral-idx trap-state) (1- idx))
|
||||||
|
idx))
|
||||||
|
|
||||||
(define (handler-for-index trap-state idx)
|
(define (handler-for-index trap-state idx)
|
||||||
(lambda (frame)
|
(lambda (frame)
|
||||||
(let ((wrapper (wrapper-at-index trap-state idx))
|
(let ((wrapper (wrapper-at-index trap-state idx))
|
||||||
|
@ -122,6 +129,16 @@
|
||||||
(trap-wrapper-index wrapper)
|
(trap-wrapper-index wrapper)
|
||||||
(trap-wrapper-name wrapper))))))
|
(trap-wrapper-name wrapper))))))
|
||||||
|
|
||||||
|
(define (ephemeral-handler-for-index trap-state idx handler)
|
||||||
|
(lambda (frame)
|
||||||
|
(let ((wrapper (wrapper-at-index trap-state idx)))
|
||||||
|
(if wrapper
|
||||||
|
(begin
|
||||||
|
(if (trap-wrapper-enabled? wrapper)
|
||||||
|
(disable-trap-wrapper! wrapper))
|
||||||
|
(remove-trap-wrapper! trap-state wrapper)
|
||||||
|
(handler frame))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
@ -221,6 +238,20 @@
|
||||||
idx #t trap
|
idx #t trap
|
||||||
(format #f "Breakpoint at ~a:~a" file user-line)))))
|
(format #f "Breakpoint at ~a:~a" file user-line)))))
|
||||||
|
|
||||||
|
;; handler := frame -> nothing
|
||||||
|
(define* (add-trap-at-frame-finish! frame handler
|
||||||
|
#:optional (trap-state (the-trap-state)))
|
||||||
|
(let* ((idx (next-ephemeral-index! trap-state))
|
||||||
|
(trap (trap-frame-finish
|
||||||
|
frame
|
||||||
|
(ephemeral-handler-for-index trap-state idx handler)
|
||||||
|
(lambda (frame) (delete-trap! idx trap-state)))))
|
||||||
|
(add-trap-wrapper!
|
||||||
|
trap-state
|
||||||
|
(make-trap-wrapper
|
||||||
|
idx #t trap
|
||||||
|
(format #f "Return from ~a" frame)))))
|
||||||
|
|
||||||
(define* (add-trap! trap name #:optional (trap-state (the-trap-state)))
|
(define* (add-trap! trap name #:optional (trap-state (the-trap-state)))
|
||||||
(let* ((idx (next-index! trap-state)))
|
(let* ((idx (next-index! trap-state)))
|
||||||
(add-trap-wrapper!
|
(add-trap-wrapper!
|
||||||
|
|
|
@ -268,7 +268,7 @@
|
||||||
range))
|
range))
|
||||||
|
|
||||||
;; Building on trap-instructions-in-procedure, we have
|
;; Building on trap-instructions-in-procedure, we have
|
||||||
;; trap-instructions-in-procedure.
|
;; trap-at-procedure-ip-in-range.
|
||||||
;;
|
;;
|
||||||
(define* (trap-at-procedure-ip-in-range proc range handler
|
(define* (trap-at-procedure-ip-in-range proc range handler
|
||||||
#:key current-frame (vm (the-vm))
|
#:key current-frame (vm (the-vm))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue