blob: ebce5ddbb338a932b65d6d7e3df9300fcfb00529 [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 Rossum743007d1999-04-21 15:27:31 +000052#ifdef MS_WIN32
53#include "windows.h"
54#include "winbase.h"
55#endif
56
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057void
Guido van Rossuma027efa1997-05-05 20:56:21 +000058PyErr_Restore(type, value, traceback)
59 PyObject *type;
Guido van Rossum373c8691997-04-29 18:22:47 +000060 PyObject *value;
61 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000062{
Guido van Rossum885553e1998-12-21 18:33:30 +000063 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000064 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065
Guido van Rossuma027efa1997-05-05 20:56:21 +000066 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
67 /* XXX Should never happen -- fatal error instead? */
68 Py_DECREF(traceback);
69 traceback = NULL;
70 }
71
72 /* Save these in locals to safeguard against recursive
73 invocation through Py_XDECREF */
74 oldtype = tstate->curexc_type;
75 oldvalue = tstate->curexc_value;
76 oldtraceback = tstate->curexc_traceback;
77
78 tstate->curexc_type = type;
79 tstate->curexc_value = value;
80 tstate->curexc_traceback = traceback;
81
82 Py_XDECREF(oldtype);
83 Py_XDECREF(oldvalue);
84 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000085}
86
87void
Guido van Rossum373c8691997-04-29 18:22:47 +000088PyErr_SetObject(exception, value)
89 PyObject *exception;
90 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091{
Guido van Rossum373c8691997-04-29 18:22:47 +000092 Py_XINCREF(exception);
93 Py_XINCREF(value);
94 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
97void
Guido van Rossum373c8691997-04-29 18:22:47 +000098PyErr_SetNone(exception)
99 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossum373c8691997-04-29 18:22:47 +0000101 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102}
103
104void
Guido van Rossum373c8691997-04-29 18:22:47 +0000105PyErr_SetString(exception, string)
106 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +0000107 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108{
Guido van Rossum373c8691997-04-29 18:22:47 +0000109 PyObject *value = PyString_FromString(string);
110 PyErr_SetObject(exception, value);
111 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112}
113
Guido van Rossum3a241811994-08-29 12:14:12 +0000114
Guido van Rossum373c8691997-04-29 18:22:47 +0000115PyObject *
116PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000118 PyThreadState *tstate = PyThreadState_Get();
119
120 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000123
124int
125PyErr_GivenExceptionMatches(err, exc)
126 PyObject *err, *exc;
127{
128 if (PyTuple_Check(exc)) {
129 int i, n;
130 n = PyTuple_Size(exc);
131 for (i = 0; i < n; i++) {
132 /* Test recursively */
133 if (PyErr_GivenExceptionMatches(
134 err, PyTuple_GET_ITEM(exc, i)))
135 {
136 return 1;
137 }
138 }
139 return 0;
140 }
141 /* err might be an instance, so check its class. */
142 if (PyInstance_Check(err))
143 err = (PyObject*)((PyInstanceObject*)err)->in_class;
144
145 if (PyClass_Check(err) && PyClass_Check(exc))
146 return PyClass_IsSubclass(err, exc);
147
148 return err == exc;
149}
Guido van Rossum743007d1999-04-21 15:27:31 +0000150
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000151
152int
153PyErr_ExceptionMatches(exc)
154 PyObject *exc;
155{
156 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
157}
158
159
160/* Used in many places to normalize a raised exception, including in
161 eval_code2(), do_raise(), and PyErr_Print()
162*/
163void
164PyErr_NormalizeException(exc, val, tb)
165 PyObject **exc;
166 PyObject **val;
167 PyObject **tb;
168{
169 PyObject *type = *exc;
170 PyObject *value = *val;
171 PyObject *inclass = NULL;
172
173 /* If PyErr_SetNone() was used, the value will have been actually
174 set to NULL.
175 */
176 if (!value) {
177 value = Py_None;
178 Py_INCREF(value);
179 }
180
181 if (PyInstance_Check(value))
182 inclass = (PyObject*)((PyInstanceObject*)value)->in_class;
183
184 /* Normalize the exception so that if the type is a class, the
185 value will be an instance.
186 */
187 if (PyClass_Check(type)) {
188 /* if the value was not an instance, or is not an instance
189 whose class is (or is derived from) type, then use the
190 value as an argument to instantiation of the type
191 class.
192 */
193 if (!inclass || !PyClass_IsSubclass(inclass, type)) {
194 PyObject *args, *res;
195
196 if (value == Py_None)
197 args = Py_BuildValue("()");
198 else if (PyTuple_Check(value)) {
199 Py_INCREF(value);
200 args = value;
201 }
202 else
203 args = Py_BuildValue("(O)", value);
204
205 if (args == NULL)
206 goto finally;
207 res = PyEval_CallObject(type, args);
208 Py_DECREF(args);
209 if (res == NULL)
210 goto finally;
211 Py_DECREF(value);
212 value = res;
213 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000214 /* if the class of the instance doesn't exactly match the
215 class of the type, believe the instance
216 */
217 else if (inclass != type) {
218 Py_DECREF(type);
219 type = inclass;
220 Py_INCREF(type);
221 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000222 }
223 *exc = type;
224 *val = value;
225 return;
226finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000227 Py_DECREF(type);
228 Py_DECREF(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000229 Py_XDECREF(*tb);
230 PyErr_Fetch(exc, val, tb);
231 /* normalize recursively */
232 PyErr_NormalizeException(exc, val, tb);
233}
234
235
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237PyErr_Fetch(p_type, p_value, p_traceback)
238 PyObject **p_type;
239 PyObject **p_value;
240 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242 PyThreadState *tstate = PyThreadState_Get();
243
244 *p_type = tstate->curexc_type;
245 *p_value = tstate->curexc_value;
246 *p_traceback = tstate->curexc_traceback;
247
248 tstate->curexc_type = NULL;
249 tstate->curexc_value = NULL;
250 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251}
252
253void
Guido van Rossum373c8691997-04-29 18:22:47 +0000254PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000258
259/* Convenience functions to set a type error exception and return 0 */
260
261int
Guido van Rossum373c8691997-04-29 18:22:47 +0000262PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000263{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000264 PyErr_SetString(PyExc_TypeError,
265 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000266 return 0;
267}
268
Guido van Rossum373c8691997-04-29 18:22:47 +0000269PyObject *
270PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000271{
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000272 /* raise the pre-allocated instance if it still exists */
273 if (PyExc_MemoryErrorInst)
274 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
275 else
276 /* this will probably fail since there's no memory and hee,
277 hee, we have to instantiate this class
278 */
279 PyErr_SetNone(PyExc_MemoryError);
280
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000281 return NULL;
282}
283
Guido van Rossum373c8691997-04-29 18:22:47 +0000284PyObject *
Barry Warsaw97d95151998-07-23 16:05:56 +0000285PyErr_SetFromErrnoWithFilename(exc, filename)
Guido van Rossum373c8691997-04-29 18:22:47 +0000286 PyObject *exc;
Barry Warsaw97d95151998-07-23 16:05:56 +0000287 char *filename;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000288{
Guido van Rossum373c8691997-04-29 18:22:47 +0000289 PyObject *v;
Guido van Rossume0e59821998-10-14 20:38:13 +0000290 char *s;
Guido van Rossum3a241811994-08-29 12:14:12 +0000291 int i = errno;
Guido van Rossum795e1892000-02-17 15:19:15 +0000292#ifdef MS_WIN32
293 char *s_buf = NULL;
294#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +0000295#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000296 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000297 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000298#endif
Guido van Rossume0e59821998-10-14 20:38:13 +0000299 if (i == 0)
300 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000301 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000302#ifndef MS_WIN32
Guido van Rossume0e59821998-10-14 20:38:13 +0000303 s = strerror(i);
Guido van Rossum743007d1999-04-21 15:27:31 +0000304#else
305 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000306 /* Note that the Win32 errors do not lineup with the
307 errno error. So if the error is in the MSVC error
308 table, we use it, otherwise we assume it really _is_
309 a Win32 error code
310 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000311 if (i > 0 && i < _sys_nerr) {
Guido van Rossum795e1892000-02-17 15:19:15 +0000312 s = _sys_errlist[i];
313 }
314 else {
315 int len = FormatMessage(
316 FORMAT_MESSAGE_ALLOCATE_BUFFER |
317 FORMAT_MESSAGE_FROM_SYSTEM |
318 FORMAT_MESSAGE_IGNORE_INSERTS,
319 NULL, /* no message source */
320 i,
321 MAKELANGID(LANG_NEUTRAL,
322 SUBLANG_DEFAULT),
323 /* Default language */
324 (LPTSTR) &s_buf,
325 0, /* size not used */
326 NULL); /* no args */
327 s = s_buf;
328 /* remove trailing cr/lf and dots */
329 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
330 s[--len] = '\0';
331 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000332 }
333#endif
Guido van Rossume0e59821998-10-14 20:38:13 +0000334 if (filename != NULL && Py_UseClassExceptionsFlag)
335 v = Py_BuildValue("(iss)", i, s, filename);
336 else
337 v = Py_BuildValue("(is)", i, s);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000338 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000339 PyErr_SetObject(exc, v);
340 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000341 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000342#ifdef MS_WIN32
Guido van Rossum795e1892000-02-17 15:19:15 +0000343 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000344#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000345 return NULL;
346}
Guido van Rossum743007d1999-04-21 15:27:31 +0000347
Barry Warsaw97d95151998-07-23 16:05:56 +0000348
349PyObject *
350PyErr_SetFromErrno(exc)
351 PyObject *exc;
352{
353 return PyErr_SetFromErrnoWithFilename(exc, NULL);
354}
Guido van Rossum683a0721990-10-21 22:09:12 +0000355
Guido van Rossum795e1892000-02-17 15:19:15 +0000356#ifdef MS_WINDOWS
357/* Windows specific error code handling */
358PyObject *PyErr_SetFromWindowsErrWithFilename(
359 int ierr,
360 const char *filename)
361{
362 int len;
363 char *s;
364 PyObject *v;
365 DWORD err = (DWORD)ierr;
366 if (err==0) err = GetLastError();
367 len = FormatMessage(
368 /* Error API error */
369 FORMAT_MESSAGE_ALLOCATE_BUFFER |
370 FORMAT_MESSAGE_FROM_SYSTEM |
371 FORMAT_MESSAGE_IGNORE_INSERTS,
372 NULL, /* no message source */
373 err,
374 MAKELANGID(LANG_NEUTRAL,
375 SUBLANG_DEFAULT), /* Default language */
376 (LPTSTR) &s,
377 0, /* size not used */
378 NULL); /* no args */
379 /* remove trailing cr/lf and dots */
380 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
381 s[--len] = '\0';
382 if (filename != NULL && Py_UseClassExceptionsFlag)
383 v = Py_BuildValue("(iss)", err, s, filename);
384 else
385 v = Py_BuildValue("(is)", err, s);
386 if (v != NULL) {
Guido van Rossum0b556702000-03-02 13:55:01 +0000387 PyErr_SetObject(PyExc_WindowsError, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000388 Py_DECREF(v);
389 }
390 LocalFree(s);
391 return NULL;
392}
393
394PyObject *PyErr_SetFromWindowsErr(int ierr)
395{
396 return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
397
398}
399#endif /* MS_WINDOWS */
400
Guido van Rossum683a0721990-10-21 22:09:12 +0000401void
Guido van Rossum373c8691997-04-29 18:22:47 +0000402PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000403{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000404 PyErr_SetString(PyExc_SystemError,
405 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000406}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000407
408
409#ifdef HAVE_STDARG_PROTOTYPES
410PyObject *
411PyErr_Format(PyObject *exception, const char *format, ...)
412#else
413PyObject *
414PyErr_Format(exception, format, va_alist)
415 PyObject *exception;
416 const char *format;
417 va_dcl
418#endif
419{
420 va_list vargs;
421 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000422
423#ifdef HAVE_STDARG_PROTOTYPES
424 va_start(vargs, format);
425#else
426 va_start(vargs);
427#endif
428
429 vsprintf(buffer, format, vargs);
430 PyErr_SetString(exception, buffer);
431 return NULL;
432}
Guido van Rossum7617e051997-09-16 18:43:50 +0000433
434
435PyObject *
436PyErr_NewException(name, base, dict)
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000437 char *name; /* modulename.classname */
Guido van Rossum7617e051997-09-16 18:43:50 +0000438 PyObject *base;
439 PyObject *dict;
440{
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000441 char *dot;
442 PyObject *modulename = NULL;
443 PyObject *classname = NULL;
444 PyObject *mydict = NULL;
445 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000446 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000447 dot = strrchr(name, '.');
448 if (dot == NULL) {
449 PyErr_SetString(PyExc_SystemError,
450 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000451 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000452 }
453 if (base == NULL)
454 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000455 if (!PyClass_Check(base)) {
456 /* Must be using string-based standard exceptions (-X) */
457 return PyString_FromString(name);
458 }
459 if (dict == NULL) {
460 dict = mydict = PyDict_New();
461 if (dict == NULL)
462 goto failure;
463 }
464 if (PyDict_GetItemString(dict, "__module__") == NULL) {
465 modulename = PyString_FromStringAndSize(name, (int)(dot-name));
466 if (modulename == NULL)
467 goto failure;
468 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
469 goto failure;
470 }
471 classname = PyString_FromString(dot+1);
472 if (classname == NULL)
Guido van Rossum7617e051997-09-16 18:43:50 +0000473 goto failure;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000474 bases = Py_BuildValue("(O)", base);
475 if (bases == NULL)
476 goto failure;
477 result = PyClass_New(bases, dict, classname);
Guido van Rossum7617e051997-09-16 18:43:50 +0000478 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000479 Py_XDECREF(bases);
480 Py_XDECREF(mydict);
481 Py_XDECREF(classname);
482 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000483 return result;
484}