blob: 89021aadd6b1a97f4a480b1d37c972e90c9b343c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum373c8691997-04-29 18:22:47 +00002/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossum373c8691997-04-29 18:22:47 +00004#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00005
Guido van Rossum53e8d441995-03-09 12:11:31 +00006#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +00007#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +00008extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +00009#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000010#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000011
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000012#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000013#include <windows.h>
14#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000015#endif
16
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000017#include <ctype.h>
18
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000019#ifdef __cplusplus
20extern "C" {
21#endif
22
23
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000025PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 PyThreadState *tstate = PyThreadState_GET();
28 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */
32 /* Well, it could be None. */
33 Py_DECREF(traceback);
34 traceback = NULL;
35 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 /* Save these in locals to safeguard against recursive
38 invocation through Py_XDECREF */
39 oldtype = tstate->curexc_type;
40 oldvalue = tstate->curexc_value;
41 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 tstate->curexc_type = type;
44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 Py_XDECREF(oldtype);
48 Py_XDECREF(oldvalue);
49 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050}
51
52void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000053PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 PyThreadState *tstate = PyThreadState_GET();
56 PyObject *exc_value;
57 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 if (exception != NULL &&
60 !PyExceptionClass_Check(exception)) {
61 PyErr_Format(PyExc_SystemError,
62 "exception %R not a BaseException subclass",
63 exception);
64 return;
65 }
66 Py_XINCREF(value);
67 exc_value = tstate->exc_value;
68 if (exc_value != NULL && exc_value != Py_None) {
69 /* Implicit exception chaining */
70 Py_INCREF(exc_value);
71 if (value == NULL || !PyExceptionInstance_Check(value)) {
72 /* We must normalize the value right now */
73 PyObject *args, *fixed_value;
74 if (value == NULL || value == Py_None)
75 args = PyTuple_New(0);
76 else if (PyTuple_Check(value)) {
77 Py_INCREF(value);
78 args = value;
79 }
80 else
81 args = PyTuple_Pack(1, value);
82 fixed_value = args ?
83 PyEval_CallObject(exception, args) : NULL;
84 Py_XDECREF(args);
85 Py_XDECREF(value);
86 if (fixed_value == NULL)
87 return;
88 value = fixed_value;
89 }
90 /* Avoid reference cycles through the context chain.
91 This is O(chain length) but context chains are
92 usually very short. Sensitive readers may try
93 to inline the call to PyException_GetContext. */
94 if (exc_value != value) {
95 PyObject *o = exc_value, *context;
96 while ((context = PyException_GetContext(o))) {
97 Py_DECREF(context);
98 if (context == value) {
99 PyException_SetContext(o, NULL);
100 break;
101 }
102 o = context;
103 }
104 PyException_SetContext(value, exc_value);
105 } else {
106 Py_DECREF(exc_value);
107 }
108 }
109 if (value != NULL && PyExceptionInstance_Check(value))
110 tb = PyException_GetTraceback(value);
111 Py_XINCREF(exception);
112 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113}
114
115void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119}
120
121void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 PyObject *value = PyUnicode_FromString(string);
125 PyErr_SetObject(exception, value);
126 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
Guido van Rossum3a241811994-08-29 12:14:12 +0000129
Guido van Rossum373c8691997-04-29 18:22:47 +0000130PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000133 /* If there is no thread state, PyThreadState_GET calls
134 Py_FatalError, which calls PyErr_Occurred. To avoid the
135 resulting infinite loop, we inline PyThreadState_GET here and
136 treat no thread as no error. */
137 PyThreadState *tstate =
138 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000140 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000143
144int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000145PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (err == NULL || exc == NULL) {
148 /* maybe caused by "import exceptions" that failed early on */
149 return 0;
150 }
151 if (PyTuple_Check(exc)) {
152 Py_ssize_t i, n;
153 n = PyTuple_Size(exc);
154 for (i = 0; i < n; i++) {
155 /* Test recursively */
156 if (PyErr_GivenExceptionMatches(
157 err, PyTuple_GET_ITEM(exc, i)))
158 {
159 return 1;
160 }
161 }
162 return 0;
163 }
164 /* err might be an instance, so check its class. */
165 if (PyExceptionInstance_Check(err))
166 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
169 int res = 0;
170 PyObject *exception, *value, *tb;
171 PyErr_Fetch(&exception, &value, &tb);
172 /* PyObject_IsSubclass() can recurse and therefore is
173 not safe (see test_bad_getattr in test.pickletester). */
174 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
175 /* This function must not fail, so print the error here */
176 if (res == -1) {
177 PyErr_WriteUnraisable(err);
178 res = 0;
179 }
180 PyErr_Restore(exception, value, tb);
181 return res;
182 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000185}
Guido van Rossum743007d1999-04-21 15:27:31 +0000186
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000187
188int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000192}
193
194
195/* Used in many places to normalize a raised exception, including in
196 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000197
198 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000200*/
201void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000202PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyObject *type = *exc;
205 PyObject *value = *val;
206 PyObject *inclass = NULL;
207 PyObject *initial_tb = NULL;
208 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (type == NULL) {
211 /* There was no exception, so nothing to do. */
212 return;
213 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 /* If PyErr_SetNone() was used, the value will have been actually
216 set to NULL.
217 */
218 if (!value) {
219 value = Py_None;
220 Py_INCREF(value);
221 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (PyExceptionInstance_Check(value))
224 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 /* Normalize the exception so that if the type is a class, the
227 value will be an instance.
228 */
229 if (PyExceptionClass_Check(type)) {
230 /* if the value was not an instance, or is not an instance
231 whose class is (or is derived from) type, then use the
232 value as an argument to instantiation of the type
233 class.
234 */
235 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
236 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (value == Py_None)
239 args = PyTuple_New(0);
240 else if (PyTuple_Check(value)) {
241 Py_INCREF(value);
242 args = value;
243 }
244 else
245 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 if (args == NULL)
248 goto finally;
249 res = PyEval_CallObject(type, args);
250 Py_DECREF(args);
251 if (res == NULL)
252 goto finally;
253 Py_DECREF(value);
254 value = res;
255 }
256 /* if the class of the instance doesn't exactly match the
257 class of the type, believe the instance
258 */
259 else if (inclass != type) {
260 Py_DECREF(type);
261 type = inclass;
262 Py_INCREF(type);
263 }
264 }
265 *exc = type;
266 *val = value;
267 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000268finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 Py_DECREF(type);
270 Py_DECREF(value);
271 /* If the new exception doesn't set a traceback and the old
272 exception had a traceback, use the old traceback for the
273 new exception. It's better than nothing.
274 */
275 initial_tb = *tb;
276 PyErr_Fetch(exc, val, tb);
277 if (initial_tb != NULL) {
278 if (*tb == NULL)
279 *tb = initial_tb;
280 else
281 Py_DECREF(initial_tb);
282 }
283 /* normalize recursively */
284 tstate = PyThreadState_GET();
285 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
286 --tstate->recursion_depth;
287 /* throw away the old exception... */
288 Py_DECREF(*exc);
289 Py_DECREF(*val);
290 /* ... and use the recursion error instead */
291 *exc = PyExc_RuntimeError;
292 *val = PyExc_RecursionErrorInst;
293 Py_INCREF(*exc);
294 Py_INCREF(*val);
295 /* just keeping the old traceback */
296 return;
297 }
298 PyErr_NormalizeException(exc, val, tb);
299 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000300}
301
302
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 *p_type = tstate->curexc_type;
309 *p_value = tstate->curexc_value;
310 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 tstate->curexc_type = NULL;
313 tstate->curexc_value = NULL;
314 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
317void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000318PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000322
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200323void
324PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
325{
326 PyThreadState *tstate = PyThreadState_GET();
327
328 *p_type = tstate->exc_type;
329 *p_value = tstate->exc_value;
330 *p_traceback = tstate->exc_traceback;
331
332 Py_XINCREF(*p_type);
333 Py_XINCREF(*p_value);
334 Py_XINCREF(*p_traceback);
335}
336
337void
338PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
339{
340 PyObject *oldtype, *oldvalue, *oldtraceback;
341 PyThreadState *tstate = PyThreadState_GET();
342
343 oldtype = tstate->exc_type;
344 oldvalue = tstate->exc_value;
345 oldtraceback = tstate->exc_traceback;
346
347 tstate->exc_type = p_type;
348 tstate->exc_value = p_value;
349 tstate->exc_traceback = p_traceback;
350
351 Py_XDECREF(oldtype);
352 Py_XDECREF(oldvalue);
353 Py_XDECREF(oldtraceback);
354}
355
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000356/* Convenience functions to set a type error exception and return 0 */
357
358int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000359PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 PyErr_SetString(PyExc_TypeError,
362 "bad argument type for built-in operation");
363 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000364}
365
Guido van Rossum373c8691997-04-29 18:22:47 +0000366PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000367PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000368{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000369 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000371}
372
Guido van Rossum373c8691997-04-29 18:22:47 +0000373PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000374PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200377 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100379#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000381#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000382
Guido van Rossume9fbc091995-02-18 14:52:19 +0000383#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (i == EINTR && PyErr_CheckSignals())
385 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000386#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000387
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000388#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100389 if (i != 0) {
390 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100391 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100392 }
393 else {
394 /* Sometimes errno didn't get set */
395 message = PyUnicode_FromString("Error");
396 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000397#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (i == 0)
399 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
400 else
401 {
402 /* Note that the Win32 errors do not lineup with the
403 errno error. So if the error is in the MSVC error
404 table, we use it, otherwise we assume it really _is_
405 a Win32 error code
406 */
407 if (i > 0 && i < _sys_nerr) {
408 message = PyUnicode_FromString(_sys_errlist[i]);
409 }
410 else {
411 int len = FormatMessageW(
412 FORMAT_MESSAGE_ALLOCATE_BUFFER |
413 FORMAT_MESSAGE_FROM_SYSTEM |
414 FORMAT_MESSAGE_IGNORE_INSERTS,
415 NULL, /* no message source */
416 i,
417 MAKELANGID(LANG_NEUTRAL,
418 SUBLANG_DEFAULT),
419 /* Default language */
420 (LPWSTR) &s_buf,
421 0, /* size not used */
422 NULL); /* no args */
423 if (len==0) {
424 /* Only ever seen this in out-of-mem
425 situations */
426 s_buf = NULL;
427 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
428 } else {
429 /* remove trailing cr/lf and dots */
430 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
431 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200432 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 }
434 }
435 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000436#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 if (message == NULL)
439 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000440#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 return NULL;
444 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 if (filenameObject != NULL)
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200447 args = Py_BuildValue("(iOO)", i, message, filenameObject);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 else
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200449 args = Py_BuildValue("(iO)", i, message);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000451
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200452 if (args != NULL) {
453 v = PyObject_Call(exc, args, NULL);
454 Py_DECREF(args);
455 if (v != NULL) {
456 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
457 Py_DECREF(v);
458 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000460#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000464}
Guido van Rossum743007d1999-04-21 15:27:31 +0000465
Barry Warsaw97d95151998-07-23 16:05:56 +0000466
467PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000468PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
471 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
472 Py_XDECREF(name);
473 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000474}
475
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000476#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000477PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000478PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 PyObject *name = filename ?
481 PyUnicode_FromUnicode(filename, wcslen(filename)) :
482 NULL;
483 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
484 Py_XDECREF(name);
485 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000486}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000487#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000488
489PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000490PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000493}
Guido van Rossum683a0721990-10-21 22:09:12 +0000494
Brett Cannonbf364092006-03-01 04:25:17 +0000495#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000496/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000497PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 PyObject *exc,
499 int ierr,
500 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 int len;
503 WCHAR *s_buf = NULL; /* Free via LocalFree */
504 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200505 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 DWORD err = (DWORD)ierr;
507 if (err==0) err = GetLastError();
508 len = FormatMessageW(
509 /* Error API error */
510 FORMAT_MESSAGE_ALLOCATE_BUFFER |
511 FORMAT_MESSAGE_FROM_SYSTEM |
512 FORMAT_MESSAGE_IGNORE_INSERTS,
513 NULL, /* no message source */
514 err,
515 MAKELANGID(LANG_NEUTRAL,
516 SUBLANG_DEFAULT), /* Default language */
517 (LPWSTR) &s_buf,
518 0, /* size not used */
519 NULL); /* no args */
520 if (len==0) {
521 /* Only seen this in out of mem situations */
522 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
523 s_buf = NULL;
524 } else {
525 /* remove trailing cr/lf and dots */
526 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
527 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200528 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (message == NULL)
532 {
533 LocalFree(s_buf);
534 return NULL;
535 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000536
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200537 if (filenameObject == NULL)
538 filenameObject = Py_None;
539 /* This is the constructor signature for passing a Windows error code.
540 The POSIX translation will be figured out by the constructor. */
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200541 args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000543
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200544 if (args != NULL) {
545 v = PyObject_Call(exc, args, NULL);
546 Py_DECREF(args);
547 if (v != NULL) {
548 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
549 Py_DECREF(v);
550 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 }
552 LocalFree(s_buf);
553 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000554}
555
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000556PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 PyObject *exc,
558 int ierr,
559 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000560{
Victor Stinner92be9392010-12-28 00:28:21 +0000561 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
563 ierr,
564 name);
565 Py_XDECREF(name);
566 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000567}
568
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000569PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 PyObject *exc,
571 int ierr,
572 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *name = filename ?
575 PyUnicode_FromUnicode(filename, wcslen(filename)) :
576 NULL;
577 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
578 ierr,
579 name);
580 Py_XDECREF(name);
581 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000582}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000583
Thomas Heller085358a2002-07-29 14:27:41 +0000584PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000587}
588
Guido van Rossum795e1892000-02-17 15:19:15 +0000589PyObject *PyErr_SetFromWindowsErr(int ierr)
590{
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200591 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000593}
594PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 int ierr,
596 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000597{
Victor Stinner92be9392010-12-28 00:28:21 +0000598 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200600 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 ierr, name);
602 Py_XDECREF(name);
603 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000604}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000605
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000606PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 int ierr,
608 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 PyObject *name = filename ?
611 PyUnicode_FromUnicode(filename, wcslen(filename)) :
612 NULL;
613 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200614 PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 ierr, name);
616 Py_XDECREF(name);
617 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000618}
Guido van Rossum795e1892000-02-17 15:19:15 +0000619#endif /* MS_WINDOWS */
620
Brett Cannon79ec55e2012-04-12 20:24:54 -0400621PyObject *
Brett Cannon8f5ac512013-06-12 23:29:18 -0400622PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
623 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400624{
Brett Cannon8f5ac512013-06-12 23:29:18 -0400625 int issubclass;
Brian Curtin09b86d12012-04-17 16:57:09 -0500626 PyObject *args, *kwargs, *error;
627
Brett Cannon8f5ac512013-06-12 23:29:18 -0400628 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
629 if (issubclass < 0) {
Brian Curtin94c001b2012-04-18 08:30:51 -0500630 return NULL;
Brett Cannon8f5ac512013-06-12 23:29:18 -0400631 }
632 else if (!issubclass) {
633 PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError");
634 return NULL;
635 }
636
637 if (msg == NULL) {
638 PyErr_SetString(PyExc_TypeError, "expected a message argument");
639 return NULL;
640 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500641
Antoine Pitrouec9bac42012-04-18 16:57:54 +0200642 args = PyTuple_New(1);
Brian Curtin09b86d12012-04-17 16:57:09 -0500643 if (args == NULL)
644 return NULL;
645
646 kwargs = PyDict_New();
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400647 if (kwargs == NULL) {
648 Py_DECREF(args);
Brian Curtin09b86d12012-04-17 16:57:09 -0500649 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400650 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500651
Brian Curtin94c001b2012-04-18 08:30:51 -0500652 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500653 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500654 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500655
Brian Curtin94c001b2012-04-18 08:30:51 -0500656 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500657 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500658 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500659
660 Py_INCREF(msg);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400661 PyTuple_SET_ITEM(args, 0, msg);
Brian Curtin09b86d12012-04-17 16:57:09 -0500662 PyDict_SetItemString(kwargs, "name", name);
663 PyDict_SetItemString(kwargs, "path", path);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400664
Brett Cannon8f5ac512013-06-12 23:29:18 -0400665 error = PyObject_Call(exception, args, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400666 if (error != NULL) {
667 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500668 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400669 }
670
Brett Cannon79ec55e2012-04-12 20:24:54 -0400671 Py_DECREF(args);
672 Py_DECREF(kwargs);
673
Brian Curtin09b86d12012-04-17 16:57:09 -0500674 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400675}
676
Brett Cannon8f5ac512013-06-12 23:29:18 -0400677PyObject *
678PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
679{
680 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
681}
682
Guido van Rossum683a0721990-10-21 22:09:12 +0000683void
Neal Norwitzb382b842007-08-24 20:00:37 +0000684_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 PyErr_Format(PyExc_SystemError,
687 "%s:%d: bad argument to internal function",
688 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000689}
690
691/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
692 export the entry point for existing object code: */
693#undef PyErr_BadInternalCall
694void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyErr_Format(PyExc_SystemError,
698 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000699}
Fred Drake6d63adf2000-08-24 22:38:39 +0000700#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
701
Guido van Rossum1548bac1997-02-14 17:09:47 +0000702
703
Guido van Rossum1548bac1997-02-14 17:09:47 +0000704PyObject *
705PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 va_list vargs;
708 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000709
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000710#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000714#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 string = PyUnicode_FromFormatV(format, vargs);
717 PyErr_SetObject(exception, string);
718 Py_XDECREF(string);
719 va_end(vargs);
720 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000721}
Guido van Rossum7617e051997-09-16 18:43:50 +0000722
723
Thomas Wouters477c8d52006-05-27 19:21:47 +0000724
Guido van Rossum7617e051997-09-16 18:43:50 +0000725PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000726PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 const char *dot;
729 PyObject *modulename = NULL;
730 PyObject *classname = NULL;
731 PyObject *mydict = NULL;
732 PyObject *bases = NULL;
733 PyObject *result = NULL;
734 dot = strrchr(name, '.');
735 if (dot == NULL) {
736 PyErr_SetString(PyExc_SystemError,
737 "PyErr_NewException: name must be module.class");
738 return NULL;
739 }
740 if (base == NULL)
741 base = PyExc_Exception;
742 if (dict == NULL) {
743 dict = mydict = PyDict_New();
744 if (dict == NULL)
745 goto failure;
746 }
747 if (PyDict_GetItemString(dict, "__module__") == NULL) {
748 modulename = PyUnicode_FromStringAndSize(name,
749 (Py_ssize_t)(dot-name));
750 if (modulename == NULL)
751 goto failure;
752 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
753 goto failure;
754 }
755 if (PyTuple_Check(base)) {
756 bases = base;
757 /* INCREF as we create a new ref in the else branch */
758 Py_INCREF(bases);
759 } else {
760 bases = PyTuple_Pack(1, base);
761 if (bases == NULL)
762 goto failure;
763 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100764 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000765 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000767 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 Py_XDECREF(bases);
769 Py_XDECREF(mydict);
770 Py_XDECREF(classname);
771 Py_XDECREF(modulename);
772 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000773}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000774
Georg Brandl1e28a272009-12-28 08:41:01 +0000775
776/* Create an exception with docstring */
777PyObject *
778PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 int result;
782 PyObject *ret = NULL;
783 PyObject *mydict = NULL; /* points to the dict only if we create it */
784 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 if (dict == NULL) {
787 dict = mydict = PyDict_New();
788 if (dict == NULL) {
789 return NULL;
790 }
791 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 if (doc != NULL) {
794 docobj = PyUnicode_FromString(doc);
795 if (docobj == NULL)
796 goto failure;
797 result = PyDict_SetItemString(dict, "__doc__", docobj);
798 Py_DECREF(docobj);
799 if (result < 0)
800 goto failure;
801 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000804 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 Py_XDECREF(mydict);
806 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000807}
808
809
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000810/* Call when an exception has occurred but there is no way for Python
811 to handle it. Examples: exception in __del__ or during GC. */
812void
813PyErr_WriteUnraisable(PyObject *obj)
814{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200815 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 PyObject *f, *t, *v, *tb;
817 PyErr_Fetch(&t, &v, &tb);
818 f = PySys_GetObject("stderr");
819 if (f != NULL && f != Py_None) {
Andrew Svetlov76bcff22012-11-03 15:56:05 +0200820 if (obj) {
821 PyFile_WriteString("Exception ignored in: ", f);
822 PyFile_WriteObject(obj, f, 0);
823 PyFile_WriteString("\n", f);
824 }
825 PyTraceBack_Print(tb, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 if (t) {
827 PyObject* moduleName;
828 char* className;
829 assert(PyExceptionClass_Check(t));
830 className = PyExceptionClass_Name(t);
831 if (className != NULL) {
832 char *dot = strrchr(className, '.');
833 if (dot != NULL)
834 className = dot+1;
835 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000836
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200837 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 if (moduleName == NULL)
839 PyFile_WriteString("<unknown>", f);
840 else {
841 char* modstr = _PyUnicode_AsString(moduleName);
842 if (modstr &&
843 strcmp(modstr, "builtins") != 0)
844 {
845 PyFile_WriteString(modstr, f);
846 PyFile_WriteString(".", f);
847 }
848 }
849 if (className == NULL)
850 PyFile_WriteString("<unknown>", f);
851 else
852 PyFile_WriteString(className, f);
853 if (v && v != Py_None) {
854 PyFile_WriteString(": ", f);
Andrew Svetlov76bcff22012-11-03 15:56:05 +0200855 PyFile_WriteObject(v, f, Py_PRINT_RAW);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 }
Andrew Svetlov76bcff22012-11-03 15:56:05 +0200857 PyFile_WriteString("\n", f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 Py_XDECREF(moduleName);
859 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 PyErr_Clear(); /* Just in case */
861 }
862 Py_XDECREF(t);
863 Py_XDECREF(v);
864 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000865}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000866
Armin Rigo092381a2003-10-25 14:29:27 +0000867extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000868
Guido van Rossum2fd45652001-02-28 21:46:24 +0000869
Benjamin Peterson2c539712010-09-20 22:42:10 +0000870void
871PyErr_SyntaxLocation(const char *filename, int lineno) {
872 PyErr_SyntaxLocationEx(filename, lineno, -1);
873}
874
875
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000876/* Set file and line information for the current exception.
877 If the exception is not a SyntaxError, also sets additional attributes
878 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000879
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000880void
Benjamin Peterson2c539712010-09-20 22:42:10 +0000881PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200884 _Py_IDENTIFIER(filename);
885 _Py_IDENTIFIER(lineno);
886 _Py_IDENTIFIER(msg);
887 _Py_IDENTIFIER(offset);
888 _Py_IDENTIFIER(print_file_and_line);
889 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* add attributes for the line number and filename for the error */
892 PyErr_Fetch(&exc, &v, &tb);
893 PyErr_NormalizeException(&exc, &v, &tb);
894 /* XXX check that it is, indeed, a syntax error. It might not
895 * be, though. */
896 tmp = PyLong_FromLong(lineno);
897 if (tmp == NULL)
898 PyErr_Clear();
899 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200900 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PyErr_Clear();
902 Py_DECREF(tmp);
903 }
Benjamin Peterson2c539712010-09-20 22:42:10 +0000904 if (col_offset >= 0) {
905 tmp = PyLong_FromLong(col_offset);
906 if (tmp == NULL)
907 PyErr_Clear();
908 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200909 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +0000910 PyErr_Clear();
911 Py_DECREF(tmp);
912 }
913 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 if (filename != NULL) {
Victor Stinner15a71cd2010-10-17 19:03:16 +0000915 tmp = PyUnicode_DecodeFSDefault(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 if (tmp == NULL)
917 PyErr_Clear();
918 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200919 if (_PyObject_SetAttrId(v, &PyId_filename, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 PyErr_Clear();
921 Py_DECREF(tmp);
922 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 tmp = PyErr_ProgramText(filename, lineno);
925 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200926 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 PyErr_Clear();
928 Py_DECREF(tmp);
929 }
930 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200931 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 PyErr_Clear();
933 }
934 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200935 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 tmp = PyObject_Str(v);
937 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200938 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 PyErr_Clear();
940 Py_DECREF(tmp);
941 } else {
942 PyErr_Clear();
943 }
944 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200945 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
946 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
947 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 PyErr_Clear();
949 }
950 }
951 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000952}
953
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000954/* Attempt to load the line of text that the exception refers to. If it
955 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000956
957 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000958 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000959
960PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000961PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 FILE *fp;
964 int i;
965 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 if (filename == NULL || *filename == '\0' || lineno <= 0)
968 return NULL;
969 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
970 if (fp == NULL)
971 return NULL;
972 for (i = 0; i < lineno; i++) {
973 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
974 do {
975 *pLastChar = '\0';
976 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
977 fp, NULL) == NULL)
978 break;
979 /* fgets read *something*; if it didn't get as
980 far as pLastChar, it must have found a newline
981 or hit the end of the file; if pLastChar is \n,
982 it obviously found a newline; else we haven't
983 yet seen a newline, so must continue */
984 } while (*pLastChar != '\0' && *pLastChar != '\n');
985 }
986 fclose(fp);
987 if (i == lineno) {
988 char *p = linebuf;
989 PyObject *res;
990 while (*p == ' ' || *p == '\t' || *p == '\014')
991 p++;
992 res = PyUnicode_FromString(p);
993 if (res == NULL)
994 PyErr_Clear();
995 return res;
996 }
997 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000998}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000999
1000#ifdef __cplusplus
1001}
1002#endif