;; 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)))
+ (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))
+ (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))
(deferr unknown-error (&rest args)
(error "unknown error:~{ ~S~})" args))
-(deferr object-not-function-error (object)
+(deferr object-not-fun-error (object)
(error 'type-error
:datum object
:expected-type 'function))
:datum object
:expected-type 'simple-string))
-(deferr object-not-simple-bit-vector-error (object)
- (error 'type-error
- :datum object
- :expected-type 'simple-bit-vector))
-
-(deferr object-not-simple-vector-error (object)
- (error 'type-error
- :datum object
- :expected-type 'simple-vector))
-
(deferr object-not-fixnum-error (object)
(error 'type-error
:datum object
:datum object
:expected-type 'string))
+(deferr object-not-base-string-error (object)
+ (error 'type-error
+ :datum object
+ :expected-type 'base-string))
+
(deferr object-not-bit-vector-error (object)
(error 'type-error
:datum object
:datum object
:expected-type 'symbol))
-(deferr undefined-symbol-error (fdefn-or-symbol)
+(deferr undefined-fun-error (fdefn-or-symbol)
(error 'undefined-function
:name (etypecase fdefn-or-symbol
(symbol fdefn-or-symbol)
(fdefn (fdefn-name fdefn-or-symbol)))))
-(deferr object-not-coerceable-to-function-error (object)
- (error 'type-error
- :datum object
- :expected-type 'coerceable-to-function))
-
-(deferr invalid-argument-count-error (nargs)
+(deferr invalid-arg-count-error (nargs)
(error 'simple-program-error
:format-control "invalid number of arguments: ~S"
:format-arguments (list nargs)))
-(deferr bogus-argument-to-values-list-error (list)
+(deferr bogus-arg-to-values-list-error (list)
(error 'simple-type-error
:datum list
:expected-type 'list
:format-control "attempt to THROW to a tag that does not exist: ~S"
:format-arguments (list tag)))
-(deferr nil-function-returned-error (function)
+(deferr nil-fun-returned-error (function)
(error 'simple-control-error
:format-control
"A function with declared result type NIL returned:~% ~S"
:format-arguments (list function)))
+(deferr nil-array-accessed-error (array)
+ (error 'nil-array-accessed-error
+ :datum array :expected-type '(not (array nil))))
+
(deferr division-by-zero-error (this that)
(error 'division-by-zero
:operation 'division
(deferr layout-invalid-error (object layout)
(error 'layout-invalid
:datum object
- :expected-type (layout-class layout)))
+ :expected-type (layout-classoid layout)))
-(deferr odd-key-arguments-error ()
+(deferr odd-key-args-error ()
(error 'simple-program-error
:format-control "odd number of &KEY arguments"))
-(deferr unknown-key-argument-error (key-name)
+(deferr unknown-key-arg-error (key-name)
(error 'simple-program-error
:format-control "unknown &KEY argument: ~S"
:format-arguments (list key-name)))
(deferr invalid-array-index-error (array bound index)
- (error 'simple-error
+ (error 'simple-type-error
:format-control
- "invalid array index ~D for ~S (should be nonnegative and <~D)"
- :format-arguments (list index array bound)))
+ "invalid array index ~W for ~S (should be nonnegative and <~W)"
+ :format-arguments (list index array bound)
+ :datum index
+ :expected-type `(integer 0 (,bound))))
(deferr object-not-simple-array-error (object)
(error 'type-error
:datum object
:expected-type '(unsigned-byte 32)))
-(deferr object-not-simple-array-unsigned-byte-2-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (unsigned-byte 2) (*))))
-
-(deferr object-not-simple-array-unsigned-byte-4-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (unsigned-byte 4) (*))))
-
-(deferr object-not-simple-array-unsigned-byte-8-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (unsigned-byte 8) (*))))
-
-(deferr object-not-simple-array-unsigned-byte-16-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (unsigned-byte 16) (*))))
-
-(deferr object-not-simple-array-unsigned-byte-32-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (unsigned-byte 32) (*))))
-
-(deferr object-not-simple-array-signed-byte-8-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (signed-byte 8) (*))))
-
-(deferr object-not-simple-array-signed-byte-16-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (signed-byte 16) (*))))
-
-(deferr object-not-simple-array-signed-byte-30-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (signed-byte 30) (*))))
-
-(deferr object-not-simple-array-signed-byte-32-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (signed-byte 32) (*))))
-
-(deferr object-not-simple-array-single-float-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array single-float (*))))
-
-(deferr object-not-simple-array-double-float-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array double-float (*))))
-
-(deferr object-not-simple-array-complex-single-float-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (complex single-float) (*))))
-
-(deferr object-not-simple-array-complex-double-float-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (complex double-float) (*))))
-
-#!+long-float
-(deferr object-not-simple-array-complex-long-float-error (object)
- (error 'type-error
- :datum object
- :expected-type '(simple-array (complex long-float) (*))))
+(macrolet
+ ((define-simple-array-internal-errors ()
+ `(progn
+ ,@(map 'list
+ (lambda (saetp)
+ `(deferr ,(symbolicate
+ "OBJECT-NOT-"
+ (sb!vm:saetp-primitive-type-name saetp)
+ "-ERROR")
+ (object)
+ (error 'type-error
+ :datum object
+ :expected-type '(simple-array
+ ,(sb!vm:saetp-specifier saetp)
+ (*)))))
+ sb!vm:*specialized-array-element-type-properties*))))
+ (define-simple-array-internal-errors))
(deferr object-not-complex-error (object)
(error 'type-error
\f
;;;; INTERNAL-ERROR signal handler
+(defvar *internal-error-args*)
+
(defun internal-error (context continuable)
(declare (type system-area-pointer context))
(declare (ignore continuable))
(sb!alien:sap-alien context (* os-context-t)))))
(/show0 "about to bind ERROR-NUMBER and ARGUMENTS")
(multiple-value-bind (error-number arguments)
- (sb!vm:internal-error-arguments alien-context)
- (/show0 "back from INTERNAL-ERROR-ARGUMENTS, ERROR-NUMBER=..")
+ (sb!vm:internal-error-args alien-context)
+
+ ;; There's a limit to how much error reporting we can usefully
+ ;; do before initialization is complete, but try to be a little
+ ;; bit helpful before we die.
+ (/show0 "back from INTERNAL-ERROR-ARGS, ERROR-NUMBER=..")
(/hexstr error-number)
- (/show0 "ARGUMENTS=..")
+ (/show0 "cold/low ARGUMENTS=..")
(/hexstr arguments)
+ (unless *cold-init-complete-p*
+ (%primitive print "can't recover from error in cold init, halting")
+ (%primitive sb!c:halt))
+
(multiple-value-bind (name sb!debug:*stack-top-hint*)
(find-interrupted-name)
(/show0 "back from FIND-INTERRUPTED-NAME")
(cond ((null handler)
(error 'simple-error
:format-control
- "unknown internal error, ~D? args=~S"
+ "unknown internal error, ~D, args=~S"
:format-arguments
(list error-number
- (mapcar #'(lambda (sc-offset)
- (sb!di::sub-access-debug-var-slot
- fp sc-offset alien-context))
+ (mapcar (lambda (sc-offset)
+ (sb!di::sub-access-debug-var-slot
+ fp sc-offset alien-context))
arguments))))
((not (functionp handler))
(error 'simple-error
:format-arguments
(list error-number
handler
- (mapcar #'(lambda (sc-offset)
- (sb!di::sub-access-debug-var-slot
- fp sc-offset alien-context))
+ (mapcar (lambda (sc-offset)
+ (sb!di::sub-access-debug-var-slot
+ fp sc-offset alien-context))
arguments))))
(t
(funcall handler name fp alien-context arguments)))))))))
+
+(defun control-stack-exhausted-error ()
+ (let ((sb!debug:*stack-top-hint* nil))
+ (infinite-error-protect
+ (format *error-output*
+ "Control stack guard page temporarily disabled: proceed with caution~%")
+ (error 'control-stack-exhausted))))
+
+
+