blob: 91c543d0fa7582d4272c2e8139749d95a1531cc7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum373c8691997-04-29 18:22:47 +000032/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossum373c8691997-04-29 18:22:47 +000034#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000035
Jack Janseneceb3e31995-06-27 13:15:15 +000036#ifdef SYMANTEC__CFM68K__
Guido van Rossume9fbc091995-02-18 14:52:19 +000037#pragma lib_export on
38#endif
39
Jack Jansen8fd2d941994-12-14 12:54:54 +000040#ifdef macintosh
Guido van Rossum373c8691997-04-29 18:22:47 +000041extern char *PyMac_StrError Py_PROTO((int));
Jack Jansen5ef86d51995-01-19 12:16:44 +000042#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +000043#define strerror PyMac_StrError
44#endif /* macintosh */
45
Guido van Rossum53e8d441995-03-09 12:11:31 +000046#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000047#ifndef MS_WINDOWS
Guido van Rossum373c8691997-04-29 18:22:47 +000048extern char *strerror Py_PROTO((int));
Guido van Rossum53e8d441995-03-09 12:11:31 +000049#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000050#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000051
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052void
Guido van Rossuma027efa1997-05-05 20:56:21 +000053PyErr_Restore(type, value, traceback)
54 PyObject *type;
Guido van Rossum373c8691997-04-29 18:22:47 +000055 PyObject *value;
56 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057{
Guido van Rossuma027efa1997-05-05 20:56:21 +000058 PyThreadState *tstate = PyThreadState_Get();
59 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060
Guido van Rossuma027efa1997-05-05 20:56:21 +000061 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
62 /* XXX Should never happen -- fatal error instead? */
63 Py_DECREF(traceback);
64 traceback = NULL;
65 }
66
67 /* Save these in locals to safeguard against recursive
68 invocation through Py_XDECREF */
69 oldtype = tstate->curexc_type;
70 oldvalue = tstate->curexc_value;
71 oldtraceback = tstate->curexc_traceback;
72
73 tstate->curexc_type = type;
74 tstate->curexc_value = value;
75 tstate->curexc_traceback = traceback;
76
77 Py_XDECREF(oldtype);
78 Py_XDECREF(oldvalue);
79 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000080}
81
82void
Guido van Rossum373c8691997-04-29 18:22:47 +000083PyErr_SetObject(exception, value)
84 PyObject *exception;
85 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossum373c8691997-04-29 18:22:47 +000087 Py_XINCREF(exception);
88 Py_XINCREF(value);
89 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
92void
Guido van Rossum373c8691997-04-29 18:22:47 +000093PyErr_SetNone(exception)
94 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095{
Guido van Rossum373c8691997-04-29 18:22:47 +000096 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
99void
Guido van Rossum373c8691997-04-29 18:22:47 +0000100PyErr_SetString(exception, string)
101 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +0000102 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Guido van Rossum373c8691997-04-29 18:22:47 +0000104 PyObject *value = PyString_FromString(string);
105 PyErr_SetObject(exception, value);
106 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
Guido van Rossum3a241811994-08-29 12:14:12 +0000109
Guido van Rossum373c8691997-04-29 18:22:47 +0000110PyObject *
111PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 PyThreadState *tstate = PyThreadState_Get();
114
115 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116}
117
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000118
119int
120PyErr_GivenExceptionMatches(err, exc)
121 PyObject *err, *exc;
122{
123 if (PyTuple_Check(exc)) {
124 int i, n;
125 n = PyTuple_Size(exc);
126 for (i = 0; i < n; i++) {
127 /* Test recursively */
128 if (PyErr_GivenExceptionMatches(
129 err, PyTuple_GET_ITEM(exc, i)))
130 {
131 return 1;
132 }
133 }
134 return 0;
135 }
136 /* err might be an instance, so check its class. */
137 if (PyInstance_Check(err))
138 err = (PyObject*)((PyInstanceObject*)err)->in_class;
139
140 if (PyClass_Check(err) && PyClass_Check(exc))
141 return PyClass_IsSubclass(err, exc);
142
143 return err == exc;
144}
145
146
147int
148PyErr_ExceptionMatches(exc)
149 PyObject *exc;
150{
151 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
152}
153
154
155/* Used in many places to normalize a raised exception, including in
156 eval_code2(), do_raise(), and PyErr_Print()
157*/
158void
159PyErr_NormalizeException(exc, val, tb)
160 PyObject **exc;
161 PyObject **val;
162 PyObject **tb;
163{
164 PyObject *type = *exc;
165 PyObject *value = *val;
166 PyObject *inclass = NULL;
167
168 /* If PyErr_SetNone() was used, the value will have been actually
169 set to NULL.
170 */
171 if (!value) {
172 value = Py_None;
173 Py_INCREF(value);
174 }
175
176 if (PyInstance_Check(value))
177 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
178
179 /* Normalize the exception so that if the type is a class, the
180 value will be an instance.
181 */
182 if (PyClass_Check(type)) {
183 /* if the value was not an instance, or is not an instance
184 whose class is (or is derived from) type, then use the
185 value as an argument to instantiation of the type
186 class.
187 */
188 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
189 PyObject *args, *res;
190
191 if (value == Py_None)
192 args = Py_BuildValue("()");
193 else if (PyTuple_Check(value)) {
194 Py_INCREF(value);
195 args = value;
196 }
197 else
198 args = Py_BuildValue("(O)", value);
199
200 if (args == NULL)
201 goto finally;
202 res = PyEval_CallObject(type, args);
203 Py_DECREF(args);
204 if (res == NULL)
205 goto finally;
206 Py_DECREF(value);
207 value = res;
208 }
209 }
210 *exc = type;
211 *val = value;
212 return;
213finally:
214 Py_DECREF(*exc);
215 Py_DECREF(*val);
216 Py_XDECREF(*tb);
217 PyErr_Fetch(exc, val, tb);
218 /* normalize recursively */
219 PyErr_NormalizeException(exc, val, tb);
220}
221
222
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000224PyErr_Fetch(p_type, p_value, p_traceback)
225 PyObject **p_type;
226 PyObject **p_value;
227 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 PyThreadState *tstate = PyThreadState_Get();
230
231 *p_type = tstate->curexc_type;
232 *p_value = tstate->curexc_value;
233 *p_traceback = tstate->curexc_traceback;
234
235 tstate->curexc_type = NULL;
236 tstate->curexc_value = NULL;
237 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238}
239
240void
Guido van Rossum373c8691997-04-29 18:22:47 +0000241PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000245
246/* Convenience functions to set a type error exception and return 0 */
247
248int
Guido van Rossum373c8691997-04-29 18:22:47 +0000249PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000250{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000251 PyErr_SetString(PyExc_TypeError,
252 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000253 return 0;
254}
255
Guido van Rossum373c8691997-04-29 18:22:47 +0000256PyObject *
257PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000258{
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000259 /* raise the pre-allocated instance if it still exists */
260 if (PyExc_MemoryErrorInst)
261 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
262 else
263 /* this will probably fail since there's no memory and hee,
264 hee, we have to instantiate this class
265 */
266 PyErr_SetNone(PyExc_MemoryError);
267
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000268 return NULL;
269}
270
Guido van Rossum373c8691997-04-29 18:22:47 +0000271PyObject *
272PyErr_SetFromErrno(exc)
273 PyObject *exc;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000274{
Guido van Rossum373c8691997-04-29 18:22:47 +0000275 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000276 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000277#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000278 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000279 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000280#endif
Guido van Rossum373c8691997-04-29 18:22:47 +0000281 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000282 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000283 PyErr_SetObject(exc, v);
284 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000285 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000286 return NULL;
287}
Guido van Rossum683a0721990-10-21 22:09:12 +0000288
289void
Guido van Rossum373c8691997-04-29 18:22:47 +0000290PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000291{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000292 PyErr_SetString(PyExc_SystemError,
293 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000294}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000295
296
297#ifdef HAVE_STDARG_PROTOTYPES
298PyObject *
299PyErr_Format(PyObject *exception, const char *format, ...)
300#else
301PyObject *
302PyErr_Format(exception, format, va_alist)
303 PyObject *exception;
304 const char *format;
305 va_dcl
306#endif
307{
308 va_list vargs;
309 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000310
311#ifdef HAVE_STDARG_PROTOTYPES
312 va_start(vargs, format);
313#else
314 va_start(vargs);
315#endif
316
317 vsprintf(buffer, format, vargs);
318 PyErr_SetString(exception, buffer);
319 return NULL;
320}