blob: 7b8c03f21e0f1aadb5259482f68a72dff21052de [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 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000209 /* if the class of the instance doesn't exactly match the
210 class of the type, believe the instance
211 */
212 else if (inclass != type) {
213 Py_DECREF(type);
214 type = inclass;
215 Py_INCREF(type);
216 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000217 }
218 *exc = type;
219 *val = value;
220 return;
221finally:
222 Py_DECREF(*exc);
223 Py_DECREF(*val);
224 Py_XDECREF(*tb);
225 PyErr_Fetch(exc, val, tb);
226 /* normalize recursively */
227 PyErr_NormalizeException(exc, val, tb);
228}
229
230
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000232PyErr_Fetch(p_type, p_value, p_traceback)
233 PyObject **p_type;
234 PyObject **p_value;
235 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237 PyThreadState *tstate = PyThreadState_Get();
238
239 *p_type = tstate->curexc_type;
240 *p_value = tstate->curexc_value;
241 *p_traceback = tstate->curexc_traceback;
242
243 tstate->curexc_type = NULL;
244 tstate->curexc_value = NULL;
245 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
247
248void
Guido van Rossum373c8691997-04-29 18:22:47 +0000249PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000251 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000253
254/* Convenience functions to set a type error exception and return 0 */
255
256int
Guido van Rossum373c8691997-04-29 18:22:47 +0000257PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000258{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000259 PyErr_SetString(PyExc_TypeError,
260 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000261 return 0;
262}
263
Guido van Rossum373c8691997-04-29 18:22:47 +0000264PyObject *
265PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000266{
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000267 /* raise the pre-allocated instance if it still exists */
268 if (PyExc_MemoryErrorInst)
269 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
270 else
271 /* this will probably fail since there's no memory and hee,
272 hee, we have to instantiate this class
273 */
274 PyErr_SetNone(PyExc_MemoryError);
275
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000276 return NULL;
277}
278
Guido van Rossum373c8691997-04-29 18:22:47 +0000279PyObject *
280PyErr_SetFromErrno(exc)
281 PyObject *exc;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000282{
Guido van Rossum373c8691997-04-29 18:22:47 +0000283 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000284 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000285#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000286 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000287 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000288#endif
Guido van Rossum373c8691997-04-29 18:22:47 +0000289 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000290 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000291 PyErr_SetObject(exc, v);
292 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000293 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000294 return NULL;
295}
Guido van Rossum683a0721990-10-21 22:09:12 +0000296
297void
Guido van Rossum373c8691997-04-29 18:22:47 +0000298PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000299{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000300 PyErr_SetString(PyExc_SystemError,
301 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000302}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000303
304
305#ifdef HAVE_STDARG_PROTOTYPES
306PyObject *
307PyErr_Format(PyObject *exception, const char *format, ...)
308#else
309PyObject *
310PyErr_Format(exception, format, va_alist)
311 PyObject *exception;
312 const char *format;
313 va_dcl
314#endif
315{
316 va_list vargs;
317 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000318
319#ifdef HAVE_STDARG_PROTOTYPES
320 va_start(vargs, format);
321#else
322 va_start(vargs);
323#endif
324
325 vsprintf(buffer, format, vargs);
326 PyErr_SetString(exception, buffer);
327 return NULL;
328}
Guido van Rossum7617e051997-09-16 18:43:50 +0000329
330
331PyObject *
332PyErr_NewException(name, base, dict)
333 char *name;
334 PyObject *base;
335 PyObject *dict;
336{
337 PyObject *nname = PyString_InternFromString(name);
338 PyObject *ndict = NULL;
339 PyObject *nbases = NULL;
340 PyObject *result = NULL;
341 if (nname == NULL)
342 return NULL;
343 if (dict == NULL) {
344 dict = ndict = PyDict_New();
345 if (dict == NULL)
346 goto failure;
347 }
348 if (base == NULL)
349 base = PyExc_Exception;
350 nbases = Py_BuildValue("(O)", base);
351 if (nbases == NULL)
352 goto failure;
353 result = PyClass_New(nbases, dict, nname);
354 failure:
355 Py_XDECREF(nbases);
356 Py_XDECREF(ndict);
357 Py_XDECREF(nname);
358 return result;
359}