From 54709e55f8460c83fc0225cb78ada3331a2f125c Mon Sep 17 00:00:00 2001 From: Dane Johnson Date: Mon, 25 Aug 2025 17:26:11 -0500 Subject: [PATCH] Added stepping to debugger --- scmvm.scm | 2 +- scmvm/debugger.scm | 21 ++++++++++++++------- tests.scm | 17 ++++++++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/scmvm.scm b/scmvm.scm index 8b47b2d..71630e0 100644 --- a/scmvm.scm +++ b/scmvm.scm @@ -10,7 +10,7 @@ ;; assembler assemble ;; debugger - make-debugger debugger-continue + make-debugger debugger-continue debugger-step debugger-vm debugger-breakpoints debugger-breakpoints-set! debugger-breakpoint-add! debugger-breakpoint-ref diff --git a/scmvm/debugger.scm b/scmvm/debugger.scm index 8cdaa87..56141c8 100644 --- a/scmvm/debugger.scm +++ b/scmvm/debugger.scm @@ -12,15 +12,16 @@ debugger-breakpoint-add! debugger-breakpoint-ref debugger-breakpoint-enable! debugger-breakpoint-disable! debugger-breakpoint-delete! - debugger-continue)) + debugger-step debugger-continue)) (define-record-type - (make-debugger vm source breakpoints continuation) + (make-debugger vm source breakpoints continuation stepping) debugger? (vm debugger-vm) (source debugger-source) (breakpoints debugger-breakpoints) - (continuation debugger-continuation debugger-continuation-set!)) + (continuation debugger-continuation debugger-continuation-set!) + (stepping debugger-stepping? debugger-stepping-set!)) (define (make-breakpoints labels) (define the-breakpoints '()) @@ -51,17 +52,23 @@ (define the-debugger #f) (define (debug) (shift k - (if (((debugger-breakpoints the-debugger) 'ref) (vm-pc (debugger-vm the-debugger))) - (debugger-continuation-set! the-debugger k) - (k)))) + (if (or (debugger-stepping? the-debugger) + (((debugger-breakpoints the-debugger) 'ref) (vm-pc (debugger-vm the-debugger)))) + (debugger-continuation-set! the-debugger k) + (k)))) (define vm (make-vm #:debugger debug)) (vm-load-program! vm prgm) - (set! the-debugger (make-debugger vm source (make-breakpoints symbols) #f)) + (set! the-debugger (make-debugger vm source (make-breakpoints symbols) #f #f)) (debugger-breakpoint-add! the-debugger 1) (reset (run-vm vm)) the-debugger) (define (debugger-continue debugger) + (debugger-stepping-set! debugger #f) + ((debugger-continuation debugger))) + +(define (debugger-step debugger) + (debugger-stepping-set! debugger #t) ((debugger-continuation debugger))) (define (debugger-breakpoint-add! debugger breakpoint) diff --git a/tests.scm b/tests.scm index b69571a..34844f6 100644 --- a/tests.scm +++ b/tests.scm @@ -144,4 +144,19 @@ (stack-pop my-data) (stack-push my-data 1) (debugger-continue my-debugger) - (assert-equal 1 (vm-memory-ref my-vm 1)))) + (assert-equal 1 (vm-memory-ref my-vm 1))) + (define-test "stepping" + (define my-debugger (make-debugger fib-program-asm)) + (define my-vm (debugger-vm my-debugger)) + (vm-memory-set! my-vm 1 10) + (vm-pc-set! my-vm 5) + (debugger-breakpoint-add! my-debugger 'fib) + (debugger-continue my-debugger) + (assert-equal 23 (vm-pc my-vm)) + (debugger-step my-debugger) + (assert-equal 24 (vm-pc my-vm)) ;; dup is a 1 byte instruction + (debugger-step my-debugger) + (assert-equal 29 (vm-pc my-vm)) ;; push is a 5 byte instruction + (debugger-continue my-debugger) + (assert-equal 23 (vm-pc my-vm)) ;; continue stops stepping + ))