From 9943ee511c2e114876b2c6f52876984ad7087354 Mon Sep 17 00:00:00 2001 From: Juho Snellman Date: Wed, 20 Sep 2006 15:04:48 +0000 Subject: [PATCH] 0.9.16.43: Switch to using the more accurate method of determining *STEP-FRAME* on x86/x86-64 where SIGNAL-CONTEXT-FRAME works. Retain the previous kludge on non-x86, where SIGNAL-CONTEXT-FRAME seems to be completely broken. --- src/code/debug-int.lisp | 25 +++++++++++++++---------- tests/step.impure.lisp | 47 ++++++++++++++++++++++++++++++----------------- version.lisp-expr | 2 +- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 2dfd05d..6a7692a 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -3332,16 +3332,21 @@ register." ;; If there was not enough debug information available, there's no ;; sense in signaling the condition. (when step-info - (let ((*step-frame* (frame-down (top-frame)))) - ;; KLUDGE: Use the first non-foreign frame as the - ;; *STACK-TOP-HINT*. Getting the frame from the signal context - ;; would be cleaner, but SIGNAL-CONTEXT-FRAME doesn't seem - ;; seem to work very well currently. - (loop while *step-frame* - for dfun = (frame-debug-fun *step-frame*) - do (when (typep dfun 'compiled-debug-fun) - (return)) - do (setf *step-frame* (frame-down *step-frame*))) + (let ((*step-frame* + #+(or x86 x86-64) + (signal-context-frame (sb!alien::alien-sap context)) + #-(or x86 x86-64) + ;; KLUDGE: Use the first non-foreign frame as the + ;; *STACK-TOP-HINT*. Getting the frame from the signal + ;; context as on x86 would be cleaner, but + ;; SIGNAL-CONTEXT-FRAME doesn't seem seem to work at all + ;; on non-x86. + (loop with frame = (frame-down (top-frame)) + while frame + for dfun = (frame-debug-fun *step-frame*) + do (when (typep dfun 'compiled-debug-fun) + (return frame)) + do (setf *step-frame* (frame-down *step-frame*))))) (sb!impl::step-form step-info ;; We could theoretically store information in ;; the debug-info about to determine the diff --git a/tests/step.impure.lisp b/tests/step.impure.lisp index f02f148..652ad2a 100644 --- a/tests/step.impure.lisp +++ b/tests/step.impure.lisp @@ -149,7 +149,8 @@ (dfun (sb-di::frame-debug-fun frame)) (name (sb-di::debug-fun-name dfun))) (assert (equal name 'fib)) - (incf count))))))) + (incf count) + (invoke-restart 'step-next))))))) (step (fib 3)) (assert (= count 6)))) @@ -161,20 +162,32 @@ (backtrace))))))) (step (fib 3)))) -(handler-bind ((step-condition (lambda (c) - (funcall *stepper-hook* c)))) - (with-test (:name :step-into) - (test-step-into)) - (with-test (:name :step-next) - (test-step-next)) - (with-test (:name :step-out) - (test-step-out)) - (with-test (:name :step-start-from-break) - (test-step-start-from-break)) - (with-test (:name :step-frame) - (test-step-frame)) - (with-test (:name :step-backtrace) +(with-test (:name :step-into) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) + (test-step-into))) + +(with-test (:name :step-next) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) + (test-step-next))) + +(with-test (:name :step-out) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) + (test-step-out))) + +(with-test (:name :step-start-from-break) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) + (test-step-start-from-break))) + +(with-test (:name :step-frame) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) + (test-step-frame))) + +(with-test (:name :step-backtrace) + (handler-bind ((step-condition (lambda (c) + (funcall *stepper-hook* c)))) (test-step-backtrace))) - - - diff --git a/version.lisp-expr b/version.lisp-expr index 2ac1030..84d37cc 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.16.42" +"0.9.16.43" -- 1.7.10.4