1.0.28.19: faster ARRAY-DIMENSION for non-vectors
[sbcl.git] / src / code / interr.lisp
index 232f1a6..c3f039f 100644 (file)
 (sb!xc:defmacro deferr (name args &rest body)
   (let* ((rest-pos (position '&rest args))
          (required (if rest-pos (subseq args 0 rest-pos) args))
-         (fp (gensym))
-         (context (gensym))
-         (sc-offsets (gensym))
          (fn-name (symbolicate name "-HANDLER")))
-    `(progn
-       ;; FIXME: Having a separate full DEFUN for each error doesn't
-       ;; seem to add much value, and it takes a lot of space. Perhaps
-       ;; we could do this dispatch with a big CASE statement instead?
-       (defun ,fn-name (name ,fp ,context ,sc-offsets)
-         ;; FIXME: It would probably be good to do *STACK-TOP-HINT*
-         ;; tricks to hide this internal error-handling logic from the
-         ;; poor high level user, so his debugger tells him about
-         ;; where his error was detected instead of telling him where
-         ;; he ended up inside the system error-handling logic.
-         (declare (ignorable name ,fp ,context ,sc-offsets))
-         (let (,@(let ((offset -1))
-                   (mapcar (lambda (var)
-                             `(,var (sb!di::sub-access-debug-var-slot
-                                     ,fp
-                                     (nth ,(incf offset)
-                                          ,sc-offsets)
-                                     ,context)))
-                           required))
-               ,@(when rest-pos
-                   `((,(nth (1+ rest-pos) args)
-                      (mapcar (lambda (sc-offset)
-                                (sb!di::sub-access-debug-var-slot
-                                 ,fp
-                                 sc-offset
-                                 ,context))
-                              (nthcdr ,rest-pos ,sc-offsets))))))
-           ,@body))
-       (setf (svref *internal-errors* ,(error-number-or-lose name))
-             #',fn-name))))
+    (with-unique-names (fp context sc-offsets)
+      `(progn
+         ;; FIXME: Having a separate full DEFUN for each error doesn't
+         ;; seem to add much value, and it takes a lot of space. Perhaps
+         ;; we could do this dispatch with a big CASE statement instead?
+         (defun ,fn-name (name ,fp ,context ,sc-offsets)
+           ;; FIXME: It would probably be good to do *STACK-TOP-HINT*
+           ;; tricks to hide this internal error-handling logic from the
+           ;; poor high level user, so his debugger tells him about
+           ;; where his error was detected instead of telling him where
+           ;; he ended up inside the system error-handling logic.
+           (declare (ignorable name ,fp ,context ,sc-offsets))
+           (let (,@(let ((offset -1))
+                        (mapcar (lambda (var)
+                                  `(,var (sb!di::sub-access-debug-var-slot
+                                          ,fp
+                                          (nth ,(incf offset)
+                                           ,sc-offsets)
+                                          ,context)))
+                                required))
+                 ,@(when rest-pos
+                     `((,(nth (1+ rest-pos) args)
+                        (mapcar (lambda (sc-offset)
+                                  (sb!di::sub-access-debug-var-slot
+                                   ,fp
+                                   sc-offset
+                                   ,context))
+                         (nthcdr ,rest-pos ,sc-offsets))))))
+             ,@body))
+        (setf (svref *internal-errors* ,(error-number-or-lose name))
+              #',fn-name)))))
 
 ) ; EVAL-WHEN
 
          :format-arguments (list key-name)))
 
 (deferr invalid-array-index-error (array bound index)
-  (invalid-array-index-error array bound index))
+  (invalid-array-index-error array index bound))
 
 (deferr object-not-simple-array-error (object)
   (error 'type-error
          (multiple-value-bind (name sb!debug:*stack-top-hint*)
              (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*))
              "Control stack guard page temporarily disabled: proceed with caution~%")
      (error 'control-stack-exhausted))))
 
+(defun binding-stack-exhausted-error ()
+  (let ((sb!debug:*stack-top-hint* nil))
+    (infinite-error-protect
+     (format *error-output*
+             "Binding stack guard page temporarily disabled: proceed with caution~%")
+     (error 'binding-stack-exhausted))))
+
+(defun alien-stack-exhausted-error ()
+  (let ((sb!debug:*stack-top-hint* nil))
+    (infinite-error-protect
+     (format *error-output*
+             "Alien stack guard page temporarily disabled: proceed with caution~%")
+     (error 'alien-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