X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Finterr.lisp;h=8fb4657fe01d0db730fc89f107a5e9170abb85f9;hb=da8cb4801a3ab35070f380e22aea3d260f9df8aa;hp=5b97d54edb8a84718a915b21665f0d1441e284fc;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/src/code/interr.lisp b/src/code/interr.lisp index 5b97d54..8fb4657 100644 --- a/src/code/interr.lisp +++ b/src/code/interr.lisp @@ -238,7 +238,7 @@ :operands (list this that))) (deferr object-not-type-error (object type) - (error (if (and (typep object 'instance) + (error (if (and (%instancep object) (layout-invalid (%instance-layout object))) 'layout-invalid 'type-error) @@ -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,9 +390,8 @@ (values "" nil))))) -;;;; INTERNAL-ERROR signal handler -(defvar *internal-error-args*) +;;;; INTERNAL-ERROR signal handler (defun internal-error (context continuable) (declare (type system-area-pointer context)) @@ -402,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) @@ -420,8 +419,16 @@ (%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") + ;; Unblock trap signal here, we unwound the stack and can't return. + ;; FIXME: Should we not reset the _entire_ mask, but just + ;; restore it to the state before we got the condition? + ;; FIXME 2: Signals are currently unblocked in + ;; interrupt.c:internal_error before we do stack unwinding, can this + ;; introduce a race condition? + #!+(and linux mips) + (sb!unix::reset-signal-mask) (let ((fp (int-sap (sb!vm:context-register alien-context sb!vm::cfp-offset))) (handler (and (< -1 error-number (length *internal-errors*)) @@ -456,11 +463,41 @@ "Control stack guard page temporarily disabled: proceed with caution~%") (error 'control-stack-exhausted)))) +;;; KLUDGE: we keep a single HEAP-EXHAUSTED-ERROR object around, so +;;; that we don't need to allocate it when running out of memory. Similarly +;;; we pass the amounts in special variables as there may be multiple threads +;;; running into trouble at the same time. The condition is created by GC-REINIT. +(defvar *heap-exhausted-error-condition*) +(defvar *heap-exhausted-error-available-bytes*) +(defvar *heap-exhausted-error-requested-bytes*) + +(defun heap-exhausted-error (available requested) + (infinite-error-protect + (let ((*heap-exhausted-error-available-bytes* available) + (*heap-exhausted-error-requested-bytes* requested)) + (error *heap-exhausted-error-condition*)))) + (defun undefined-alien-variable-error () (error 'undefined-alien-variable-error)) (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)) \ No newline at end of file + (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 with 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))))))