blob: 6109387cfb97e3026166ba18f67637ea5a30b08d [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
118void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119PyErr_Fetch(p_type, p_value, p_traceback)
120 PyObject **p_type;
121 PyObject **p_value;
122 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 PyThreadState *tstate = PyThreadState_Get();
125
126 *p_type = tstate->curexc_type;
127 *p_value = tstate->curexc_value;
128 *p_traceback = tstate->curexc_traceback;
129
130 tstate->curexc_type = NULL;
131 tstate->curexc_value = NULL;
132 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133}
134
135void
Guido van Rossum373c8691997-04-29 18:22:47 +0000136PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000140
141/* Convenience functions to set a type error exception and return 0 */
142
143int
Guido van Rossum373c8691997-04-29 18:22:47 +0000144PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000145{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PyErr_SetString(PyExc_TypeError,
147 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000148 return 0;
149}
150
Guido van Rossum373c8691997-04-29 18:22:47 +0000151PyObject *
152PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000153{
Guido van Rossum373c8691997-04-29 18:22:47 +0000154 PyErr_SetNone(PyExc_MemoryError);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000155 return NULL;
156}
157
Guido van Rossum373c8691997-04-29 18:22:47 +0000158PyObject *
159PyErr_SetFromErrno(exc)
160 PyObject *exc;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000161{
Guido van Rossum373c8691997-04-29 18:22:47 +0000162 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000163 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000164#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000165 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000166 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000167#endif
Guido van Rossum373c8691997-04-29 18:22:47 +0000168 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000169 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000170 PyErr_SetObject(exc, v);
171 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000172 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000173 return NULL;
174}
Guido van Rossum683a0721990-10-21 22:09:12 +0000175
176void
Guido van Rossum373c8691997-04-29 18:22:47 +0000177PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000178{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000179 PyErr_SetString(PyExc_SystemError,
180 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000181}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000182
183
184#ifdef HAVE_STDARG_PROTOTYPES
185PyObject *
186PyErr_Format(PyObject *exception, const char *format, ...)
187#else
188PyObject *
189PyErr_Format(exception, format, va_alist)
190 PyObject *exception;
191 const char *format;
192 va_dcl
193#endif
194{
195 va_list vargs;
196 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000197
198#ifdef HAVE_STDARG_PROTOTYPES
199 va_start(vargs, format);
200#else
201 va_start(vargs);
202#endif
203
204 vsprintf(buffer, format, vargs);
205 PyErr_SetString(exception, buffer);
206 return NULL;
207}