blob: e151cab17cb56be1a38b9d5af46fa86adcf7083d [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
Victor Stinnerbd303c12013-11-07 23:07:29 +010023_Py_IDENTIFIER(builtins);
24_Py_IDENTIFIER(stderr);
25
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000026
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000028PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 PyThreadState *tstate = PyThreadState_GET();
31 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
34 /* XXX Should never happen -- fatal error instead? */
35 /* Well, it could be None. */
36 Py_DECREF(traceback);
37 traceback = NULL;
38 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 /* Save these in locals to safeguard against recursive
41 invocation through Py_XDECREF */
42 oldtype = tstate->curexc_type;
43 oldvalue = tstate->curexc_value;
44 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 tstate->curexc_type = type;
47 tstate->curexc_value = value;
48 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 Py_XDECREF(oldtype);
51 Py_XDECREF(oldvalue);
52 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053}
54
55void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000056PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 PyThreadState *tstate = PyThreadState_GET();
59 PyObject *exc_value;
60 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 if (exception != NULL &&
63 !PyExceptionClass_Check(exception)) {
64 PyErr_Format(PyExc_SystemError,
65 "exception %R not a BaseException subclass",
66 exception);
67 return;
68 }
69 Py_XINCREF(value);
70 exc_value = tstate->exc_value;
71 if (exc_value != NULL && exc_value != Py_None) {
72 /* Implicit exception chaining */
73 Py_INCREF(exc_value);
74 if (value == NULL || !PyExceptionInstance_Check(value)) {
75 /* We must normalize the value right now */
76 PyObject *args, *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +010077
78 /* Issue #23571: PyEval_CallObject() must not be called with an
79 exception set */
Victor Stinnerace47d72013-07-18 01:41:08 +020080 PyErr_Clear();
Victor Stinnerde821be2015-03-24 12:41:23 +010081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 if (value == NULL || value == Py_None)
83 args = PyTuple_New(0);
84 else if (PyTuple_Check(value)) {
85 Py_INCREF(value);
86 args = value;
87 }
88 else
89 args = PyTuple_Pack(1, value);
90 fixed_value = args ?
91 PyEval_CallObject(exception, args) : NULL;
92 Py_XDECREF(args);
93 Py_XDECREF(value);
94 if (fixed_value == NULL)
95 return;
96 value = fixed_value;
97 }
98 /* Avoid reference cycles through the context chain.
99 This is O(chain length) but context chains are
100 usually very short. Sensitive readers may try
101 to inline the call to PyException_GetContext. */
102 if (exc_value != value) {
103 PyObject *o = exc_value, *context;
104 while ((context = PyException_GetContext(o))) {
105 Py_DECREF(context);
106 if (context == value) {
107 PyException_SetContext(o, NULL);
108 break;
109 }
110 o = context;
111 }
112 PyException_SetContext(value, exc_value);
113 } else {
114 Py_DECREF(exc_value);
115 }
116 }
117 if (value != NULL && PyExceptionInstance_Check(value))
118 tb = PyException_GetTraceback(value);
119 Py_XINCREF(exception);
120 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Raymond Hettinger69492da2013-09-02 15:59:26 -0700123/* Set a key error with the specified argument, wrapping it in a
124 * tuple automatically so that tuple keys are not unpacked as the
125 * exception arguments. */
126void
127_PyErr_SetKeyError(PyObject *arg)
128{
129 PyObject *tup;
130 tup = PyTuple_Pack(1, arg);
131 if (!tup)
132 return; /* caller will expect error to be set anyway */
133 PyErr_SetObject(PyExc_KeyError, tup);
134 Py_DECREF(tup);
135}
136
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000138PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
143void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 PyObject *value = PyUnicode_FromString(string);
147 PyErr_SetObject(exception, value);
148 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149}
150
Guido van Rossum3a241811994-08-29 12:14:12 +0000151
Guido van Rossum373c8691997-04-29 18:22:47 +0000152PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000153PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154{
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100155 PyThreadState *tstate = _PyThreadState_UncheckedGet();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000156 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157}
158
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000159
160int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 if (err == NULL || exc == NULL) {
164 /* maybe caused by "import exceptions" that failed early on */
165 return 0;
166 }
167 if (PyTuple_Check(exc)) {
168 Py_ssize_t i, n;
169 n = PyTuple_Size(exc);
170 for (i = 0; i < n; i++) {
171 /* Test recursively */
172 if (PyErr_GivenExceptionMatches(
173 err, PyTuple_GET_ITEM(exc, i)))
174 {
175 return 1;
176 }
177 }
178 return 0;
179 }
180 /* err might be an instance, so check its class. */
181 if (PyExceptionInstance_Check(err))
182 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
185 int res = 0;
186 PyObject *exception, *value, *tb;
187 PyErr_Fetch(&exception, &value, &tb);
188 /* PyObject_IsSubclass() can recurse and therefore is
189 not safe (see test_bad_getattr in test.pickletester). */
190 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
191 /* This function must not fail, so print the error here */
192 if (res == -1) {
193 PyErr_WriteUnraisable(err);
194 res = 0;
195 }
196 PyErr_Restore(exception, value, tb);
197 return res;
198 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000201}
Guido van Rossum743007d1999-04-21 15:27:31 +0000202
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000203
204int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000205PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000208}
209
210
211/* Used in many places to normalize a raised exception, including in
212 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000213
214 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000216*/
217void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 PyObject *type = *exc;
221 PyObject *value = *val;
222 PyObject *inclass = NULL;
223 PyObject *initial_tb = NULL;
224 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (type == NULL) {
227 /* There was no exception, so nothing to do. */
228 return;
229 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 /* If PyErr_SetNone() was used, the value will have been actually
232 set to NULL.
233 */
234 if (!value) {
235 value = Py_None;
236 Py_INCREF(value);
237 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (PyExceptionInstance_Check(value))
240 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 /* Normalize the exception so that if the type is a class, the
243 value will be an instance.
244 */
245 if (PyExceptionClass_Check(type)) {
Victor Stinner74a7fa62013-07-17 00:44:53 +0200246 int is_subclass;
247 if (inclass) {
248 is_subclass = PyObject_IsSubclass(inclass, type);
249 if (is_subclass < 0)
250 goto finally;
251 }
252 else
253 is_subclass = 0;
254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 /* if the value was not an instance, or is not an instance
256 whose class is (or is derived from) type, then use the
257 value as an argument to instantiation of the type
258 class.
259 */
Victor Stinner74a7fa62013-07-17 00:44:53 +0200260 if (!inclass || !is_subclass) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 PyObject *args, *res;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 if (value == Py_None)
264 args = PyTuple_New(0);
265 else if (PyTuple_Check(value)) {
266 Py_INCREF(value);
267 args = value;
268 }
269 else
270 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (args == NULL)
273 goto finally;
274 res = PyEval_CallObject(type, args);
275 Py_DECREF(args);
276 if (res == NULL)
277 goto finally;
278 Py_DECREF(value);
279 value = res;
280 }
281 /* if the class of the instance doesn't exactly match the
282 class of the type, believe the instance
283 */
284 else if (inclass != type) {
285 Py_DECREF(type);
286 type = inclass;
287 Py_INCREF(type);
288 }
289 }
290 *exc = type;
291 *val = value;
292 return;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000293finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 Py_DECREF(type);
295 Py_DECREF(value);
296 /* If the new exception doesn't set a traceback and the old
297 exception had a traceback, use the old traceback for the
298 new exception. It's better than nothing.
299 */
300 initial_tb = *tb;
301 PyErr_Fetch(exc, val, tb);
302 if (initial_tb != NULL) {
303 if (*tb == NULL)
304 *tb = initial_tb;
305 else
306 Py_DECREF(initial_tb);
307 }
308 /* normalize recursively */
309 tstate = PyThreadState_GET();
310 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
311 --tstate->recursion_depth;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200312 /* throw away the old exception and use the recursion error instead */
313 Py_INCREF(PyExc_RecursionError);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +0300314 Py_SETREF(*exc, PyExc_RecursionError);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200315 Py_INCREF(PyExc_RecursionErrorInst);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +0300316 Py_SETREF(*val, PyExc_RecursionErrorInst);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 /* just keeping the old traceback */
318 return;
319 }
320 PyErr_NormalizeException(exc, val, tb);
321 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000322}
323
324
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000326PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 *p_type = tstate->curexc_type;
331 *p_value = tstate->curexc_value;
332 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 tstate->curexc_type = NULL;
335 tstate->curexc_value = NULL;
336 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337}
338
339void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000340PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000344
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200345void
346PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
347{
348 PyThreadState *tstate = PyThreadState_GET();
349
350 *p_type = tstate->exc_type;
351 *p_value = tstate->exc_value;
352 *p_traceback = tstate->exc_traceback;
353
354 Py_XINCREF(*p_type);
355 Py_XINCREF(*p_value);
356 Py_XINCREF(*p_traceback);
357}
358
359void
360PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
361{
362 PyObject *oldtype, *oldvalue, *oldtraceback;
363 PyThreadState *tstate = PyThreadState_GET();
364
365 oldtype = tstate->exc_type;
366 oldvalue = tstate->exc_value;
367 oldtraceback = tstate->exc_traceback;
368
369 tstate->exc_type = p_type;
370 tstate->exc_value = p_value;
371 tstate->exc_traceback = p_traceback;
372
373 Py_XDECREF(oldtype);
374 Py_XDECREF(oldvalue);
375 Py_XDECREF(oldtraceback);
376}
377
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300378/* Like PyErr_Restore(), but if an exception is already set,
379 set the context associated with it.
380 */
381void
382_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
383{
384 if (exc == NULL)
385 return;
386
387 if (PyErr_Occurred()) {
388 PyObject *exc2, *val2, *tb2;
389 PyErr_Fetch(&exc2, &val2, &tb2);
390 PyErr_NormalizeException(&exc, &val, &tb);
391 Py_DECREF(exc);
392 Py_XDECREF(tb);
393 PyErr_NormalizeException(&exc2, &val2, &tb2);
394 PyException_SetContext(val2, val);
395 PyErr_Restore(exc2, val2, tb2);
396 }
397 else {
398 PyErr_Restore(exc, val, tb);
399 }
400}
401
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000402/* Convenience functions to set a type error exception and return 0 */
403
404int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000405PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 PyErr_SetString(PyExc_TypeError,
408 "bad argument type for built-in operation");
409 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000410}
411
Guido van Rossum373c8691997-04-29 18:22:47 +0000412PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000414{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200415 if (Py_TYPE(PyExc_MemoryError) == NULL) {
416 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
417 initialized by _PyExc_Init() */
418 Py_FatalError("Out of memory and PyExc_MemoryError is not "
419 "initialized yet");
420 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000421 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000423}
424
Guido van Rossum373c8691997-04-29 18:22:47 +0000425PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000426PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000427{
Larry Hastingsb0827312014-02-09 22:05:19 -0800428 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
429}
430
431PyObject *
432PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200435 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100437#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000439#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000440
Guido van Rossume9fbc091995-02-18 14:52:19 +0000441#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 if (i == EINTR && PyErr_CheckSignals())
443 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000444#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000445
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000446#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100447 if (i != 0) {
448 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100449 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100450 }
451 else {
452 /* Sometimes errno didn't get set */
453 message = PyUnicode_FromString("Error");
454 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000455#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 if (i == 0)
457 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
458 else
459 {
460 /* Note that the Win32 errors do not lineup with the
461 errno error. So if the error is in the MSVC error
462 table, we use it, otherwise we assume it really _is_
463 a Win32 error code
464 */
465 if (i > 0 && i < _sys_nerr) {
466 message = PyUnicode_FromString(_sys_errlist[i]);
467 }
468 else {
469 int len = FormatMessageW(
470 FORMAT_MESSAGE_ALLOCATE_BUFFER |
471 FORMAT_MESSAGE_FROM_SYSTEM |
472 FORMAT_MESSAGE_IGNORE_INSERTS,
473 NULL, /* no message source */
474 i,
475 MAKELANGID(LANG_NEUTRAL,
476 SUBLANG_DEFAULT),
477 /* Default language */
478 (LPWSTR) &s_buf,
479 0, /* size not used */
480 NULL); /* no args */
481 if (len==0) {
482 /* Only ever seen this in out-of-mem
483 situations */
484 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300485 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 } else {
487 /* remove trailing cr/lf and dots */
488 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
489 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200490 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 }
492 }
493 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000494#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if (message == NULL)
497 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000498#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return NULL;
502 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000503
Larry Hastingsb0827312014-02-09 22:05:19 -0800504 if (filenameObject != NULL) {
505 if (filenameObject2 != NULL)
506 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
507 else
508 args = Py_BuildValue("(iOO)", i, message, filenameObject);
509 } else {
510 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200511 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800512 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000514
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200515 if (args != NULL) {
516 v = PyObject_Call(exc, args, NULL);
517 Py_DECREF(args);
518 if (v != NULL) {
519 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
520 Py_DECREF(v);
521 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000523#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000527}
Guido van Rossum743007d1999-04-21 15:27:31 +0000528
Barry Warsaw97d95151998-07-23 16:05:56 +0000529PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000530PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800533 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 Py_XDECREF(name);
535 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000536}
537
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000538#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000539PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000540PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 PyObject *name = filename ?
543 PyUnicode_FromUnicode(filename, wcslen(filename)) :
544 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800545 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 Py_XDECREF(name);
547 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000548}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000549#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000550
551PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000552PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000553{
Larry Hastingsb0827312014-02-09 22:05:19 -0800554 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000555}
Guido van Rossum683a0721990-10-21 22:09:12 +0000556
Brett Cannonbf364092006-03-01 04:25:17 +0000557#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000558/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000559PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 PyObject *exc,
561 int ierr,
562 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000563{
Larry Hastingsb0827312014-02-09 22:05:19 -0800564 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
565 filenameObject, NULL);
566}
567
568PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
569 PyObject *exc,
570 int ierr,
571 PyObject *filenameObject,
572 PyObject *filenameObject2)
573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 int len;
575 WCHAR *s_buf = NULL; /* Free via LocalFree */
576 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200577 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 DWORD err = (DWORD)ierr;
579 if (err==0) err = GetLastError();
580 len = FormatMessageW(
581 /* Error API error */
582 FORMAT_MESSAGE_ALLOCATE_BUFFER |
583 FORMAT_MESSAGE_FROM_SYSTEM |
584 FORMAT_MESSAGE_IGNORE_INSERTS,
585 NULL, /* no message source */
586 err,
587 MAKELANGID(LANG_NEUTRAL,
588 SUBLANG_DEFAULT), /* Default language */
589 (LPWSTR) &s_buf,
590 0, /* size not used */
591 NULL); /* no args */
592 if (len==0) {
593 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300594 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 s_buf = NULL;
596 } else {
597 /* remove trailing cr/lf and dots */
598 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
599 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200600 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 if (message == NULL)
604 {
605 LocalFree(s_buf);
606 return NULL;
607 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000608
Larry Hastingsb0827312014-02-09 22:05:19 -0800609 if (filenameObject == NULL) {
610 assert(filenameObject2 == NULL);
611 filenameObject = filenameObject2 = Py_None;
612 }
613 else if (filenameObject2 == NULL)
614 filenameObject2 = Py_None;
615 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200616 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800617 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000619
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200620 if (args != NULL) {
621 v = PyObject_Call(exc, args, NULL);
622 Py_DECREF(args);
623 if (v != NULL) {
624 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
625 Py_DECREF(v);
626 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 }
628 LocalFree(s_buf);
629 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000630}
631
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000632PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 PyObject *exc,
634 int ierr,
635 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000636{
Victor Stinner92be9392010-12-28 00:28:21 +0000637 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800638 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800640 name,
641 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 Py_XDECREF(name);
643 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000644}
645
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000646PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 PyObject *exc,
648 int ierr,
649 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyObject *name = filename ?
652 PyUnicode_FromUnicode(filename, wcslen(filename)) :
653 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800654 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800656 name,
657 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_XDECREF(name);
659 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000660}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000661
Thomas Heller085358a2002-07-29 14:27:41 +0000662PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
663{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800664 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000665}
666
Guido van Rossum795e1892000-02-17 15:19:15 +0000667PyObject *PyErr_SetFromWindowsErr(int ierr)
668{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800669 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
670 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800671}
672
Thomas Heller085358a2002-07-29 14:27:41 +0000673PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 int ierr,
675 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000676{
Victor Stinner92be9392010-12-28 00:28:21 +0000677 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800678 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200679 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800680 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 Py_XDECREF(name);
682 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000683}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000684
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000685PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 int ierr,
687 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 PyObject *name = filename ?
690 PyUnicode_FromUnicode(filename, wcslen(filename)) :
691 NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800692 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200693 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800694 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 Py_XDECREF(name);
696 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000697}
Guido van Rossum795e1892000-02-17 15:19:15 +0000698#endif /* MS_WINDOWS */
699
Brett Cannon79ec55e2012-04-12 20:24:54 -0400700PyObject *
Brett Cannon82da8882013-07-04 17:48:16 -0400701PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400702{
Brian Curtin09b86d12012-04-17 16:57:09 -0500703 PyObject *args, *kwargs, *error;
704
Brett Cannon82da8882013-07-04 17:48:16 -0400705 if (msg == NULL)
Brian Curtin94c001b2012-04-18 08:30:51 -0500706 return NULL;
707
Antoine Pitrouec9bac42012-04-18 16:57:54 +0200708 args = PyTuple_New(1);
Brian Curtin09b86d12012-04-17 16:57:09 -0500709 if (args == NULL)
710 return NULL;
711
712 kwargs = PyDict_New();
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400713 if (kwargs == NULL) {
714 Py_DECREF(args);
Brian Curtin09b86d12012-04-17 16:57:09 -0500715 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400716 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500717
Brian Curtin94c001b2012-04-18 08:30:51 -0500718 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500719 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500720 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500721
Brian Curtin94c001b2012-04-18 08:30:51 -0500722 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500723 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500724 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500725
726 Py_INCREF(msg);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400727 PyTuple_SET_ITEM(args, 0, msg);
Victor Stinner479054b2013-07-17 21:54:25 +0200728
729 if (PyDict_SetItemString(kwargs, "name", name) < 0)
Berker Peksagec766d32016-05-01 09:06:36 +0300730 goto done;
Victor Stinner479054b2013-07-17 21:54:25 +0200731 if (PyDict_SetItemString(kwargs, "path", path) < 0)
Berker Peksagec766d32016-05-01 09:06:36 +0300732 goto done;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400733
Brett Cannon82da8882013-07-04 17:48:16 -0400734 error = PyObject_Call(PyExc_ImportError, args, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400735 if (error != NULL) {
736 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500737 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400738 }
739
Berker Peksagec766d32016-05-01 09:06:36 +0300740done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400741 Py_DECREF(args);
742 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500743 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400744}
745
Guido van Rossum683a0721990-10-21 22:09:12 +0000746void
Neal Norwitzb382b842007-08-24 20:00:37 +0000747_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 PyErr_Format(PyExc_SystemError,
750 "%s:%d: bad argument to internal function",
751 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000752}
753
754/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
755 export the entry point for existing object code: */
756#undef PyErr_BadInternalCall
757void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000758PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000759{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200760 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 PyErr_Format(PyExc_SystemError,
762 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000763}
Fred Drake6d63adf2000-08-24 22:38:39 +0000764#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
765
Guido van Rossum1548bac1997-02-14 17:09:47 +0000766
Guido van Rossum1548bac1997-02-14 17:09:47 +0000767PyObject *
Antoine Pitrou0676a402014-09-30 21:16:27 +0200768PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000771
Victor Stinnerde821be2015-03-24 12:41:23 +0100772 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
773 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerace47d72013-07-18 01:41:08 +0200774 PyErr_Clear();
Victor Stinnerace47d72013-07-18 01:41:08 +0200775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 PyErr_SetObject(exception, string);
779 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000781}
Guido van Rossum7617e051997-09-16 18:43:50 +0000782
783
Antoine Pitrou0676a402014-09-30 21:16:27 +0200784PyObject *
785PyErr_Format(PyObject *exception, const char *format, ...)
786{
787 va_list vargs;
788#ifdef HAVE_STDARG_PROTOTYPES
789 va_start(vargs, format);
790#else
791 va_start(vargs);
792#endif
793 PyErr_FormatV(exception, format, vargs);
794 va_end(vargs);
795 return NULL;
796}
797
Thomas Wouters477c8d52006-05-27 19:21:47 +0000798
Guido van Rossum7617e051997-09-16 18:43:50 +0000799PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000800PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 const char *dot;
803 PyObject *modulename = NULL;
804 PyObject *classname = NULL;
805 PyObject *mydict = NULL;
806 PyObject *bases = NULL;
807 PyObject *result = NULL;
808 dot = strrchr(name, '.');
809 if (dot == NULL) {
810 PyErr_SetString(PyExc_SystemError,
811 "PyErr_NewException: name must be module.class");
812 return NULL;
813 }
814 if (base == NULL)
815 base = PyExc_Exception;
816 if (dict == NULL) {
817 dict = mydict = PyDict_New();
818 if (dict == NULL)
819 goto failure;
820 }
821 if (PyDict_GetItemString(dict, "__module__") == NULL) {
822 modulename = PyUnicode_FromStringAndSize(name,
823 (Py_ssize_t)(dot-name));
824 if (modulename == NULL)
825 goto failure;
826 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
827 goto failure;
828 }
829 if (PyTuple_Check(base)) {
830 bases = base;
831 /* INCREF as we create a new ref in the else branch */
832 Py_INCREF(bases);
833 } else {
834 bases = PyTuple_Pack(1, base);
835 if (bases == NULL)
836 goto failure;
837 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100838 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000839 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000841 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 Py_XDECREF(bases);
843 Py_XDECREF(mydict);
844 Py_XDECREF(classname);
845 Py_XDECREF(modulename);
846 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000847}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000848
Georg Brandl1e28a272009-12-28 08:41:01 +0000849
850/* Create an exception with docstring */
851PyObject *
852PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 int result;
856 PyObject *ret = NULL;
857 PyObject *mydict = NULL; /* points to the dict only if we create it */
858 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 if (dict == NULL) {
861 dict = mydict = PyDict_New();
862 if (dict == NULL) {
863 return NULL;
864 }
865 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 if (doc != NULL) {
868 docobj = PyUnicode_FromString(doc);
869 if (docobj == NULL)
870 goto failure;
871 result = PyDict_SetItemString(dict, "__doc__", docobj);
872 Py_DECREF(docobj);
873 if (result < 0)
874 goto failure;
875 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000878 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 Py_XDECREF(mydict);
880 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000881}
882
883
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000884/* Call when an exception has occurred but there is no way for Python
885 to handle it. Examples: exception in __del__ or during GC. */
886void
887PyErr_WriteUnraisable(PyObject *obj)
888{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200889 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 PyObject *f, *t, *v, *tb;
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200891 PyObject *moduleName = NULL;
892 char* className;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000893
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200894 PyErr_Fetch(&t, &v, &tb);
895
Victor Stinnerbd303c12013-11-07 23:07:29 +0100896 f = _PySys_GetObjectId(&PyId_stderr);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200897 if (f == NULL || f == Py_None)
898 goto done;
899
900 if (obj) {
901 if (PyFile_WriteString("Exception ignored in: ", f) < 0)
902 goto done;
Martin Panter3263f682016-02-28 03:16:11 +0000903 if (PyFile_WriteObject(obj, f, 0) < 0) {
904 PyErr_Clear();
905 if (PyFile_WriteString("<object repr() failed>", f) < 0) {
906 goto done;
907 }
908 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200909 if (PyFile_WriteString("\n", f) < 0)
910 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200912
913 if (PyTraceBack_Print(tb, f) < 0)
914 goto done;
915
916 if (!t)
917 goto done;
918
919 assert(PyExceptionClass_Check(t));
920 className = PyExceptionClass_Name(t);
921 if (className != NULL) {
922 char *dot = strrchr(className, '.');
923 if (dot != NULL)
924 className = dot+1;
925 }
926
927 moduleName = _PyObject_GetAttrId(t, &PyId___module__);
928 if (moduleName == NULL) {
929 PyErr_Clear();
930 if (PyFile_WriteString("<unknown>", f) < 0)
931 goto done;
932 }
933 else {
Victor Stinnerbd303c12013-11-07 23:07:29 +0100934 if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200935 if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
936 goto done;
937 if (PyFile_WriteString(".", f) < 0)
938 goto done;
939 }
940 }
941 if (className == NULL) {
942 if (PyFile_WriteString("<unknown>", f) < 0)
943 goto done;
944 }
945 else {
946 if (PyFile_WriteString(className, f) < 0)
947 goto done;
948 }
949
950 if (v && v != Py_None) {
951 if (PyFile_WriteString(": ", f) < 0)
952 goto done;
Martin Panter3263f682016-02-28 03:16:11 +0000953 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) {
954 PyErr_Clear();
955 if (PyFile_WriteString("<exception str() failed>", f) < 0) {
956 goto done;
957 }
958 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200959 }
960 if (PyFile_WriteString("\n", f) < 0)
961 goto done;
962
963done:
964 Py_XDECREF(moduleName);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 Py_XDECREF(t);
966 Py_XDECREF(v);
967 Py_XDECREF(tb);
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200968 PyErr_Clear(); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000969}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000970
Armin Rigo092381a2003-10-25 14:29:27 +0000971extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000972
Guido van Rossum2fd45652001-02-28 21:46:24 +0000973
Benjamin Peterson2c539712010-09-20 22:42:10 +0000974void
Victor Stinner14e461d2013-08-26 22:28:21 +0200975PyErr_SyntaxLocation(const char *filename, int lineno)
976{
Benjamin Peterson2c539712010-09-20 22:42:10 +0000977 PyErr_SyntaxLocationEx(filename, lineno, -1);
978}
979
980
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000981/* Set file and line information for the current exception.
982 If the exception is not a SyntaxError, also sets additional attributes
983 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000984
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000985void
Victor Stinner14e461d2013-08-26 22:28:21 +0200986PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200989 _Py_IDENTIFIER(filename);
990 _Py_IDENTIFIER(lineno);
991 _Py_IDENTIFIER(msg);
992 _Py_IDENTIFIER(offset);
993 _Py_IDENTIFIER(print_file_and_line);
994 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 /* add attributes for the line number and filename for the error */
997 PyErr_Fetch(&exc, &v, &tb);
998 PyErr_NormalizeException(&exc, &v, &tb);
999 /* XXX check that it is, indeed, a syntax error. It might not
1000 * be, though. */
1001 tmp = PyLong_FromLong(lineno);
1002 if (tmp == NULL)
1003 PyErr_Clear();
1004 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001005 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 PyErr_Clear();
1007 Py_DECREF(tmp);
1008 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001009 if (col_offset >= 0) {
1010 tmp = PyLong_FromLong(col_offset);
1011 if (tmp == NULL)
1012 PyErr_Clear();
1013 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001014 if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
Benjamin Peterson2c539712010-09-20 22:42:10 +00001015 PyErr_Clear();
1016 Py_DECREF(tmp);
1017 }
1018 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (filename != NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001020 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001022
Victor Stinner14e461d2013-08-26 22:28:21 +02001023 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001025 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 PyErr_Clear();
1027 Py_DECREF(tmp);
1028 }
1029 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001030 if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 PyErr_Clear();
1032 }
1033 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001034 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 tmp = PyObject_Str(v);
1036 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001037 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 PyErr_Clear();
1039 Py_DECREF(tmp);
1040 } else {
1041 PyErr_Clear();
1042 }
1043 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001044 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1045 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
1046 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 PyErr_Clear();
1048 }
1049 }
1050 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001051}
1052
Victor Stinner14e461d2013-08-26 22:28:21 +02001053void
1054PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1055{
1056 PyObject *fileobj;
1057 if (filename != NULL) {
1058 fileobj = PyUnicode_DecodeFSDefault(filename);
1059 if (fileobj == NULL)
1060 PyErr_Clear();
1061 }
1062 else
1063 fileobj = NULL;
1064 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1065 Py_XDECREF(fileobj);
1066}
1067
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001068/* Attempt to load the line of text that the exception refers to. If it
1069 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001070
1071 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001072 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001073
Antoine Pitrou409b5382013-10-12 22:41:17 +02001074static PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001075err_programtext(FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 int i;
1078 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 if (fp == NULL)
1081 return NULL;
1082 for (i = 0; i < lineno; i++) {
1083 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1084 do {
1085 *pLastChar = '\0';
1086 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1087 fp, NULL) == NULL)
1088 break;
1089 /* fgets read *something*; if it didn't get as
1090 far as pLastChar, it must have found a newline
1091 or hit the end of the file; if pLastChar is \n,
1092 it obviously found a newline; else we haven't
1093 yet seen a newline, so must continue */
1094 } while (*pLastChar != '\0' && *pLastChar != '\n');
1095 }
1096 fclose(fp);
1097 if (i == lineno) {
1098 char *p = linebuf;
1099 PyObject *res;
1100 while (*p == ' ' || *p == '\t' || *p == '\014')
1101 p++;
1102 res = PyUnicode_FromString(p);
1103 if (res == NULL)
1104 PyErr_Clear();
1105 return res;
1106 }
1107 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001108}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001109
Victor Stinner14e461d2013-08-26 22:28:21 +02001110PyObject *
1111PyErr_ProgramText(const char *filename, int lineno)
1112{
1113 FILE *fp;
1114 if (filename == NULL || *filename == '\0' || lineno <= 0)
1115 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001116 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001117 return err_programtext(fp, lineno);
1118}
1119
1120PyObject *
1121PyErr_ProgramTextObject(PyObject *filename, int lineno)
1122{
1123 FILE *fp;
1124 if (filename == NULL || lineno <= 0)
1125 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001126 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnere42ccd22015-03-18 01:39:23 +01001127 if (fp == NULL) {
1128 PyErr_Clear();
1129 return NULL;
1130 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001131 return err_programtext(fp, lineno);
1132}
1133
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001134#ifdef __cplusplus
1135}
1136#endif