blob: cccc0f777835db82df17792bae5dd48d2995fe6c [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{
Guido van Rossum885553e1998-12-21 18:33:30 +000027 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000028 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Guido van Rossuma027efa1997-05-05 20:56:21 +000030 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */
Guido van Rossum1a5e21e2006-02-28 21:57:43 +000032 /* Well, it could be None. */
Guido van Rossuma027efa1997-05-05 20:56:21 +000033 Py_DECREF(traceback);
34 traceback = NULL;
35 }
36
37 /* 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;
42
43 tstate->curexc_type = type;
44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback;
46
47 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{
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000055 PyThreadState *tstate = PyThreadState_GET();
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +000056 PyObject *exc_value;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000057 PyObject *tb = NULL;
58
Thomas Wouters303de6a2006-04-20 22:42:37 +000059 if (exception != NULL &&
60 !PyExceptionClass_Check(exception)) {
Thomas Wouters303de6a2006-04-20 22:42:37 +000061 PyErr_Format(PyExc_SystemError,
Walter Dörwald573c08c2007-05-25 15:46:59 +000062 "exception %R not a BaseException subclass",
63 exception);
Thomas Wouters303de6a2006-04-20 22:42:37 +000064 return;
65 }
Guido van Rossum373c8691997-04-29 18:22:47 +000066 Py_XINCREF(value);
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +000067 exc_value = tstate->exc_value;
68 if (exc_value != NULL && exc_value != Py_None) {
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000069 /* Implicit exception chaining */
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +000070 Py_INCREF(exc_value);
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000071 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 }
Benjamin Petersone6528212008-07-15 15:32:09 +000090 /* 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. */
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +000094 if (exc_value != value) {
95 PyObject *o = exc_value, *context;
Benjamin Petersone6528212008-07-15 15:32:09 +000096 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 }
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000104 PyException_SetContext(value, exc_value);
105 } else {
106 Py_DECREF(exc_value);
Benjamin Petersone6528212008-07-15 15:32:09 +0000107 }
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000108 }
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{
Guido van Rossum373c8691997-04-29 18:22:47 +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{
Walter Dörwald573c08c2007-05-25 15:46:59 +0000124 PyObject *value = PyUnicode_FromString(string);
Guido van Rossum373c8691997-04-29 18:22:47 +0000125 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{
Tim Peters024da352001-05-30 06:09:50 +0000133 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134
135 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000138
139int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000140PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000141{
Barry Warsawfa5c3152000-05-02 19:27:51 +0000142 if (err == NULL || exc == NULL) {
143 /* maybe caused by "import exceptions" that failed early on */
144 return 0;
145 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000146 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +0000147 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000148 n = PyTuple_Size(exc);
149 for (i = 0; i < n; i++) {
150 /* Test recursively */
151 if (PyErr_GivenExceptionMatches(
152 err, PyTuple_GET_ITEM(exc, i)))
153 {
154 return 1;
155 }
156 }
157 return 0;
158 }
159 /* err might be an instance, so check its class. */
Brett Cannonbf364092006-03-01 04:25:17 +0000160 if (PyExceptionInstance_Check(err))
161 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000162
Brett Cannonbf364092006-03-01 04:25:17 +0000163 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000164 int res = 0;
165 PyObject *exception, *value, *tb;
166 PyErr_Fetch(&exception, &value, &tb);
Antoine Pitrouec569b72008-08-26 22:40:48 +0000167 /* PyObject_IsSubclass() can recurse and therefore is
168 not safe (see test_bad_getattr in test.pickletester). */
169 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000170 /* This function must not fail, so print the error here */
171 if (res == -1) {
172 PyErr_WriteUnraisable(err);
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000173 res = 0;
174 }
175 PyErr_Restore(exception, value, tb);
176 return res;
Brett Cannonbf364092006-03-01 04:25:17 +0000177 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000178
179 return err == exc;
180}
Guido van Rossum743007d1999-04-21 15:27:31 +0000181
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000182
183int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000184PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000185{
186 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
187}
188
189
190/* Used in many places to normalize a raised exception, including in
191 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000192
193 XXX: should PyErr_NormalizeException() also call
194 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000195*/
196void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000197PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000198{
199 PyObject *type = *exc;
200 PyObject *value = *val;
201 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000202 PyObject *initial_tb = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +0000203 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000204
Guido van Rossumed473a42000-08-07 19:18:27 +0000205 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000206 /* There was no exception, so nothing to do. */
207 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000208 }
209
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000210 /* If PyErr_SetNone() was used, the value will have been actually
211 set to NULL.
212 */
213 if (!value) {
214 value = Py_None;
215 Py_INCREF(value);
216 }
217
Brett Cannonbf364092006-03-01 04:25:17 +0000218 if (PyExceptionInstance_Check(value))
219 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000220
221 /* Normalize the exception so that if the type is a class, the
222 value will be an instance.
223 */
Brett Cannonbf364092006-03-01 04:25:17 +0000224 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225 /* if the value was not an instance, or is not an instance
226 whose class is (or is derived from) type, then use the
227 value as an argument to instantiation of the type
228 class.
229 */
Brett Cannonbf364092006-03-01 04:25:17 +0000230 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000231 PyObject *args, *res;
232
233 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000234 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000235 else if (PyTuple_Check(value)) {
236 Py_INCREF(value);
237 args = value;
238 }
239 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000240 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000241
242 if (args == NULL)
243 goto finally;
244 res = PyEval_CallObject(type, args);
245 Py_DECREF(args);
246 if (res == NULL)
247 goto finally;
248 Py_DECREF(value);
249 value = res;
250 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000251 /* if the class of the instance doesn't exactly match the
252 class of the type, believe the instance
253 */
254 else if (inclass != type) {
255 Py_DECREF(type);
256 type = inclass;
257 Py_INCREF(type);
258 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000259 }
260 *exc = type;
261 *val = value;
262 return;
263finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000264 Py_DECREF(type);
265 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000266 /* If the new exception doesn't set a traceback and the old
267 exception had a traceback, use the old traceback for the
268 new exception. It's better than nothing.
269 */
270 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000271 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000272 if (initial_tb != NULL) {
273 if (*tb == NULL)
274 *tb = initial_tb;
275 else
276 Py_DECREF(initial_tb);
277 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000278 /* normalize recursively */
Thomas Wouters89d996e2007-09-08 17:39:28 +0000279 tstate = PyThreadState_GET();
280 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
281 --tstate->recursion_depth;
Georg Brandl406b3d82009-04-11 21:24:37 +0000282 /* throw away the old exception... */
283 Py_DECREF(*exc);
284 Py_DECREF(*val);
285 /* ... and use the recursion error instead */
286 *exc = PyExc_RuntimeError;
287 *val = PyExc_RecursionErrorInst;
288 Py_INCREF(*exc);
289 Py_INCREF(*val);
290 /* just keeping the old traceback */
Thomas Wouters89d996e2007-09-08 17:39:28 +0000291 return;
292 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000293 PyErr_NormalizeException(exc, val, tb);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000294 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000295}
296
297
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000299PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000301 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000302
303 *p_type = tstate->curexc_type;
304 *p_value = tstate->curexc_value;
305 *p_traceback = tstate->curexc_traceback;
306
307 tstate->curexc_type = NULL;
308 tstate->curexc_value = NULL;
309 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310}
311
312void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000313PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000315 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000317
318/* Convenience functions to set a type error exception and return 0 */
319
320int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000322{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000323 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000324 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000325 return 0;
326}
327
Guido van Rossum373c8691997-04-29 18:22:47 +0000328PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000329PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000330{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000331 if (PyErr_ExceptionMatches(PyExc_MemoryError))
332 /* already current */
333 return NULL;
334
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000335 /* raise the pre-allocated instance if it still exists */
336 if (PyExc_MemoryErrorInst)
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000337 {
338 /* Clear the previous traceback, otherwise it will be appended
339 * to the current one.
340 *
341 * The following statement is not likely to raise any error;
342 * if it does, we simply discard it.
343 */
344 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
345
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000346 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000347 }
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000348 else
349 /* this will probably fail since there's no memory and hee,
350 hee, we have to instantiate this class
351 */
352 PyErr_SetNone(PyExc_MemoryError);
353
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000354 return NULL;
355}
356
Guido van Rossum373c8691997-04-29 18:22:47 +0000357PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000358PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000359{
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000360 PyObject *message;
Guido van Rossum373c8691997-04-29 18:22:47 +0000361 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000362 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000363#ifdef PLAN9
364 char errbuf[ERRMAX];
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000365#else
366#ifndef MS_WINDOWS
367 char *s;
368#else
369 WCHAR *s_buf = NULL;
370#endif /* Unix/Windows */
371#endif /* PLAN 9*/
372
Guido van Rossume9fbc091995-02-18 14:52:19 +0000373#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000374 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000375 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000376#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000377
Martin v. Löwis3484a182002-03-09 12:07:51 +0000378#ifdef PLAN9
379 rerrstr(errbuf, sizeof errbuf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000380 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
Martin v. Löwis3484a182002-03-09 12:07:51 +0000381#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000382#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000383 if (i == 0)
384 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000385 else
Guido van Rossume0e59821998-10-14 20:38:13 +0000386 s = strerror(i);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000387 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000388#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000389 if (i == 0)
390 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
391 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000392 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000393 /* Note that the Win32 errors do not lineup with the
394 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000395 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000396 a Win32 error code
397 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000398 if (i > 0 && i < _sys_nerr) {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000399 message = PyUnicode_FromString(_sys_errlist[i]);
Guido van Rossum795e1892000-02-17 15:19:15 +0000400 }
401 else {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000402 int len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000403 FORMAT_MESSAGE_ALLOCATE_BUFFER |
404 FORMAT_MESSAGE_FROM_SYSTEM |
405 FORMAT_MESSAGE_IGNORE_INSERTS,
406 NULL, /* no message source */
407 i,
408 MAKELANGID(LANG_NEUTRAL,
409 SUBLANG_DEFAULT),
410 /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000411 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000412 0, /* size not used */
413 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000414 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000415 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000416 situations */
Mark Hammond3d61a062002-10-04 00:13:02 +0000417 s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000418 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
Mark Hammond3d61a062002-10-04 00:13:02 +0000419 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000420 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000421 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
422 s_buf[--len] = L'\0';
423 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000424 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000425 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000426 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000427#endif /* Unix/Windows */
428#endif /* PLAN 9*/
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000429
430 if (message == NULL)
431 {
432#ifdef MS_WINDOWS
433 LocalFree(s_buf);
434#endif
435 return NULL;
436 }
437
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000438 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000439 v = Py_BuildValue("(iOO)", i, message, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000440 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000441 v = Py_BuildValue("(iO)", i, message);
442 Py_DECREF(message);
443
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000444 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000445 PyErr_SetObject(exc, v);
446 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000447 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000448#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000449 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000450#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000451 return NULL;
452}
Guido van Rossum743007d1999-04-21 15:27:31 +0000453
Barry Warsaw97d95151998-07-23 16:05:56 +0000454
455PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000456PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000457{
Neal Norwitzcd795962007-08-24 19:54:13 +0000458 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000459 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000460 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000461 return result;
462}
463
464#ifdef Py_WIN_WIDE_FILENAMES
465PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000466PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000467{
Brett Cannonbf364092006-03-01 04:25:17 +0000468 PyObject *name = filename ?
469 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000470 NULL;
471 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
472 Py_XDECREF(name);
473 return result;
474}
475#endif /* Py_WIN_WIDE_FILENAMES */
476
477PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000478PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000479{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000480 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000481}
Guido van Rossum683a0721990-10-21 22:09:12 +0000482
Brett Cannonbf364092006-03-01 04:25:17 +0000483#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000484/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000485PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000486 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000488 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000489{
490 int len;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000491 WCHAR *s_buf = NULL; /* Free via LocalFree */
492 PyObject *message;
Guido van Rossum795e1892000-02-17 15:19:15 +0000493 PyObject *v;
494 DWORD err = (DWORD)ierr;
495 if (err==0) err = GetLastError();
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000496 len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000497 /* Error API error */
498 FORMAT_MESSAGE_ALLOCATE_BUFFER |
499 FORMAT_MESSAGE_FROM_SYSTEM |
500 FORMAT_MESSAGE_IGNORE_INSERTS,
501 NULL, /* no message source */
502 err,
503 MAKELANGID(LANG_NEUTRAL,
504 SUBLANG_DEFAULT), /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000505 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000506 0, /* size not used */
507 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000508 if (len==0) {
509 /* Only seen this in out of mem situations */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000510 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
Mark Hammond3d61a062002-10-04 00:13:02 +0000511 s_buf = NULL;
512 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000513 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000514 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
515 s_buf[--len] = L'\0';
516 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000517 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000518
519 if (message == NULL)
520 {
521 LocalFree(s_buf);
522 return NULL;
523 }
524
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000525 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000526 v = Py_BuildValue("(iOO)", err, message, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000527 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000528 v = Py_BuildValue("(iO)", err, message);
529 Py_DECREF(message);
530
Guido van Rossum795e1892000-02-17 15:19:15 +0000531 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000532 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000533 Py_DECREF(v);
534 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000535 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000536 return NULL;
537}
538
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000539PyObject *PyErr_SetExcFromWindowsErrWithFilename(
540 PyObject *exc,
541 int ierr,
542 const char *filename)
543{
Neal Norwitzcd795962007-08-24 19:54:13 +0000544 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000545 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
546 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000547 name);
548 Py_XDECREF(name);
549 return ret;
550}
551
552#ifdef Py_WIN_WIDE_FILENAMES
553PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
554 PyObject *exc,
555 int ierr,
556 const Py_UNICODE *filename)
557{
Brett Cannonbf364092006-03-01 04:25:17 +0000558 PyObject *name = filename ?
559 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000560 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000561 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
562 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000563 name);
564 Py_XDECREF(name);
565 return ret;
566}
567#endif /* Py_WIN_WIDE_FILENAMES */
568
Thomas Heller085358a2002-07-29 14:27:41 +0000569PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
570{
571 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
572}
573
Guido van Rossum795e1892000-02-17 15:19:15 +0000574PyObject *PyErr_SetFromWindowsErr(int ierr)
575{
Thomas Heller085358a2002-07-29 14:27:41 +0000576 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
577 ierr, NULL);
578}
579PyObject *PyErr_SetFromWindowsErrWithFilename(
580 int ierr,
581 const char *filename)
582{
Neal Norwitzcd795962007-08-24 19:54:13 +0000583 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000584 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
585 PyExc_WindowsError,
586 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000587 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000588 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000589}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000590
591#ifdef Py_WIN_WIDE_FILENAMES
592PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
593 int ierr,
594 const Py_UNICODE *filename)
595{
Brett Cannonbf364092006-03-01 04:25:17 +0000596 PyObject *name = filename ?
597 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000598 NULL;
599 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
600 PyExc_WindowsError,
601 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000602 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000603 return result;
604}
605#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000606#endif /* MS_WINDOWS */
607
Guido van Rossum683a0721990-10-21 22:09:12 +0000608void
Neal Norwitzb382b842007-08-24 20:00:37 +0000609_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000610{
611 PyErr_Format(PyExc_SystemError,
612 "%s:%d: bad argument to internal function",
613 filename, lineno);
614}
615
616/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
617 export the entry point for existing object code: */
618#undef PyErr_BadInternalCall
619void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000621{
Fred Drake6d63adf2000-08-24 22:38:39 +0000622 PyErr_Format(PyExc_SystemError,
623 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000624}
Fred Drake6d63adf2000-08-24 22:38:39 +0000625#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
626
Guido van Rossum1548bac1997-02-14 17:09:47 +0000627
628
Guido van Rossum1548bac1997-02-14 17:09:47 +0000629PyObject *
630PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000631{
632 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000633 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000634
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000635#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000636 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000637#else
638 va_start(vargs);
639#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000640
Walter Dörwald573c08c2007-05-25 15:46:59 +0000641 string = PyUnicode_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000642 PyErr_SetObject(exception, string);
643 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000644 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000645 return NULL;
646}
Guido van Rossum7617e051997-09-16 18:43:50 +0000647
648
Thomas Wouters477c8d52006-05-27 19:21:47 +0000649
Guido van Rossum7617e051997-09-16 18:43:50 +0000650PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000651PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000652{
Neal Norwitzb382b842007-08-24 20:00:37 +0000653 const char *dot;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000654 PyObject *modulename = NULL;
655 PyObject *classname = NULL;
656 PyObject *mydict = NULL;
657 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000658 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000659 dot = strrchr(name, '.');
660 if (dot == NULL) {
661 PyErr_SetString(PyExc_SystemError,
662 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000663 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000664 }
665 if (base == NULL)
666 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000667 if (dict == NULL) {
668 dict = mydict = PyDict_New();
669 if (dict == NULL)
670 goto failure;
671 }
672 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000673 modulename = PyUnicode_FromStringAndSize(name,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000674 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000675 if (modulename == NULL)
676 goto failure;
677 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
678 goto failure;
679 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000680 if (PyTuple_Check(base)) {
681 bases = base;
682 /* INCREF as we create a new ref in the else branch */
683 Py_INCREF(bases);
684 } else {
685 bases = PyTuple_Pack(1, base);
686 if (bases == NULL)
687 goto failure;
688 }
689 /* Create a real new-style class. */
Guido van Rossume845c0f2007-11-02 23:07:07 +0000690 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000691 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000692 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000693 Py_XDECREF(bases);
694 Py_XDECREF(mydict);
695 Py_XDECREF(classname);
696 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000697 return result;
698}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000699
700/* Call when an exception has occurred but there is no way for Python
701 to handle it. Examples: exception in __del__ or during GC. */
702void
703PyErr_WriteUnraisable(PyObject *obj)
704{
705 PyObject *f, *t, *v, *tb;
706 PyErr_Fetch(&t, &v, &tb);
707 f = PySys_GetObject("stderr");
Christian Heimes2be03732007-11-15 02:26:46 +0000708 if (f != NULL && f != Py_None) {
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000709 PyFile_WriteString("Exception ", f);
710 if (t) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000711 PyObject* moduleName;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000712 char* className;
713 assert(PyExceptionClass_Check(t));
714 className = PyExceptionClass_Name(t);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000715 if (className != NULL) {
716 char *dot = strrchr(className, '.');
717 if (dot != NULL)
718 className = dot+1;
719 }
720
721 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000722 if (moduleName == NULL)
723 PyFile_WriteString("<unknown>", f);
724 else {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000725 char* modstr = _PyUnicode_AsString(moduleName);
Neal Norwitz2633c692007-02-26 22:22:47 +0000726 if (modstr &&
Georg Brandl1a3284e2007-12-02 09:40:06 +0000727 strcmp(modstr, "builtins") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000728 {
729 PyFile_WriteString(modstr, f);
730 PyFile_WriteString(".", f);
731 }
732 }
733 if (className == NULL)
734 PyFile_WriteString("<unknown>", f);
735 else
736 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000737 if (v && v != Py_None) {
738 PyFile_WriteString(": ", f);
739 PyFile_WriteObject(v, f, 0);
740 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000741 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000742 }
743 PyFile_WriteString(" in ", f);
744 PyFile_WriteObject(obj, f, 0);
745 PyFile_WriteString(" ignored\n", f);
746 PyErr_Clear(); /* Just in case */
747 }
748 Py_XDECREF(t);
749 Py_XDECREF(v);
750 Py_XDECREF(tb);
751}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000752
Armin Rigo092381a2003-10-25 14:29:27 +0000753extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000754
Guido van Rossum2fd45652001-02-28 21:46:24 +0000755
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000756/* Set file and line information for the current exception.
757 If the exception is not a SyntaxError, also sets additional attributes
758 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000759
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000760void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000761PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000762{
763 PyObject *exc, *v, *tb, *tmp;
764
765 /* add attributes for the line number and filename for the error */
766 PyErr_Fetch(&exc, &v, &tb);
767 PyErr_NormalizeException(&exc, &v, &tb);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000768 /* XXX check that it is, indeed, a syntax error. It might not
769 * be, though. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000770 tmp = PyLong_FromLong(lineno);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000771 if (tmp == NULL)
772 PyErr_Clear();
773 else {
774 if (PyObject_SetAttrString(v, "lineno", tmp))
775 PyErr_Clear();
776 Py_DECREF(tmp);
777 }
778 if (filename != NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000779 tmp = PyUnicode_FromString(filename);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000780 if (tmp == NULL)
781 PyErr_Clear();
782 else {
783 if (PyObject_SetAttrString(v, "filename", tmp))
784 PyErr_Clear();
785 Py_DECREF(tmp);
786 }
787
788 tmp = PyErr_ProgramText(filename, lineno);
789 if (tmp) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000790 if (PyObject_SetAttrString(v, "text", tmp))
791 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000792 Py_DECREF(tmp);
793 }
794 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000795 if (PyObject_SetAttrString(v, "offset", Py_None)) {
796 PyErr_Clear();
797 }
798 if (exc != PyExc_SyntaxError) {
799 if (!PyObject_HasAttrString(v, "msg")) {
800 tmp = PyObject_Str(v);
801 if (tmp) {
802 if (PyObject_SetAttrString(v, "msg", tmp))
803 PyErr_Clear();
804 Py_DECREF(tmp);
805 } else {
806 PyErr_Clear();
807 }
808 }
809 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
810 if (PyObject_SetAttrString(v, "print_file_and_line",
811 Py_None))
812 PyErr_Clear();
813 }
814 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000815 PyErr_Restore(exc, v, tb);
816}
817
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000818/* Attempt to load the line of text that the exception refers to. If it
819 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000820
821 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000822 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000823
824PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000825PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000826{
827 FILE *fp;
828 int i;
829 char linebuf[1000];
830
Tim Petersa7444f42006-02-27 23:29:46 +0000831 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000832 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000833 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000834 if (fp == NULL)
835 return NULL;
836 for (i = 0; i < lineno; i++) {
837 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
838 do {
839 *pLastChar = '\0';
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000840 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
841 fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000842 break;
843 /* fgets read *something*; if it didn't get as
844 far as pLastChar, it must have found a newline
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000846 it obviously found a newline; else we haven't
847 yet seen a newline, so must continue */
848 } while (*pLastChar != '\0' && *pLastChar != '\n');
849 }
850 fclose(fp);
851 if (i == lineno) {
852 char *p = linebuf;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000853 PyObject *res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000854 while (*p == ' ' || *p == '\t' || *p == '\014')
855 p++;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000856 res = PyUnicode_FromString(p);
857 if (res == NULL)
858 PyErr_Clear();
859 return res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000860 }
861 return NULL;
862}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000863
864#ifdef __cplusplus
865}
866#endif