blob: c0efbf1b2657dee61b2cbfaeb950e3868623b97b [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:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000222 Py_DECREF(type);
223 Py_DECREF(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000224 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 *
Barry Warsaw97d95151998-07-23 16:05:56 +0000280PyErr_SetFromErrnoWithFilename(exc, filename)
Guido van Rossum373c8691997-04-29 18:22:47 +0000281 PyObject *exc;
Barry Warsaw97d95151998-07-23 16:05:56 +0000282 char *filename;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000283{
Guido van Rossum373c8691997-04-29 18:22:47 +0000284 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000285 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000286#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000287 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000288 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000289#endif
Barry Warsaw97d95151998-07-23 16:05:56 +0000290 if (filename != NULL && Py_UseClassExceptionsFlag)
291 v = Py_BuildValue("(iss)", i, strerror(i), filename);
292 else
293 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000294 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000295 PyErr_SetObject(exc, v);
296 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000297 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000298 return NULL;
299}
Barry Warsaw97d95151998-07-23 16:05:56 +0000300
301
302PyObject *
303PyErr_SetFromErrno(exc)
304 PyObject *exc;
305{
306 return PyErr_SetFromErrnoWithFilename(exc, NULL);
307}
Guido van Rossum683a0721990-10-21 22:09:12 +0000308
309void
Guido van Rossum373c8691997-04-29 18:22:47 +0000310PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000311{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000312 PyErr_SetString(PyExc_SystemError,
313 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000314}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000315
316
317#ifdef HAVE_STDARG_PROTOTYPES
318PyObject *
319PyErr_Format(PyObject *exception, const char *format, ...)
320#else
321PyObject *
322PyErr_Format(exception, format, va_alist)
323 PyObject *exception;
324 const char *format;
325 va_dcl
326#endif
327{
328 va_list vargs;
329 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000330
331#ifdef HAVE_STDARG_PROTOTYPES
332 va_start(vargs, format);
333#else
334 va_start(vargs);
335#endif
336
337 vsprintf(buffer, format, vargs);
338 PyErr_SetString(exception, buffer);
339 return NULL;
340}
Guido van Rossum7617e051997-09-16 18:43:50 +0000341
342
343PyObject *
344PyErr_NewException(name, base, dict)
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000345 char *name; /* modulename.classname */
Guido van Rossum7617e051997-09-16 18:43:50 +0000346 PyObject *base;
347 PyObject *dict;
348{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000349 char *dot;
350 PyObject *modulename = NULL;
351 PyObject *classname = NULL;
352 PyObject *mydict = NULL;
353 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000354 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000355 dot = strrchr(name, '.');
356 if (dot == NULL) {
357 PyErr_SetString(PyExc_SystemError,
358 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000359 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000360 }
361 if (base == NULL)
362 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000363 if (!PyClass_Check(base)) {
364 /* Must be using string-based standard exceptions (-X) */
365 return PyString_FromString(name);
366 }
367 if (dict == NULL) {
368 dict = mydict = PyDict_New();
369 if (dict == NULL)
370 goto failure;
371 }
372 if (PyDict_GetItemString(dict, "__module__") == NULL) {
373 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
374 if (modulename == NULL)
375 goto failure;
376 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
377 goto failure;
378 }
379 classname = PyString_FromString(dot+1);
380 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000381 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000382 bases = Py_BuildValue("(O)", base);
383 if (bases == NULL)
384 goto failure;
385 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000386 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000387 Py_XDECREF(bases);
388 Py_XDECREF(mydict);
389 Py_XDECREF(classname);
390 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000391 return result;
392}