0.9.1.38:
[sbcl.git] / src / code / condition.lisp
index ecd3766..29c854a 100644 (file)
 
 (in-package "SB!KERNEL")
 \f
+;;;; miscellaneous support utilities
+
+;;; Signalling an error when trying to print an error condition is
+;;; generally a PITA, so whatever the failure encountered when
+;;; wondering about FILE-POSITION within a condition printer, 'tis
+;;; better silently to give up than to try to complain. 
+(defun file-position-or-nil-for-error (stream &optional (pos nil posp))
+  ;; Arguably FILE-POSITION shouldn't be signalling errors at all; but
+  ;; "NIL if this cannot be determined" in the ANSI spec doesn't seem
+  ;; absolutely unambiguously to prohibit errors when, e.g., STREAM
+  ;; has been closed so that FILE-POSITION is a nonsense question. So
+  ;; my (WHN) impression is that the conservative approach is to
+  ;; IGNORE-ERRORS. (I encountered this failure from within a homebrew
+  ;; defsystemish operation where the ERROR-STREAM had been CL:CLOSEd,
+  ;; I think by nonlocally exiting through a WITH-OPEN-FILE, by the
+  ;; time an error was reported.)
+  (if posp
+      (ignore-errors (file-position stream pos))
+      (ignore-errors (file-position stream))))
+\f
 ;;;; the CONDITION class
 
 (/show0 "condition.lisp 20")
                                      "new"
                                      (layout-length layout)
                                      (layout-inherits layout)
-                                     (layout-depthoid layout))
+                                     (layout-depthoid layout)
+                                     (layout-n-untagged-slots layout))
             (register-layout layout :invalidate t))
            ((not (classoid-layout class))
             (register-layout layout)))
   (:report
    (lambda (condition stream)
      (let* ((error-stream (stream-error-stream condition))
-           (pos (file-position error-stream)))
+           (pos (file-position-or-nil-for-error error-stream)))
        (let (lineno colno)
         (when (and pos
                    (< pos sb!xc:array-dimension-limit)
                    (file-position error-stream :start))
           (let ((string
                  (make-string pos
-                              :element-type (stream-element-type error-stream))))
+                              :element-type (stream-element-type
+                                             error-stream))))
             (when (= pos (read-sequence string error-stream))
               (setq lineno (1+ (count #\Newline string))
                     colno (- pos
                              (or (position #\Newline string :from-end t) -1)
                              1))))
-          (file-position error-stream pos))
+          (file-position-or-nil-for-error error-stream pos))
         (format stream
                 "READER-ERROR ~@[at ~W ~]~
                   ~@[(line ~W~]~@[, column ~W) ~]~
               <http://sbcl.sourceforge.net/>.~:@>"
             '((fmakunbound 'compile))))))
 
+(define-condition simple-storage-condition (storage-condition simple-condition) ())
+
 ;;; a condition for use in stubs for operations which aren't supported
 ;;; on some platforms
 ;;;
 (define-condition extension-failure (reference-condition simple-error)
   ())
 
+(define-condition structure-initarg-not-keyword
+    (reference-condition simple-style-warning)
+  ()
+  (:default-initargs :references (list '(:ansi-cl :section (2 4 8 13)))))
+
 #!+sb-package-locks
 (progn
 
@@ -937,11 +966,20 @@ SB-EXT:PACKAGE-LOCKED-ERROR-SYMBOL."))
 
 ) ; progn
 
-(define-condition undefined-alien-error (error) ()
+(define-condition undefined-alien-error (error) ())
+
+(define-condition undefined-alien-variable-error (undefined-alien-error) ()
   (:report
    (lambda (condition stream)
      (declare (ignore condition))
-     (format stream "Attempt to access an undefined alien value."))))
+     (format stream "Attempt to access an undefined alien variable."))))
+
+(define-condition undefined-alien-function-error (undefined-alien-error) ()
+  (:report
+   (lambda (condition stream)
+     (declare (ignore condition))
+     (format stream "Attempt to call an undefined alien function."))))
+
 \f
 ;;;; various other (not specified by ANSI) CONDITIONs
 ;;;;
@@ -1075,13 +1113,20 @@ SB-EXT:PACKAGE-LOCKED-ERROR-SYMBOL."))
    (lambda (condition stream)
      (let ((error-stream (stream-error-stream condition)))
        (format stream "READER-ERROR ~@[at ~W ~]on ~S:~%~?~%Original error: ~A"
-              (file-position error-stream) error-stream
+              (file-position-or-nil-for-error error-stream) error-stream
               (reader-error-format-control condition)
               (reader-error-format-arguments condition)
               (reader-impossible-number-error-error condition))))))
 
 (define-condition timeout (serious-condition) ())
 
+(define-condition declaration-type-conflict-error (reference-condition
+                                                  simple-error)
+  ()
+  (:default-initargs
+      :format-control "symbol ~S cannot be both the name of a type and the name of a declaration"
+    :references (list '(:ansi-cl :section (3 8 21)))))
+
 ;;; Single stepping conditions
 
 (define-condition step-condition ()