X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Finterr.lisp;h=8fb704a943e7cf24a9f3b6e6d9a6e6262aec81d5;hb=ec2e02db335d1545b3c18233bf440ca4160f780d;hp=f5b46bcd08ac184c4a3a6c4eddf2057011adb72e;hpb=88cc2f72774202503588331fddd1592ae8546de1;p=sbcl.git diff --git a/src/code/interr.lisp b/src/code/interr.lisp index f5b46bc..8fb704a 100644 --- a/src/code/interr.lisp +++ b/src/code/interr.lisp @@ -363,8 +363,8 @@ (values "" nil))))) -(defun find-interrupted-name () - (/show0 "entering FIND-INTERRUPTED-NAME") +(defun find-interrupted-name-and-frame () + (/show0 "entering FIND-INTERRUPTED-NAME-AND-FRAME") (if *finding-name* (values "" nil) (handler-case @@ -390,6 +390,7 @@ (values "" nil))))) + ;;;; INTERNAL-ERROR signal handler (defun internal-error (context continuable) @@ -400,7 +401,7 @@ (infinite-error-protect (/show0 "about to bind ALIEN-CONTEXT") (let ((alien-context (locally - (declare (optimize (inhibit-warnings 3))) + (declare (optimize (inhibit-warnings 3))) (sb!alien:sap-alien context (* os-context-t))))) (/show0 "about to bind ERROR-NUMBER and ARGUMENTS") (multiple-value-bind (error-number arguments) @@ -418,7 +419,7 @@ (%primitive sb!c:halt)) (multiple-value-bind (name sb!debug:*stack-top-hint*) - (find-interrupted-name) + (find-interrupted-name-and-frame) (/show0 "back from FIND-INTERRUPTED-NAME") (let ((fp (int-sap (sb!vm:context-register alien-context sb!vm::cfp-offset))) @@ -474,5 +475,21 @@ (defun undefined-alien-function-error () (error 'undefined-alien-function-error)) +#!-win32 +(define-alien-variable current-memory-fault-address long) + +#!-win32 (defun memory-fault-error () - (error 'memory-fault-error)) + (error 'memory-fault-error + :address current-memory-fault-address)) + +;;; This is SIGTRAP / EXCEPTION_BREAKPOINT that runtime could not deal +;;; with. Prior to Windows we just had a Lisp side handler for +;;; SIGTRAP, but now we need to deal this portably. +(defun unhandled-trap-error (context-sap) + (declare (type system-area-pointer context-sap)) + (infinite-error-protect + (let ((context (sap-alien context-sap (* os-context-t)))) + (error 'breakpoint-error + :context context + :address (sap-int (sb!vm:context-pc context))))))