blob: 4795aafb78547534c9d435ae490b7135fa7a7460 [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 Rossum6976a521997-04-11 19:18:23 +000041#ifndef __MSL__
Guido van Rossume9fbc091995-02-18 14:52:19 +000042/* Replace strerror with a Mac specific routine.
43 XXX PROBLEM: some positive errors have a meaning for MacOS,
44 but some library routines set Unix error numbers...
Jack Jansen8fd2d941994-12-14 12:54:54 +000045*/
Guido van Rossum373c8691997-04-29 18:22:47 +000046extern char *PyMac_StrError Py_PROTO((int));
Jack Jansen5ef86d51995-01-19 12:16:44 +000047#undef strerror
Guido van Rossume9fbc091995-02-18 14:52:19 +000048#define strerror PyMac_StrError
Guido van Rossum6976a521997-04-11 19:18:23 +000049#endif
Guido van Rossume9fbc091995-02-18 14:52:19 +000050#endif /* macintosh */
51
Guido van Rossum53e8d441995-03-09 12:11:31 +000052#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000053#ifndef MS_WINDOWS
Guido van Rossum373c8691997-04-29 18:22:47 +000054extern char *strerror Py_PROTO((int));
Guido van Rossum53e8d441995-03-09 12:11:31 +000055#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000056#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000057
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058void
Guido van Rossuma027efa1997-05-05 20:56:21 +000059PyErr_Restore(type, value, traceback)
60 PyObject *type;
Guido van Rossum373c8691997-04-29 18:22:47 +000061 PyObject *value;
62 PyObject *traceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000063{
Guido van Rossuma027efa1997-05-05 20:56:21 +000064 PyThreadState *tstate = PyThreadState_Get();
65 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066
Guido van Rossuma027efa1997-05-05 20:56:21 +000067 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
68 /* XXX Should never happen -- fatal error instead? */
69 Py_DECREF(traceback);
70 traceback = NULL;
71 }
72
73 /* Save these in locals to safeguard against recursive
74 invocation through Py_XDECREF */
75 oldtype = tstate->curexc_type;
76 oldvalue = tstate->curexc_value;
77 oldtraceback = tstate->curexc_traceback;
78
79 tstate->curexc_type = type;
80 tstate->curexc_value = value;
81 tstate->curexc_traceback = traceback;
82
83 Py_XDECREF(oldtype);
84 Py_XDECREF(oldvalue);
85 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000086}
87
88void
Guido van Rossum373c8691997-04-29 18:22:47 +000089PyErr_SetObject(exception, value)
90 PyObject *exception;
91 PyObject *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
Guido van Rossum373c8691997-04-29 18:22:47 +000093 Py_XINCREF(exception);
94 Py_XINCREF(value);
95 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096}
97
98void
Guido van Rossum373c8691997-04-29 18:22:47 +000099PyErr_SetNone(exception)
100 PyObject *exception;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
Guido van Rossum373c8691997-04-29 18:22:47 +0000102 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103}
104
105void
Guido van Rossum373c8691997-04-29 18:22:47 +0000106PyErr_SetString(exception, string)
107 PyObject *exception;
Guido van Rossum067998f1996-12-10 15:33:34 +0000108 const char *string;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109{
Guido van Rossum373c8691997-04-29 18:22:47 +0000110 PyObject *value = PyString_FromString(string);
111 PyErr_SetObject(exception, value);
112 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113}
114
Guido van Rossum3a241811994-08-29 12:14:12 +0000115
Guido van Rossum373c8691997-04-29 18:22:47 +0000116PyObject *
117PyErr_Occurred()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119 PyThreadState *tstate = PyThreadState_Get();
120
121 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122}
123
124void
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125PyErr_Fetch(p_type, p_value, p_traceback)
126 PyObject **p_type;
127 PyObject **p_value;
128 PyObject **p_traceback;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130 PyThreadState *tstate = PyThreadState_Get();
131
132 *p_type = tstate->curexc_type;
133 *p_value = tstate->curexc_value;
134 *p_traceback = tstate->curexc_traceback;
135
136 tstate->curexc_type = NULL;
137 tstate->curexc_value = NULL;
138 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139}
140
141void
Guido van Rossum373c8691997-04-29 18:22:47 +0000142PyErr_Clear()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000144 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000146
147/* Convenience functions to set a type error exception and return 0 */
148
149int
Guido van Rossum373c8691997-04-29 18:22:47 +0000150PyErr_BadArgument()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000151{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152 PyErr_SetString(PyExc_TypeError,
153 "illegal argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000154 return 0;
155}
156
Guido van Rossum373c8691997-04-29 18:22:47 +0000157PyObject *
158PyErr_NoMemory()
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000159{
Guido van Rossum373c8691997-04-29 18:22:47 +0000160 PyErr_SetNone(PyExc_MemoryError);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000161 return NULL;
162}
163
Guido van Rossum373c8691997-04-29 18:22:47 +0000164PyObject *
165PyErr_SetFromErrno(exc)
166 PyObject *exc;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000167{
Guido van Rossum373c8691997-04-29 18:22:47 +0000168 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000169 int i = errno;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000170#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000171 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000172 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000173#endif
Guido van Rossum373c8691997-04-29 18:22:47 +0000174 v = Py_BuildValue("(is)", i, strerror(i));
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000175 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000176 PyErr_SetObject(exc, v);
177 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000178 }
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000179 return NULL;
180}
Guido van Rossum683a0721990-10-21 22:09:12 +0000181
182void
Guido van Rossum373c8691997-04-29 18:22:47 +0000183PyErr_BadInternalCall()
Guido van Rossum683a0721990-10-21 22:09:12 +0000184{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000185 PyErr_SetString(PyExc_SystemError,
186 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000187}
Guido van Rossum1548bac1997-02-14 17:09:47 +0000188
189
190#ifdef HAVE_STDARG_PROTOTYPES
191PyObject *
192PyErr_Format(PyObject *exception, const char *format, ...)
193#else
194PyObject *
195PyErr_Format(exception, format, va_alist)
196 PyObject *exception;
197 const char *format;
198 va_dcl
199#endif
200{
201 va_list vargs;
202 char buffer[500]; /* Caller is responsible for limiting the format */
Guido van Rossum1548bac1997-02-14 17:09:47 +0000203
204#ifdef HAVE_STDARG_PROTOTYPES
205 va_start(vargs, format);
206#else
207 va_start(vargs);
208#endif
209
210 vsprintf(buffer, format, vargs);
211 PyErr_SetString(exception, buffer);
212 return NULL;
213}