source: trunk/source/level-1/l1-error-signal.lisp @ 13066

Last change on this file since 13066 was 13066, checked in by rme, 10 years ago

Change "OpenMCL" to "Clozure CL" in comments and docstrings.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1;;;-*-Mode: LISP; Package: CCL -*-
2;;;
3;;;   Copyright (C) 1994-2001 Digitool, Inc
4;;;   This file is part of Clozure CL. 
5;;;
6;;;   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
7;;;   License , known as the LLGPL and distributed with Clozure CL as the
8;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
9;;;   which is distributed with Clozure CL as the file "LGPL".  Where these
10;;;   conflict, the preamble takes precedence. 
11;;;
12;;;   Clozure CL is referenced in the preamble as the "LIBRARY."
13;;;
14;;;   The LLGPL is also available online at
15;;;   http://opensource.franz.com/preamble.html
16
17(in-package "CCL")
18
19(defun %kernel-restart (error-type &rest args)
20  (%kernel-restart-internal error-type args (%get-frame-ptr)))
21
22(defun %kernel-restart-internal (error-type args frame-ptr)
23  ;(declare (dynamic-extent args))
24  (dolist (f *kernel-restarts* (%err-disp-internal error-type args frame-ptr))
25    (when (eq (car f) error-type)
26      (return (apply (cdr f) frame-ptr args)))))
27
28;;; this is the def of %err-disp.
29;;; Yup.  That was my first guess.
30(defun %err-disp (err-num &rest errargs)
31  (%err-disp-internal err-num errargs (%get-frame-ptr)))
32
33(defun %errno-disp (errno &rest errargs)
34  (%errno-disp-internal errno errargs (%get-frame-ptr)))
35
36#+windows-target
37(defun %windows-error-disp (errno &rest errargs)
38  (%err-disp-common errno 0 (%windows-error-string errno) errargs (%get-frame-ptr)))
39 
40(defun %errno-disp-internal (errno errargs frame-ptr)
41  (declare (fixnum errno))
42  (let* ((err-type (max (ash errno -16) 0))
43         (errno (%word-to-int errno))
44         (error-string (%strerror errno))
45         (format-string (if errargs
46                          (format nil "~a : ~a" error-string "~s")
47                          error-string)))
48    (%err-disp-common nil err-type  format-string errargs frame-ptr)))
49
50
51(defun %err-disp-internal (err-num errargs frame-ptr)
52  (declare (fixnum err-num))
53  ;;; The compiler (finally !) won't tail-apply error.  But we kind of
54  ;;; expect it to ...
55  (let* ((err-typ (max (ash err-num -16) 0))
56         (err-num (%word-to-int err-num))
57         (format-string (%rsc-string err-num)))
58    (%err-disp-common err-num err-typ format-string errargs frame-ptr)))
59
60(defparameter *foreign-error-condition-recognizers* ())
61
62
63(defun %err-disp-common (err-num err-typ format-string errargs frame-ptr)
64  (let* ((condition-name (or (uvref *simple-error-types* err-typ)
65                             (%cdr (assq err-num *kernel-simple-error-classes*)))))
66    ;;(dbg format-string)
67    (if condition-name     
68      (funcall '%error
69               (case condition-name
70                 (type-error
71                  (if (cdr errargs)
72                    (make-condition condition-name
73                                             :format-control format-string
74                                             :datum (car errargs)
75                                             :expected-type (%type-error-type (cadr errargs)))
76                    (make-condition condition-name
77                                             :format-control format-string
78                                             :datum (car errargs))))
79                 (improper-list (make-condition condition-name
80                                                :datum (car errargs)))
81                 (simple-file-error (make-condition condition-name
82                                             :pathname (car errargs)
83                                             :error-type format-string
84                                             :format-arguments (cdr errargs)))
85                 (undefined-function (make-condition condition-name
86                                                     :name (car errargs)))
87                 (call-special-operator-or-macro
88                  (make-condition condition-name
89                                  :name (car errargs)
90                                  :function-arguments (cadr errargs)))
91                 (sequence-index-type-error
92                  (make-sequence-index-type-error (car errargs) (cadr errargs)))
93                 (cant-construct-arglist
94                  (make-condition condition-name
95                                  :datum (car errargs)
96                                  :format-control format-string))
97                 (array-element-type-error
98                  (let* ((array (cadr errargs)))
99                    (make-condition condition-name
100                                    :format-control format-string
101                                    :datum (car errargs)
102                                    :expected-type (array-element-type array)
103                                    :array array)))
104                                 
105                 (t (make-condition condition-name 
106                                    :format-control format-string
107                                    :format-arguments errargs)))
108               nil
109               frame-ptr)
110      (let* ((cond nil))
111        (if (and (eql err-num $XFOREIGNEXCEPTION)
112                 (dolist (recog *foreign-error-condition-recognizers*)
113                   (let* ((c (funcall recog (car errargs))))
114                     (when c (return (setq cond c))))))
115          (funcall '%error cond nil frame-ptr)
116          (funcall '%error format-string errargs frame-ptr))))))
117
118(defun error (condition &rest args)
119  "Invoke the signal facility on a condition formed from DATUM and ARGUMENTS.
120  If the condition is not handled, the debugger is invoked."
121  #|
122  #+ppc-target
123  (with-pstrs ((pstr (if (stringp condition) condition "Error")))
124    (#_DebugStr pstr))
125  |#
126  (%error condition args (%get-frame-ptr)))
127
128(defun cerror (cont-string condition &rest args)
129  (let* ((fp (%get-frame-ptr)))
130    (restart-case (%error condition (if (condition-p condition) nil args) fp)
131      (continue ()
132                :report (lambda (stream) 
133                            (apply #'format stream cont-string args))
134                nil))))
135
136(defun %error (condition args error-pointer)
137  (setq *error-reentry-count* 0)
138  (setq condition (condition-arg condition args 'simple-error))
139  (signal condition)
140  (unless *interactive-streams-initialized*
141    (bug (format nil "Error during early application initialization:~%
142~a" condition))
143    (#_exit #-windows-target #$EX_SOFTWARE #+windows-target #$EXIT_FAILURE))
144  (application-error *application* condition error-pointer)
145  (application-error
146   *application*
147   (condition-arg "~s returned. It shouldn't.~%If it returns again, I'll throw to toplevel."
148                  '(application-error) 'simple-error)
149   error-pointer)
150  (toplevel))
151
152(defun make-sequence-index-type-error (idx sequence)
153  (let* ((upper (length sequence)))
154    (make-condition 'sequence-index-type-error
155                    :datum idx
156                    :sequence sequence
157                    :expected-type `(integer 0 (,upper)))))
Note: See TracBrowser for help on using the repository browser.