blob: 1b8b7eeb0e743fce596520213291be75b686dee9 [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"
Victor Stinneref9d9b62019-05-22 11:28:22 +02005#include "pycore_coreconfig.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01006#include "pycore_pystate.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +02007#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00008
Guido van Rossum53e8d441995-03-09 12:11:31 +00009#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000010#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000011extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000012#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000013#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000014
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000015#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000016#include <windows.h>
17#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000018#endif
19
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000020#include <ctype.h>
21
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000022#ifdef __cplusplus
23extern "C" {
24#endif
25
Victor Stinnerbd303c12013-11-07 23:07:29 +010026_Py_IDENTIFIER(builtins);
27_Py_IDENTIFIER(stderr);
28
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000029
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000031PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032{
Victor Stinner50b48572018-11-01 01:51:40 +010033 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
37 /* XXX Should never happen -- fatal error instead? */
38 /* Well, it could be None. */
39 Py_DECREF(traceback);
40 traceback = NULL;
41 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 /* Save these in locals to safeguard against recursive
44 invocation through Py_XDECREF */
45 oldtype = tstate->curexc_type;
46 oldvalue = tstate->curexc_value;
47 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 tstate->curexc_type = type;
50 tstate->curexc_value = value;
51 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 Py_XDECREF(oldtype);
54 Py_XDECREF(oldvalue);
55 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056}
57
Mark Shannonae3087c2017-10-22 22:41:51 +010058_PyErr_StackItem *
59_PyErr_GetTopmostException(PyThreadState *tstate)
60{
61 _PyErr_StackItem *exc_info = tstate->exc_info;
62 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
63 exc_info->previous_item != NULL)
64 {
65 exc_info = exc_info->previous_item;
66 }
67 return exc_info;
68}
69
Victor Stinner3a840972016-08-22 23:59:08 +020070static PyObject*
71_PyErr_CreateException(PyObject *exception, PyObject *value)
72{
73 if (value == NULL || value == Py_None) {
74 return _PyObject_CallNoArg(exception);
75 }
76 else if (PyTuple_Check(value)) {
77 return PyObject_Call(exception, value, NULL);
78 }
79 else {
Victor Stinner7bfb42d2016-12-05 17:04:32 +010080 return PyObject_CallFunctionObjArgs(exception, value, NULL);
Victor Stinner3a840972016-08-22 23:59:08 +020081 }
82}
83
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Victor Stinner50b48572018-11-01 01:51:40 +010087 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 PyObject *exc_value;
89 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 if (exception != NULL &&
92 !PyExceptionClass_Check(exception)) {
93 PyErr_Format(PyExc_SystemError,
94 "exception %R not a BaseException subclass",
95 exception);
96 return;
97 }
Victor Stinner3a840972016-08-22 23:59:08 +020098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100100 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 if (exc_value != NULL && exc_value != Py_None) {
102 /* Implicit exception chaining */
103 Py_INCREF(exc_value);
104 if (value == NULL || !PyExceptionInstance_Check(value)) {
105 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200106 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100107
Victor Stinner3a840972016-08-22 23:59:08 +0200108 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100109 exception set */
Victor Stinnerace47d72013-07-18 01:41:08 +0200110 PyErr_Clear();
Victor Stinnerde821be2015-03-24 12:41:23 +0100111
Victor Stinner3a840972016-08-22 23:59:08 +0200112 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200114 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300115 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200117 }
118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 value = fixed_value;
120 }
Victor Stinner3a840972016-08-22 23:59:08 +0200121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 /* Avoid reference cycles through the context chain.
123 This is O(chain length) but context chains are
124 usually very short. Sensitive readers may try
125 to inline the call to PyException_GetContext. */
126 if (exc_value != value) {
127 PyObject *o = exc_value, *context;
128 while ((context = PyException_GetContext(o))) {
129 Py_DECREF(context);
130 if (context == value) {
131 PyException_SetContext(o, NULL);
132 break;
133 }
134 o = context;
135 }
136 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200137 }
138 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 Py_DECREF(exc_value);
140 }
141 }
142 if (value != NULL && PyExceptionInstance_Check(value))
143 tb = PyException_GetTraceback(value);
144 Py_XINCREF(exception);
145 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146}
147
Raymond Hettinger69492da2013-09-02 15:59:26 -0700148/* Set a key error with the specified argument, wrapping it in a
149 * tuple automatically so that tuple keys are not unpacked as the
150 * exception arguments. */
151void
152_PyErr_SetKeyError(PyObject *arg)
153{
154 PyObject *tup;
155 tup = PyTuple_Pack(1, arg);
156 if (!tup)
157 return; /* caller will expect error to be set anyway */
158 PyErr_SetObject(PyExc_KeyError, tup);
159 Py_DECREF(tup);
160}
161
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000163PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166}
167
168void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 PyObject *value = PyUnicode_FromString(string);
172 PyErr_SetObject(exception, value);
173 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Guido van Rossum3a241811994-08-29 12:14:12 +0000176
Victor Stinnerc6944e72016-11-11 02:13:35 +0100177PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Victor Stinner50b48572018-11-01 01:51:40 +0100180 PyThreadState *tstate = _PyThreadState_GET();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +0000181 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000184
185int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000186PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 if (err == NULL || exc == NULL) {
189 /* maybe caused by "import exceptions" that failed early on */
190 return 0;
191 }
192 if (PyTuple_Check(exc)) {
193 Py_ssize_t i, n;
194 n = PyTuple_Size(exc);
195 for (i = 0; i < n; i++) {
196 /* Test recursively */
197 if (PyErr_GivenExceptionMatches(
198 err, PyTuple_GET_ITEM(exc, i)))
199 {
200 return 1;
201 }
202 }
203 return 0;
204 }
205 /* err might be an instance, so check its class. */
206 if (PyExceptionInstance_Check(err))
207 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200210 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000214}
Guido van Rossum743007d1999-04-21 15:27:31 +0000215
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000216
217int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000221}
222
223
xdegaye56d1f5c2017-10-26 15:09:06 +0200224#ifndef Py_NORMALIZE_RECURSION_LIMIT
225#define Py_NORMALIZE_RECURSION_LIMIT 32
226#endif
227
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228/* Used in many places to normalize a raised exception, including in
229 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000230
231 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000233*/
Serhiy Storchakacf296532017-11-05 11:27:48 +0200234void
235PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000236{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200237 int recursion_depth = 0;
238 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000239
Serhiy Storchakacf296532017-11-05 11:27:48 +0200240 restart:
241 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (type == NULL) {
243 /* There was no exception, so nothing to do. */
244 return;
245 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000246
Serhiy Storchakacf296532017-11-05 11:27:48 +0200247 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 /* If PyErr_SetNone() was used, the value will have been actually
249 set to NULL.
250 */
251 if (!value) {
252 value = Py_None;
253 Py_INCREF(value);
254 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 /* Normalize the exception so that if the type is a class, the
257 value will be an instance.
258 */
259 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200260 PyObject *inclass = NULL;
261 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200262
Serhiy Storchakacf296532017-11-05 11:27:48 +0200263 if (PyExceptionInstance_Check(value)) {
264 inclass = PyExceptionInstance_Class(value);
265 is_subclass = PyObject_IsSubclass(inclass, type);
266 if (is_subclass < 0) {
267 goto error;
268 }
269 }
270
271 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 whose class is (or is derived from) type, then use the
273 value as an argument to instantiation of the type
274 class.
275 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200276 if (!is_subclass) {
277 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200278 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200279 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200282 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200284 /* If the class of the instance doesn't exactly match the
285 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 */
287 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200288 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 Py_DECREF(type);
290 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 }
292 }
293 *exc = type;
294 *val = value;
295 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200296
297 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 Py_DECREF(type);
299 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200300 recursion_depth++;
301 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200302 PyErr_SetString(PyExc_RecursionError, "maximum recursion depth "
303 "exceeded while normalizing an exception");
304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 /* If the new exception doesn't set a traceback and the old
306 exception had a traceback, use the old traceback for the
307 new exception. It's better than nothing.
308 */
309 initial_tb = *tb;
310 PyErr_Fetch(exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200311 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 if (initial_tb != NULL) {
313 if (*tb == NULL)
314 *tb = initial_tb;
315 else
316 Py_DECREF(initial_tb);
317 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200318 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
319 corresponding RecursionError could not be normalized, and the
320 MemoryError raised when normalize this RecursionError could not be
321 normalized. */
322 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200323 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
324 Py_FatalError("Cannot recover from MemoryErrors "
325 "while normalizing exceptions.");
326 }
327 else {
328 Py_FatalError("Cannot recover from the recursive normalization "
329 "of an exception.");
330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200332 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000333}
334
335
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000337PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338{
Victor Stinner50b48572018-11-01 01:51:40 +0100339 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 *p_type = tstate->curexc_type;
342 *p_value = tstate->curexc_value;
343 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 tstate->curexc_type = NULL;
346 tstate->curexc_value = NULL;
347 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348}
349
350void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000351PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000355
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200356void
357PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
358{
Victor Stinner50b48572018-11-01 01:51:40 +0100359 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200360
Mark Shannonae3087c2017-10-22 22:41:51 +0100361 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
362 *p_type = exc_info->exc_type;
363 *p_value = exc_info->exc_value;
364 *p_traceback = exc_info->exc_traceback;
365
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200366
367 Py_XINCREF(*p_type);
368 Py_XINCREF(*p_value);
369 Py_XINCREF(*p_traceback);
370}
371
372void
373PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
374{
375 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100376 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200377
Mark Shannonae3087c2017-10-22 22:41:51 +0100378 oldtype = tstate->exc_info->exc_type;
379 oldvalue = tstate->exc_info->exc_value;
380 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200381
Mark Shannonae3087c2017-10-22 22:41:51 +0100382 tstate->exc_info->exc_type = p_type;
383 tstate->exc_info->exc_value = p_value;
384 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200385
386 Py_XDECREF(oldtype);
387 Py_XDECREF(oldvalue);
388 Py_XDECREF(oldtraceback);
389}
390
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300391/* Like PyErr_Restore(), but if an exception is already set,
392 set the context associated with it.
393 */
394void
395_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
396{
397 if (exc == NULL)
398 return;
399
400 if (PyErr_Occurred()) {
401 PyObject *exc2, *val2, *tb2;
402 PyErr_Fetch(&exc2, &val2, &tb2);
403 PyErr_NormalizeException(&exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300404 if (tb != NULL) {
405 PyException_SetTraceback(val, tb);
406 Py_DECREF(tb);
407 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300408 Py_DECREF(exc);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300409 PyErr_NormalizeException(&exc2, &val2, &tb2);
410 PyException_SetContext(val2, val);
411 PyErr_Restore(exc2, val2, tb2);
412 }
413 else {
414 PyErr_Restore(exc, val, tb);
415 }
416}
417
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300418static PyObject *
419_PyErr_FormatVFromCause(PyObject *exception, const char *format, va_list vargs)
420{
421 PyObject *exc, *val, *val2, *tb;
422
423 assert(PyErr_Occurred());
424 PyErr_Fetch(&exc, &val, &tb);
425 PyErr_NormalizeException(&exc, &val, &tb);
426 if (tb != NULL) {
427 PyException_SetTraceback(val, tb);
428 Py_DECREF(tb);
429 }
430 Py_DECREF(exc);
431 assert(!PyErr_Occurred());
432
433 PyErr_FormatV(exception, format, vargs);
434
435 PyErr_Fetch(&exc, &val2, &tb);
436 PyErr_NormalizeException(&exc, &val2, &tb);
437 Py_INCREF(val);
438 PyException_SetCause(val2, val);
439 PyException_SetContext(val2, val);
440 PyErr_Restore(exc, val2, tb);
441
442 return NULL;
443}
444
445PyObject *
446_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
447{
448 va_list vargs;
449#ifdef HAVE_STDARG_PROTOTYPES
450 va_start(vargs, format);
451#else
452 va_start(vargs);
453#endif
454 _PyErr_FormatVFromCause(exception, format, vargs);
455 va_end(vargs);
456 return NULL;
457}
458
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000459/* Convenience functions to set a type error exception and return 0 */
460
461int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000462PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyErr_SetString(PyExc_TypeError,
465 "bad argument type for built-in operation");
466 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000467}
468
Guido van Rossum373c8691997-04-29 18:22:47 +0000469PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000470PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000471{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200472 if (Py_TYPE(PyExc_MemoryError) == NULL) {
473 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
474 initialized by _PyExc_Init() */
475 Py_FatalError("Out of memory and PyExc_MemoryError is not "
476 "initialized yet");
477 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000478 PyErr_SetNone(PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000480}
481
Guido van Rossum373c8691997-04-29 18:22:47 +0000482PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000483PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000484{
Larry Hastingsb0827312014-02-09 22:05:19 -0800485 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
486}
487
488PyObject *
489PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200492 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100494#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000496#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000497
Guido van Rossume9fbc091995-02-18 14:52:19 +0000498#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 if (i == EINTR && PyErr_CheckSignals())
500 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000501#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000502
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000503#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100504 if (i != 0) {
505 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100506 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100507 }
508 else {
509 /* Sometimes errno didn't get set */
510 message = PyUnicode_FromString("Error");
511 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (i == 0)
514 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
515 else
516 {
517 /* Note that the Win32 errors do not lineup with the
518 errno error. So if the error is in the MSVC error
519 table, we use it, otherwise we assume it really _is_
520 a Win32 error code
521 */
522 if (i > 0 && i < _sys_nerr) {
523 message = PyUnicode_FromString(_sys_errlist[i]);
524 }
525 else {
526 int len = FormatMessageW(
527 FORMAT_MESSAGE_ALLOCATE_BUFFER |
528 FORMAT_MESSAGE_FROM_SYSTEM |
529 FORMAT_MESSAGE_IGNORE_INSERTS,
530 NULL, /* no message source */
531 i,
532 MAKELANGID(LANG_NEUTRAL,
533 SUBLANG_DEFAULT),
534 /* Default language */
535 (LPWSTR) &s_buf,
536 0, /* size not used */
537 NULL); /* no args */
538 if (len==0) {
539 /* Only ever seen this in out-of-mem
540 situations */
541 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300542 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 } else {
544 /* remove trailing cr/lf and dots */
545 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
546 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200547 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 }
549 }
550 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000551#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 if (message == NULL)
554 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000555#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return NULL;
559 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000560
Larry Hastingsb0827312014-02-09 22:05:19 -0800561 if (filenameObject != NULL) {
562 if (filenameObject2 != NULL)
563 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
564 else
565 args = Py_BuildValue("(iOO)", i, message, filenameObject);
566 } else {
567 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200568 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800569 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000571
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200572 if (args != NULL) {
573 v = PyObject_Call(exc, args, NULL);
574 Py_DECREF(args);
575 if (v != NULL) {
576 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
577 Py_DECREF(v);
578 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000580#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000584}
Guido van Rossum743007d1999-04-21 15:27:31 +0000585
Barry Warsaw97d95151998-07-23 16:05:56 +0000586PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000587PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800590 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 Py_XDECREF(name);
592 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000593}
594
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000595#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000596PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000597PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000598{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200599 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800600 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 Py_XDECREF(name);
602 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000603}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000604#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000605
606PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000607PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000608{
Larry Hastingsb0827312014-02-09 22:05:19 -0800609 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000610}
Guido van Rossum683a0721990-10-21 22:09:12 +0000611
Brett Cannonbf364092006-03-01 04:25:17 +0000612#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000613/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000614PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PyObject *exc,
616 int ierr,
617 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000618{
Larry Hastingsb0827312014-02-09 22:05:19 -0800619 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
620 filenameObject, NULL);
621}
622
623PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
624 PyObject *exc,
625 int ierr,
626 PyObject *filenameObject,
627 PyObject *filenameObject2)
628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 int len;
630 WCHAR *s_buf = NULL; /* Free via LocalFree */
631 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200632 PyObject *args, *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 DWORD err = (DWORD)ierr;
634 if (err==0) err = GetLastError();
635 len = FormatMessageW(
636 /* Error API error */
637 FORMAT_MESSAGE_ALLOCATE_BUFFER |
638 FORMAT_MESSAGE_FROM_SYSTEM |
639 FORMAT_MESSAGE_IGNORE_INSERTS,
640 NULL, /* no message source */
641 err,
642 MAKELANGID(LANG_NEUTRAL,
643 SUBLANG_DEFAULT), /* Default language */
644 (LPWSTR) &s_buf,
645 0, /* size not used */
646 NULL); /* no args */
647 if (len==0) {
648 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300649 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 s_buf = NULL;
651 } else {
652 /* remove trailing cr/lf and dots */
653 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
654 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200655 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 if (message == NULL)
659 {
660 LocalFree(s_buf);
661 return NULL;
662 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000663
Larry Hastingsb0827312014-02-09 22:05:19 -0800664 if (filenameObject == NULL) {
665 assert(filenameObject2 == NULL);
666 filenameObject = filenameObject2 = Py_None;
667 }
668 else if (filenameObject2 == NULL)
669 filenameObject2 = Py_None;
670 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200671 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800672 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000674
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200675 if (args != NULL) {
676 v = PyObject_Call(exc, args, NULL);
677 Py_DECREF(args);
678 if (v != NULL) {
679 PyErr_SetObject((PyObject *) Py_TYPE(v), v);
680 Py_DECREF(v);
681 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 }
683 LocalFree(s_buf);
684 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000685}
686
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000687PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 PyObject *exc,
689 int ierr,
690 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000691{
Victor Stinner92be9392010-12-28 00:28:21 +0000692 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800693 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800695 name,
696 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 Py_XDECREF(name);
698 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000699}
700
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000701PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 PyObject *exc,
703 int ierr,
704 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000705{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200706 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800707 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800709 name,
710 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 Py_XDECREF(name);
712 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000713}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000714
Thomas Heller085358a2002-07-29 14:27:41 +0000715PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
716{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800717 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000718}
719
Guido van Rossum795e1892000-02-17 15:19:15 +0000720PyObject *PyErr_SetFromWindowsErr(int ierr)
721{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800722 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
723 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800724}
725
Thomas Heller085358a2002-07-29 14:27:41 +0000726PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 int ierr,
728 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000729{
Victor Stinner92be9392010-12-28 00:28:21 +0000730 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800731 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200732 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800733 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 Py_XDECREF(name);
735 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000736}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000737
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000738PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 int ierr,
740 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000741{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200742 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800743 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200744 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800745 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 Py_XDECREF(name);
747 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000748}
Guido van Rossum795e1892000-02-17 15:19:15 +0000749#endif /* MS_WINDOWS */
750
Brett Cannon79ec55e2012-04-12 20:24:54 -0400751PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700752PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
753 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400754{
Eric Snow46f97b82016-09-07 16:56:15 -0700755 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200756 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500757
Eric Snow46f97b82016-09-07 16:56:15 -0700758 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
759 if (issubclass < 0) {
760 return NULL;
761 }
762 else if (!issubclass) {
763 PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500764 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200765 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500766
Eric Snow46f97b82016-09-07 16:56:15 -0700767 if (msg == NULL) {
768 PyErr_SetString(PyExc_TypeError, "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500769 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400770 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500771
Brian Curtin94c001b2012-04-18 08:30:51 -0500772 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500773 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500774 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500775 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500776 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500777 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500778
Eric Snow46f97b82016-09-07 16:56:15 -0700779 kwargs = PyDict_New();
780 if (kwargs == NULL) {
781 return NULL;
782 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200783 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300784 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200785 }
786 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300787 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200788 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400789
Eric Snow46f97b82016-09-07 16:56:15 -0700790 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400791 if (error != NULL) {
792 PyErr_SetObject((PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500793 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400794 }
795
Berker Peksagec766d32016-05-01 09:06:36 +0300796done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400797 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500798 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400799}
800
Eric Snow46f97b82016-09-07 16:56:15 -0700801PyObject *
802PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
803{
804 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
805}
806
Guido van Rossum683a0721990-10-21 22:09:12 +0000807void
Neal Norwitzb382b842007-08-24 20:00:37 +0000808_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyErr_Format(PyExc_SystemError,
811 "%s:%d: bad argument to internal function",
812 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000813}
814
815/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
816 export the entry point for existing object code: */
817#undef PyErr_BadInternalCall
818void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000820{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200821 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 PyErr_Format(PyExc_SystemError,
823 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000824}
Fred Drake6d63adf2000-08-24 22:38:39 +0000825#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
826
Guido van Rossum1548bac1997-02-14 17:09:47 +0000827
Guido van Rossum1548bac1997-02-14 17:09:47 +0000828PyObject *
Antoine Pitrou0676a402014-09-30 21:16:27 +0200829PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000832
Victor Stinnerde821be2015-03-24 12:41:23 +0100833 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
834 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerace47d72013-07-18 01:41:08 +0200835 PyErr_Clear();
Victor Stinnerace47d72013-07-18 01:41:08 +0200836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 PyErr_SetObject(exception, string);
840 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000842}
Guido van Rossum7617e051997-09-16 18:43:50 +0000843
844
Antoine Pitrou0676a402014-09-30 21:16:27 +0200845PyObject *
846PyErr_Format(PyObject *exception, const char *format, ...)
847{
848 va_list vargs;
849#ifdef HAVE_STDARG_PROTOTYPES
850 va_start(vargs, format);
851#else
852 va_start(vargs);
853#endif
854 PyErr_FormatV(exception, format, vargs);
855 va_end(vargs);
856 return NULL;
857}
858
Thomas Wouters477c8d52006-05-27 19:21:47 +0000859
Guido van Rossum7617e051997-09-16 18:43:50 +0000860PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000861PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000862{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200863 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 const char *dot;
865 PyObject *modulename = NULL;
866 PyObject *classname = NULL;
867 PyObject *mydict = NULL;
868 PyObject *bases = NULL;
869 PyObject *result = NULL;
870 dot = strrchr(name, '.');
871 if (dot == NULL) {
872 PyErr_SetString(PyExc_SystemError,
873 "PyErr_NewException: name must be module.class");
874 return NULL;
875 }
876 if (base == NULL)
877 base = PyExc_Exception;
878 if (dict == NULL) {
879 dict = mydict = PyDict_New();
880 if (dict == NULL)
881 goto failure;
882 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200883 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
884 if (PyErr_Occurred()) {
885 goto failure;
886 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 modulename = PyUnicode_FromStringAndSize(name,
888 (Py_ssize_t)(dot-name));
889 if (modulename == NULL)
890 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200891 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 goto failure;
893 }
894 if (PyTuple_Check(base)) {
895 bases = base;
896 /* INCREF as we create a new ref in the else branch */
897 Py_INCREF(bases);
898 } else {
899 bases = PyTuple_Pack(1, base);
900 if (bases == NULL)
901 goto failure;
902 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100903 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000904 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000906 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_XDECREF(bases);
908 Py_XDECREF(mydict);
909 Py_XDECREF(classname);
910 Py_XDECREF(modulename);
911 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +0000912}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000913
Georg Brandl1e28a272009-12-28 08:41:01 +0000914
915/* Create an exception with docstring */
916PyObject *
917PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +0000919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 int result;
921 PyObject *ret = NULL;
922 PyObject *mydict = NULL; /* points to the dict only if we create it */
923 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 if (dict == NULL) {
926 dict = mydict = PyDict_New();
927 if (dict == NULL) {
928 return NULL;
929 }
930 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 if (doc != NULL) {
933 docobj = PyUnicode_FromString(doc);
934 if (docobj == NULL)
935 goto failure;
936 result = PyDict_SetItemString(dict, "__doc__", docobj);
937 Py_DECREF(docobj);
938 if (result < 0)
939 goto failure;
940 }
Georg Brandl1e28a272009-12-28 08:41:01 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +0000943 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 Py_XDECREF(mydict);
945 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +0000946}
947
948
Victor Stinneref9d9b62019-05-22 11:28:22 +0200949PyDoc_STRVAR(UnraisableHookArgs__doc__,
950"UnraisableHookArgs\n\
951\n\
952Type used to pass arguments to sys.unraisablehook.");
953
954static PyTypeObject UnraisableHookArgsType;
955
956static PyStructSequence_Field UnraisableHookArgs_fields[] = {
957 {"exc_type", "Exception type"},
958 {"exc_value", "Exception value"},
959 {"exc_traceback", "Exception traceback"},
960 {"object", "Object causing the exception"},
961 {0}
962};
963
964static PyStructSequence_Desc UnraisableHookArgs_desc = {
965 .name = "UnraisableHookArgs",
966 .doc = UnraisableHookArgs__doc__,
967 .fields = UnraisableHookArgs_fields,
968 .n_in_sequence = 4
969};
970
971
972_PyInitError
973_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000974{
Victor Stinneref9d9b62019-05-22 11:28:22 +0200975 if (UnraisableHookArgsType.tp_name == NULL) {
976 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
977 &UnraisableHookArgs_desc) < 0) {
978 return _Py_INIT_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +0000979 }
Victor Stinneref9d9b62019-05-22 11:28:22 +0200980 }
981 return _Py_INIT_OK();
982}
983
984
985static PyObject *
986make_unraisable_hook_args(PyObject *exc_type, PyObject *exc_value,
987 PyObject *exc_tb, PyObject *obj)
988{
989 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
990 if (args == NULL) {
991 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +0200993
Victor Stinneref9d9b62019-05-22 11:28:22 +0200994 Py_ssize_t pos = 0;
995#define ADD_ITEM(exc_type) \
996 do { \
997 if (exc_type == NULL) { \
998 exc_type = Py_None; \
999 } \
1000 Py_INCREF(exc_type); \
1001 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1002 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001003
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001004
Victor Stinneref9d9b62019-05-22 11:28:22 +02001005 ADD_ITEM(exc_type);
1006 ADD_ITEM(exc_value);
1007 ADD_ITEM(exc_tb);
1008 ADD_ITEM(obj);
1009#undef ADD_ITEM
1010
1011 if (PyErr_Occurred()) {
1012 Py_DECREF(args);
1013 return NULL;
1014 }
1015 return args;
1016}
1017
1018
1019
1020/* Default implementation of sys.unraisablehook.
1021
1022 It can be called to log the exception of a custom sys.unraisablehook.
1023
1024 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1025static int
1026write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value,
1027 PyObject *exc_tb, PyObject *obj, PyObject *file)
1028{
1029 if (obj != NULL && obj != Py_None) {
1030 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1031 return -1;
1032 }
1033
1034 if (PyFile_WriteObject(obj, file, 0) < 0) {
1035 PyErr_Clear();
1036 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1037 return -1;
1038 }
1039 }
1040 if (PyFile_WriteString("\n", file) < 0) {
1041 return -1;
1042 }
1043 }
1044
1045 if (exc_tb != NULL && exc_tb != Py_None) {
1046 if (PyTraceBack_Print(exc_tb, file) < 0) {
1047 /* continue even if writing the traceback failed */
1048 PyErr_Clear();
1049 }
1050 }
1051
Victor Stinnerdf22c032019-05-23 01:00:58 +02001052 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001053 return -1;
1054 }
1055
1056 assert(PyExceptionClass_Check(exc_type));
1057 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001058 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001059 const char *dot = strrchr(className, '.');
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001060 if (dot != NULL)
1061 className = dot+1;
1062 }
1063
Victor Stinneref9d9b62019-05-22 11:28:22 +02001064 _Py_IDENTIFIER(__module__);
1065 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001066 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001067 Py_XDECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001068 PyErr_Clear();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001069 if (PyFile_WriteString("<unknown>", file) < 0) {
1070 return -1;
1071 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001072 }
1073 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001074 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001075 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1076 Py_DECREF(moduleName);
1077 return -1;
1078 }
1079 Py_DECREF(moduleName);
1080 if (PyFile_WriteString(".", file) < 0) {
1081 return -1;
1082 }
1083 }
1084 else {
1085 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001086 }
1087 }
1088 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001089 if (PyFile_WriteString("<unknown>", file) < 0) {
1090 return -1;
1091 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001092 }
1093 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001094 if (PyFile_WriteString(className, file) < 0) {
1095 return -1;
1096 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001097 }
1098
Victor Stinneref9d9b62019-05-22 11:28:22 +02001099 if (exc_value && exc_value != Py_None) {
1100 if (PyFile_WriteString(": ", file) < 0) {
1101 return -1;
1102 }
1103 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Martin Panter3263f682016-02-28 03:16:11 +00001104 PyErr_Clear();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001105 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1106 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001107 }
1108 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001109 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001110
Victor Stinneref9d9b62019-05-22 11:28:22 +02001111 if (PyFile_WriteString("\n", file) < 0) {
1112 return -1;
1113 }
1114 return 0;
1115}
1116
1117
1118static int
1119write_unraisable_exc(PyObject *exc_type, PyObject *exc_value,
1120 PyObject *exc_tb, PyObject *obj)
1121{
1122 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1123 if (file == NULL || file == Py_None) {
1124 return 0;
1125 }
1126
1127 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1128 while we use it */
1129 Py_INCREF(file);
1130 int res = write_unraisable_exc_file(exc_type, exc_value, exc_tb,
1131 obj, file);
1132 Py_DECREF(file);
1133
1134 return res;
1135}
1136
1137
1138PyObject*
1139_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1140{
1141 if (Py_TYPE(args) != &UnraisableHookArgsType) {
1142 PyErr_SetString(PyExc_TypeError,
1143 "sys.unraisablehook argument type "
1144 "must be UnraisableHookArgs");
1145 return NULL;
1146 }
1147
1148 /* Borrowed references */
1149 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1150 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1151 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
1152 PyObject *obj = PyStructSequence_GET_ITEM(args, 3);
1153
1154 if (write_unraisable_exc(exc_type, exc_value, exc_tb, obj) < 0) {
1155 return NULL;
1156 }
1157 Py_RETURN_NONE;
1158}
1159
1160
1161/* Call sys.unraisablehook().
1162
1163 This function can be used when an exception has occurred but there is no way
1164 for Python to handle it. For example, when a destructor raises an exception
1165 or during garbage collection (gc.collect()).
1166
1167 An exception must be set when calling this function. */
1168void
1169PyErr_WriteUnraisable(PyObject *obj)
1170{
1171 PyObject *exc_type, *exc_value, *exc_tb;
1172
1173 PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
1174
1175 assert(exc_type != NULL);
1176
1177 if (exc_type == NULL) {
1178 /* sys.unraisablehook requires that at least exc_type is set */
1179 goto default_hook;
1180 }
1181
Victor Stinnerdf22c032019-05-23 01:00:58 +02001182 if (exc_tb == NULL) {
1183 struct _frame *frame = _PyThreadState_GET()->frame;
1184 if (frame != NULL) {
1185 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1186 if (exc_tb == NULL) {
1187 PyErr_Clear();
1188 }
1189 }
1190 }
1191
1192 PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb);
1193
1194 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1195 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
1196 PyErr_Clear();
1197 }
1198 }
1199
Victor Stinneref9d9b62019-05-22 11:28:22 +02001200 _Py_IDENTIFIER(unraisablehook);
1201 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
1202 if (hook != NULL && hook != Py_None) {
1203 PyObject *hook_args;
1204
1205 hook_args = make_unraisable_hook_args(exc_type, exc_value, exc_tb, obj);
1206 if (hook_args != NULL) {
1207 PyObject *args[1] = {hook_args};
1208 PyObject *res = _PyObject_FastCall(hook, args, 1);
1209 Py_DECREF(hook_args);
1210 if (res != NULL) {
1211 Py_DECREF(res);
1212 goto done;
1213 }
1214 }
1215
1216 /* sys.unraisablehook failed: log its error using default hook */
1217 Py_XDECREF(exc_type);
1218 Py_XDECREF(exc_value);
1219 Py_XDECREF(exc_tb);
1220 PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
1221
1222 obj = hook;
1223 }
1224
1225default_hook:
1226 /* Call the default unraisable hook (ignore failure) */
1227 (void)write_unraisable_exc(exc_type, exc_value, exc_tb, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001228
1229done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001230 Py_XDECREF(exc_type);
1231 Py_XDECREF(exc_value);
1232 Py_XDECREF(exc_tb);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001233 PyErr_Clear(); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001234}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001235
Armin Rigo092381a2003-10-25 14:29:27 +00001236extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001237
Guido van Rossum2fd45652001-02-28 21:46:24 +00001238
Benjamin Peterson2c539712010-09-20 22:42:10 +00001239void
Victor Stinner14e461d2013-08-26 22:28:21 +02001240PyErr_SyntaxLocation(const char *filename, int lineno)
1241{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001242 PyErr_SyntaxLocationEx(filename, lineno, -1);
1243}
1244
1245
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001246/* Set file and line information for the current exception.
1247 If the exception is not a SyntaxError, also sets additional attributes
1248 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001249
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001250void
Victor Stinner14e461d2013-08-26 22:28:21 +02001251PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001254 _Py_IDENTIFIER(filename);
1255 _Py_IDENTIFIER(lineno);
1256 _Py_IDENTIFIER(msg);
1257 _Py_IDENTIFIER(offset);
1258 _Py_IDENTIFIER(print_file_and_line);
1259 _Py_IDENTIFIER(text);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 /* add attributes for the line number and filename for the error */
1262 PyErr_Fetch(&exc, &v, &tb);
1263 PyErr_NormalizeException(&exc, &v, &tb);
1264 /* XXX check that it is, indeed, a syntax error. It might not
1265 * be, though. */
1266 tmp = PyLong_FromLong(lineno);
1267 if (tmp == NULL)
1268 PyErr_Clear();
1269 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001270 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 PyErr_Clear();
1272 Py_DECREF(tmp);
1273 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001274 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001275 if (col_offset >= 0) {
1276 tmp = PyLong_FromLong(col_offset);
1277 if (tmp == NULL)
1278 PyErr_Clear();
Benjamin Peterson2c539712010-09-20 22:42:10 +00001279 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001280 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None))
1281 PyErr_Clear();
1282 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 if (filename != NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001284 if (_PyObject_SetAttrId(v, &PyId_filename, filename))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001286
Victor Stinner14e461d2013-08-26 22:28:21 +02001287 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001289 if (_PyObject_SetAttrId(v, &PyId_text, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 PyErr_Clear();
1291 Py_DECREF(tmp);
1292 }
1293 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001295 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 tmp = PyObject_Str(v);
1297 if (tmp) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001298 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 PyErr_Clear();
1300 Py_DECREF(tmp);
1301 } else {
1302 PyErr_Clear();
1303 }
1304 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001305 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1306 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
1307 Py_None))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyErr_Clear();
1309 }
1310 }
1311 PyErr_Restore(exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001312}
1313
Victor Stinner14e461d2013-08-26 22:28:21 +02001314void
1315PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1316{
1317 PyObject *fileobj;
1318 if (filename != NULL) {
1319 fileobj = PyUnicode_DecodeFSDefault(filename);
1320 if (fileobj == NULL)
1321 PyErr_Clear();
1322 }
1323 else
1324 fileobj = NULL;
1325 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1326 Py_XDECREF(fileobj);
1327}
1328
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001329/* Attempt to load the line of text that the exception refers to. If it
1330 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001331
1332 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001333 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001334
Antoine Pitrou409b5382013-10-12 22:41:17 +02001335static PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001336err_programtext(FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 int i;
1339 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 if (fp == NULL)
1342 return NULL;
1343 for (i = 0; i < lineno; i++) {
1344 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1345 do {
1346 *pLastChar = '\0';
1347 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1348 fp, NULL) == NULL)
1349 break;
1350 /* fgets read *something*; if it didn't get as
1351 far as pLastChar, it must have found a newline
1352 or hit the end of the file; if pLastChar is \n,
1353 it obviously found a newline; else we haven't
1354 yet seen a newline, so must continue */
1355 } while (*pLastChar != '\0' && *pLastChar != '\n');
1356 }
1357 fclose(fp);
1358 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001360 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 if (res == NULL)
1362 PyErr_Clear();
1363 return res;
1364 }
1365 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001366}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001367
Victor Stinner14e461d2013-08-26 22:28:21 +02001368PyObject *
1369PyErr_ProgramText(const char *filename, int lineno)
1370{
1371 FILE *fp;
1372 if (filename == NULL || *filename == '\0' || lineno <= 0)
1373 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001374 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinner14e461d2013-08-26 22:28:21 +02001375 return err_programtext(fp, lineno);
1376}
1377
1378PyObject *
1379PyErr_ProgramTextObject(PyObject *filename, int lineno)
1380{
1381 FILE *fp;
1382 if (filename == NULL || lineno <= 0)
1383 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001384 fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnere42ccd22015-03-18 01:39:23 +01001385 if (fp == NULL) {
1386 PyErr_Clear();
1387 return NULL;
1388 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001389 return err_programtext(fp, lineno);
1390}
1391
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001392#ifdef __cplusplus
1393}
1394#endif