blob: cd0f68dff459cebddadbe61e7608b52cd338e0a6 [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
323/* Convenience functions to set a type error exception and return 0 */
324
325int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000326PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 PyErr_SetString(PyExc_TypeError,
329 "bad argument type for built-in operation");
330 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000331}
332
Guido van Rossum373c8691997-04-29 18:22:47 +0000333PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000335{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000336 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000338}
339
Guido van Rossum373c8691997-04-29 18:22:47 +0000340PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000341PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200344 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 int i = errno;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000346#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 char *s;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000348#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000350#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000351
Guido van Rossume9fbc091995-02-18 14:52:19 +0000352#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 if (i == EINTR && PyErr_CheckSignals())
354 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000355#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000356
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000357#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 if (i == 0)
359 s = "Error"; /* Sometimes errno didn't get set */
360 else
361 s = strerror(i);
362 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000363#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 if (i == 0)
365 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
366 else
367 {
368 /* Note that the Win32 errors do not lineup with the
369 errno error. So if the error is in the MSVC error
370 table, we use it, otherwise we assume it really _is_
371 a Win32 error code
372 */
373 if (i > 0 && i < _sys_nerr) {
374 message = PyUnicode_FromString(_sys_errlist[i]);
375 }
376 else {
377 int len = FormatMessageW(
378 FORMAT_MESSAGE_ALLOCATE_BUFFER |
379 FORMAT_MESSAGE_FROM_SYSTEM |
380 FORMAT_MESSAGE_IGNORE_INSERTS,
381 NULL, /* no message source */
382 i,
383 MAKELANGID(LANG_NEUTRAL,
384 SUBLANG_DEFAULT),
385 /* Default language */
386 (LPWSTR) &s_buf,
387 0, /* size not used */
388 NULL); /* no args */
389 if (len==0) {
390 /* Only ever seen this in out-of-mem
391 situations */
392 s_buf = NULL;
393 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
394 } else {
395 /* remove trailing cr/lf and dots */
396 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
397 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200398 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 }
400 }
401 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000402#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 if (message == NULL)
405 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000406#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 return NULL;
410 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 if (filenameObject != NULL)
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200413 args = Py_BuildValue("(iOO)", i, message, filenameObject);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 else
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200415 args = Py_BuildValue("(iO)", i, message);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000417
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200418 if (args != NULL) {
419 v = PyObject_Call(exc, args, NULL);
420 Py_DECREF(args);
421 if (v != NULL) {
422 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
423 Py_DECREF(v);
424 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000426#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000430}
Guido van Rossum743007d1999-04-21 15:27:31 +0000431
Barry Warsaw97d95151998-07-23 16:05:56 +0000432
433PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000434PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
437 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
438 Py_XDECREF(name);
439 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000440}
441
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000442#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000443PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000444PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 PyObject *name = filename ?
447 PyUnicode_FromUnicode(filename, wcslen(filename)) :
448 NULL;
449 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
450 Py_XDECREF(name);
451 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000452}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000453#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000454
455PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000459}
Guido van Rossum683a0721990-10-21 22:09:12 +0000460
Brett Cannonbf364092006-03-01 04:25:17 +0000461#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000462/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000463PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyObject *exc,
465 int ierr,
466 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 int len;
469 WCHAR *s_buf = NULL; /* Free via LocalFree */
470 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200471 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 DWORD err = (DWORD)ierr;
473 if (err==0) err = GetLastError();
474 len = FormatMessageW(
475 /* Error API error */
476 FORMAT_MESSAGE_ALLOCATE_BUFFER |
477 FORMAT_MESSAGE_FROM_SYSTEM |
478 FORMAT_MESSAGE_IGNORE_INSERTS,
479 NULL, /* no message source */
480 err,
481 MAKELANGID(LANG_NEUTRAL,
482 SUBLANG_DEFAULT), /* Default language */
483 (LPWSTR) &s_buf,
484 0, /* size not used */
485 NULL); /* no args */
486 if (len==0) {
487 /* Only seen this in out of mem situations */
488 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
489 s_buf = NULL;
490 } else {
491 /* remove trailing cr/lf and dots */
492 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
493 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200494 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 if (message == NULL)
498 {
499 LocalFree(s_buf);
500 return NULL;
501 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000502
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200503 if (filenameObject == NULL)
504 filenameObject = Py_None;
505 /* This is the constructor signature for passing a Windows error code.
506 The POSIX translation will be figured out by the constructor. */
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200507 args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000509
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200510 if (args != NULL) {
511 v = PyObject_Call(exc, args, NULL);
512 Py_DECREF(args);
513 if (v != NULL) {
514 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
515 Py_DECREF(v);
516 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
518 LocalFree(s_buf);
519 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000520}
521
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000522PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 PyObject *exc,
524 int ierr,
525 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000526{
Victor Stinner92be9392010-12-28 00:28:21 +0000527 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
529 ierr,
530 name);
531 Py_XDECREF(name);
532 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000533}
534
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000535PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 PyObject *exc,
537 int ierr,
538 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 PyObject *name = filename ?
541 PyUnicode_FromUnicode(filename, wcslen(filename)) :
542 NULL;
543 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
544 ierr,
545 name);
546 Py_XDECREF(name);
547 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000548}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000549
Thomas Heller085358a2002-07-29 14:27:41 +0000550PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000553}
554
Guido van Rossum795e1892000-02-17 15:19:15 +0000555PyObject *PyErr_SetFromWindowsErr(int ierr)
556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
558 ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000559}
560PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 int ierr,
562 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000563{
Victor Stinner92be9392010-12-28 00:28:21 +0000564 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
566 PyExc_WindowsError,
567 ierr, name);
568 Py_XDECREF(name);
569 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000570}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000571
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000572PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 int ierr,
574 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 PyObject *name = filename ?
577 PyUnicode_FromUnicode(filename, wcslen(filename)) :
578 NULL;
579 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
580 PyExc_WindowsError,
581 ierr, name);
582 Py_XDECREF(name);
583 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000584}
Guido van Rossum795e1892000-02-17 15:19:15 +0000585#endif /* MS_WINDOWS */
586
Guido van Rossum683a0721990-10-21 22:09:12 +0000587void
Neal Norwitzb382b842007-08-24 20:00:37 +0000588_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 PyErr_Format(PyExc_SystemError,
591 "%s:%d: bad argument to internal function",
592 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000593}
594
595/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
596 export the entry point for existing object code: */
597#undef PyErr_BadInternalCall
598void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyErr_Format(PyExc_SystemError,
602 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000603}
Fred Drake6d63adf2000-08-24 22:38:39 +0000604#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
605
Guido van Rossum1548bac1997-02-14 17:09:47 +0000606
607
Guido van Rossum1548bac1997-02-14 17:09:47 +0000608PyObject *
609PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 va_list vargs;
612 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000613
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000614#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000616#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 va_start(vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000618#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 string = PyUnicode_FromFormatV(format, vargs);
621 PyErr_SetObject(exception, string);
622 Py_XDECREF(string);
623 va_end(vargs);
624 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000625}
Guido van Rossum7617e051997-09-16 18:43:50 +0000626
627
Thomas Wouters477c8d52006-05-27 19:21:47 +0000628
Guido van Rossum7617e051997-09-16 18:43:50 +0000629PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000630PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 const char *dot;
633 PyObject *modulename = NULL;
634 PyObject *classname = NULL;
635 PyObject *mydict = NULL;
636 PyObject *bases = NULL;
637 PyObject *result = NULL;
638 dot = strrchr(name, '.');
639 if (dot == NULL) {
640 PyErr_SetString(PyExc_SystemError,
641 "PyErr_NewException: name must be module.class");
642 return NULL;
643 }
644 if (base == NULL)
645 base = PyExc_Exception;
646 if (dict == NULL) {
647 dict = mydict = PyDict_New();
648 if (dict == NULL)
649 goto failure;
650 }
651 if (PyDict_GetItemString(dict, "__module__") == NULL) {
652 modulename = PyUnicode_FromStringAndSize(name,
653 (Py_ssize_t)(dot-name));
654 if (modulename == NULL)
655 goto failure;
656 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
657 goto failure;
658 }
659 if (PyTuple_Check(base)) {
660 bases = base;
661 /* INCREF as we create a new ref in the else branch */
662 Py_INCREF(bases);
663 } else {
664 bases = PyTuple_Pack(1, base);
665 if (bases == NULL)
666 goto failure;
667 }
668 /* Create a real new-style class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000669 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000671 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 Py_XDECREF(bases);
673 Py_XDECREF(mydict);
674 Py_XDECREF(classname);
675 Py_XDECREF(modulename);
676 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000677}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000678
Georg Brandl1e28a272009-12-28 08:41:01 +0000679
680/* Create an exception with docstring */
681PyObject *
682PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 int result;
686 PyObject *ret = NULL;
687 PyObject *mydict = NULL; /* points to the dict only if we create it */
688 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 if (dict == NULL) {
691 dict = mydict = PyDict_New();
692 if (dict == NULL) {
693 return NULL;
694 }
695 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (doc != NULL) {
698 docobj = PyUnicode_FromString(doc);
699 if (docobj == NULL)
700 goto failure;
701 result = PyDict_SetItemString(dict, "__doc__", docobj);
702 Py_DECREF(docobj);
703 if (result < 0)
704 goto failure;
705 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000708 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 Py_XDECREF(mydict);
710 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000711}
712
713
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000714/* Call when an exception has occurred but there is no way for Python
715 to handle it. Examples: exception in __del__ or during GC. */
716void
717PyErr_WriteUnraisable(PyObject *obj)
718{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200719 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 PyObject *f, *t, *v, *tb;
721 PyErr_Fetch(&t, &v, &tb);
722 f = PySys_GetObject("stderr");
723 if (f != NULL && f != Py_None) {
724 PyFile_WriteString("Exception ", f);
725 if (t) {
726 PyObject* moduleName;
727 char* className;
728 assert(PyExceptionClass_Check(t));
729 className = PyExceptionClass_Name(t);
730 if (className != NULL) {
731 char *dot = strrchr(className, '.');
732 if (dot != NULL)
733 className = dot+1;
734 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000735
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200736 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 if (moduleName == NULL)
738 PyFile_WriteString("<unknown>", f);
739 else {
740 char* modstr = _PyUnicode_AsString(moduleName);
741 if (modstr &&
742 strcmp(modstr, "builtins") != 0)
743 {
744 PyFile_WriteString(modstr, f);
745 PyFile_WriteString(".", f);
746 }
747 }
748 if (className == NULL)
749 PyFile_WriteString("<unknown>", f);
750 else
751 PyFile_WriteString(className, f);
752 if (v && v != Py_None) {
753 PyFile_WriteString(": ", f);
754 PyFile_WriteObject(v, f, 0);
755 }
756 Py_XDECREF(moduleName);
757 }
Georg Brandl08be72d2010-10-24 15:11:22 +0000758 if (obj) {
759 PyFile_WriteString(" in ", f);
760 PyFile_WriteObject(obj, f, 0);
761 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 PyFile_WriteString(" ignored\n", f);
763 PyErr_Clear(); /* Just in case */
764 }
765 Py_XDECREF(t);
766 Py_XDECREF(v);
767 Py_XDECREF(tb);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000768}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000769
Armin Rigo092381a2003-10-25 14:29:27 +0000770extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000771
Guido van Rossum2fd45652001-02-28 21:46:24 +0000772
Benjamin Peterson2c539712010-09-20 22:42:10 +0000773void
774PyErr_SyntaxLocation(const char *filename, int lineno) {
775 PyErr_SyntaxLocationEx(filename, lineno, -1);
776}
777
778
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000779/* Set file and line information for the current exception.
780 If the exception is not a SyntaxError, also sets additional attributes
781 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000782
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000783void
Benjamin Peterson2c539712010-09-20 22:42:10 +0000784PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200787 _Py_IDENTIFIER(filename);
788 _Py_IDENTIFIER(lineno);
789 _Py_IDENTIFIER(msg);
790 _Py_IDENTIFIER(offset);
791 _Py_IDENTIFIER(print_file_and_line);
792 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* add attributes for the line number and filename for the error */
795 PyErr_Fetch(&exc, &v, &tb);
796 PyErr_NormalizeException(&exc, &v, &tb);
797 /* XXX check that it is, indeed, a syntax error. It might not
798 * be, though. */
799 tmp = PyLong_FromLong(lineno);
800 if (tmp == NULL)
801 PyErr_Clear();
802 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200803 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyErr_Clear();
805 Py_DECREF(tmp);
806 }
Benjamin Peterson2c539712010-09-20 22:42:10 +0000807 if (col_offset >= 0) {
808 tmp = PyLong_FromLong(col_offset);
809 if (tmp == NULL)
810 PyErr_Clear();
811 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200812 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +0000813 PyErr_Clear();
814 Py_DECREF(tmp);
815 }
816 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 if (filename != NULL) {
Victor Stinner15a71cd2010-10-17 19:03:16 +0000818 tmp = PyUnicode_DecodeFSDefault(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 if (tmp == NULL)
820 PyErr_Clear();
821 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200822 if (_PyObject_SetAttrId(v, &PyId_filename, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 PyErr_Clear();
824 Py_DECREF(tmp);
825 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 tmp = PyErr_ProgramText(filename, lineno);
828 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200829 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PyErr_Clear();
831 Py_DECREF(tmp);
832 }
833 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200834 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 PyErr_Clear();
836 }
837 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200838 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 tmp = PyObject_Str(v);
840 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200841 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 PyErr_Clear();
843 Py_DECREF(tmp);
844 } else {
845 PyErr_Clear();
846 }
847 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200848 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
849 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
850 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 PyErr_Clear();
852 }
853 }
854 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000855}
856
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000857/* Attempt to load the line of text that the exception refers to. If it
858 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000859
860 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000861 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000862
863PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000864PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 FILE *fp;
867 int i;
868 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 if (filename == NULL || *filename == '\0' || lineno <= 0)
871 return NULL;
872 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
873 if (fp == NULL)
874 return NULL;
875 for (i = 0; i < lineno; i++) {
876 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
877 do {
878 *pLastChar = '\0';
879 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
880 fp, NULL) == NULL)
881 break;
882 /* fgets read *something*; if it didn't get as
883 far as pLastChar, it must have found a newline
884 or hit the end of the file; if pLastChar is \n,
885 it obviously found a newline; else we haven't
886 yet seen a newline, so must continue */
887 } while (*pLastChar != '\0' && *pLastChar != '\n');
888 }
889 fclose(fp);
890 if (i == lineno) {
891 char *p = linebuf;
892 PyObject *res;
893 while (*p == ' ' || *p == '\t' || *p == '\014')
894 p++;
895 res = PyUnicode_FromString(p);
896 if (res == NULL)
897 PyErr_Clear();
898 return res;
899 }
900 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000901}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000902
903#ifdef __cplusplus
904}
905#endif