X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdebug-int.lisp;h=0366b5b82737e252b96b09504efbe52996d6e348;hb=355e6c09a8f7f528a838f7a50b99ad77811b51a2;hp=fbec1a2fe3541e9be66f209d0ecab8c3043dfffc;hpb=f59d43f28fb757db168e46399b7c8ab04cc6620b;p=sbcl.git diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index fbec1a2..0366b5b 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -654,29 +654,12 @@ (defun descriptor-sap (x) (int-sap (get-lisp-obj-address x))) -(defun nth-interrupt-context (n) - (declare (type (unsigned-byte 32) n) - (optimize (speed 3) (safety 0))) - (sb!alien:sap-alien (sb!vm::current-thread-offset-sap - (+ sb!vm::thread-interrupt-contexts-offset n)) - (* os-context-t))) - ;;; Return the top frame of the control stack as it was before calling ;;; this function. (defun top-frame () (/noshow0 "entering TOP-FRAME") - ;; check to see if we can get the context by calling - ;; nth-interrupt-context, otherwise use the (%caller-frame-and-pc - ;; vop). - (let ((context (nth-interrupt-context 0))) - (if (and context - (not (sb!alien:null-alien context))) - (compute-calling-frame - (int-sap (sb!vm:context-register context - sb!vm::cfp-offset)) - (context-pc context) nil) - (multiple-value-bind (fp pc) (%caller-frame-and-pc) - (compute-calling-frame (descriptor-sap fp) pc nil))))) + (multiple-value-bind (fp pc) (%caller-frame-and-pc) + (compute-calling-frame (descriptor-sap fp) pc nil))) ;;; Flush all of the frames above FRAME, and renumber all the frames ;;; below FRAME. @@ -878,6 +861,13 @@ (if up-frame (1+ (frame-number up-frame)) 0) escaped))))) +(defun nth-interrupt-context (n) + (declare (type (unsigned-byte 32) n) + (optimize (speed 3) (safety 0))) + (sb!alien:sap-alien (sb!vm::current-thread-offset-sap + (+ sb!vm::thread-interrupt-contexts-offset n)) + (* os-context-t))) + #!+(or x86 x86-64) (defun find-escaped-frame (frame-pointer) (declare (type system-area-pointer frame-pointer)) @@ -3361,8 +3351,8 @@ register." ;;; or replace the function that's about to be called with a wrapper ;;; which will signal the condition. -(defun handle-single-step-trap (context-sap kind callee-register-offset) - (let ((context (sb!alien:sap-alien context-sap (* os-context-t)))) +(defun handle-single-step-trap (kind callee-register-offset) + (let ((context (nth-interrupt-context (1- *free-interrupt-context-index*)))) ;; The following calls must get tail-call eliminated for ;; *STEP-FRAME* to get set correctly on non-x86. (if (= kind single-step-before-trap)