blob: d9b69d9dc6ca52c1c61af7be558835dadb31ce0d [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
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020030/* Forward declaration */
31static void _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type,
32 PyObject **p_value, PyObject **p_traceback);
33static void _PyErr_Clear(PyThreadState *tstate);
34
35
36static void
37_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
38 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
43 /* XXX Should never happen -- fatal error instead? */
44 /* Well, it could be None. */
45 Py_DECREF(traceback);
46 traceback = NULL;
47 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 /* Save these in locals to safeguard against recursive
50 invocation through Py_XDECREF */
51 oldtype = tstate->curexc_type;
52 oldvalue = tstate->curexc_value;
53 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 tstate->curexc_type = type;
56 tstate->curexc_value = value;
57 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 Py_XDECREF(oldtype);
60 Py_XDECREF(oldvalue);
61 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000062}
63
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020064void
65PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
66{
67 PyThreadState *tstate = _PyThreadState_GET();
68 _PyErr_Restore(tstate, type, value, traceback);
69}
70
71
Mark Shannonae3087c2017-10-22 22:41:51 +010072_PyErr_StackItem *
73_PyErr_GetTopmostException(PyThreadState *tstate)
74{
75 _PyErr_StackItem *exc_info = tstate->exc_info;
76 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
77 exc_info->previous_item != NULL)
78 {
79 exc_info = exc_info->previous_item;
80 }
81 return exc_info;
82}
83
Victor Stinner3a840972016-08-22 23:59:08 +020084static PyObject*
85_PyErr_CreateException(PyObject *exception, PyObject *value)
86{
87 if (value == NULL || value == Py_None) {
88 return _PyObject_CallNoArg(exception);
89 }
90 else if (PyTuple_Check(value)) {
91 return PyObject_Call(exception, value, NULL);
92 }
93 else {
Victor Stinner7bfb42d2016-12-05 17:04:32 +010094 return PyObject_CallFunctionObjArgs(exception, value, NULL);
Victor Stinner3a840972016-08-22 23:59:08 +020095 }
96}
97
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020098static void
99_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 PyObject *exc_value;
102 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 if (exception != NULL &&
105 !PyExceptionClass_Check(exception)) {
106 PyErr_Format(PyExc_SystemError,
107 "exception %R not a BaseException subclass",
108 exception);
109 return;
110 }
Victor Stinner3a840972016-08-22 23:59:08 +0200111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100113 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 if (exc_value != NULL && exc_value != Py_None) {
115 /* Implicit exception chaining */
116 Py_INCREF(exc_value);
117 if (value == NULL || !PyExceptionInstance_Check(value)) {
118 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200119 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100120
Victor Stinner3a840972016-08-22 23:59:08 +0200121 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100122 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200123 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100124
Victor Stinner3a840972016-08-22 23:59:08 +0200125 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200127 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300128 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200130 }
131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 value = fixed_value;
133 }
Victor Stinner3a840972016-08-22 23:59:08 +0200134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 /* Avoid reference cycles through the context chain.
136 This is O(chain length) but context chains are
137 usually very short. Sensitive readers may try
138 to inline the call to PyException_GetContext. */
139 if (exc_value != value) {
140 PyObject *o = exc_value, *context;
141 while ((context = PyException_GetContext(o))) {
142 Py_DECREF(context);
143 if (context == value) {
144 PyException_SetContext(o, NULL);
145 break;
146 }
147 o = context;
148 }
149 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200150 }
151 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 Py_DECREF(exc_value);
153 }
154 }
155 if (value != NULL && PyExceptionInstance_Check(value))
156 tb = PyException_GetTraceback(value);
157 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200158 _PyErr_Restore(tstate, exception, value, tb);
159}
160
161void
162PyErr_SetObject(PyObject *exception, PyObject *value)
163{
164 PyThreadState *tstate = _PyThreadState_GET();
165 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166}
167
Raymond Hettinger69492da2013-09-02 15:59:26 -0700168/* Set a key error with the specified argument, wrapping it in a
169 * tuple automatically so that tuple keys are not unpacked as the
170 * exception arguments. */
171void
172_PyErr_SetKeyError(PyObject *arg)
173{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200174 PyThreadState *tstate = _PyThreadState_GET();
175 PyObject *tup = PyTuple_Pack(1, arg);
176 if (!tup) {
177 /* caller will expect error to be set anyway */
178 return;
179 }
180 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700181 Py_DECREF(tup);
182}
183
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200184static void
185_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
186{
187 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
188}
189
190
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200194 PyThreadState *tstate = _PyThreadState_GET();
195 _PyErr_SetNone(tstate, exception);
196}
197
198
199static void
200_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
201 const char *string)
202{
203 PyObject *value = PyUnicode_FromString(string);
204 _PyErr_SetObject(tstate, exception, value);
205 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206}
207
208void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000209PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200211 PyThreadState *tstate = _PyThreadState_GET();
212 _PyErr_SetString(tstate, exception, string);
213}
214
215
216static PyObject*
217_PyErr_Occurred(PyThreadState *tstate)
218{
219 return tstate == NULL ? NULL : tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
Guido van Rossum3a241811994-08-29 12:14:12 +0000222
Victor Stinnerc6944e72016-11-11 02:13:35 +0100223PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Victor Stinner50b48572018-11-01 01:51:40 +0100226 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200227 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228}
229
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000230
231int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (err == NULL || exc == NULL) {
235 /* maybe caused by "import exceptions" that failed early on */
236 return 0;
237 }
238 if (PyTuple_Check(exc)) {
239 Py_ssize_t i, n;
240 n = PyTuple_Size(exc);
241 for (i = 0; i < n; i++) {
242 /* Test recursively */
243 if (PyErr_GivenExceptionMatches(
244 err, PyTuple_GET_ITEM(exc, i)))
245 {
246 return 1;
247 }
248 }
249 return 0;
250 }
251 /* err might be an instance, so check its class. */
252 if (PyExceptionInstance_Check(err))
253 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200256 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260}
Guido van Rossum743007d1999-04-21 15:27:31 +0000261
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000262
263int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000265{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200266 PyThreadState *tstate = _PyThreadState_GET();
267 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000268}
269
270
xdegaye56d1f5c2017-10-26 15:09:06 +0200271#ifndef Py_NORMALIZE_RECURSION_LIMIT
272#define Py_NORMALIZE_RECURSION_LIMIT 32
273#endif
274
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000275/* Used in many places to normalize a raised exception, including in
276 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000277
278 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000280*/
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200281static void
282_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
283 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000284{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200285 int recursion_depth = 0;
286 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000287
Serhiy Storchakacf296532017-11-05 11:27:48 +0200288 restart:
289 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 if (type == NULL) {
291 /* There was no exception, so nothing to do. */
292 return;
293 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000294
Serhiy Storchakacf296532017-11-05 11:27:48 +0200295 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 /* If PyErr_SetNone() was used, the value will have been actually
297 set to NULL.
298 */
299 if (!value) {
300 value = Py_None;
301 Py_INCREF(value);
302 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 /* Normalize the exception so that if the type is a class, the
305 value will be an instance.
306 */
307 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200308 PyObject *inclass = NULL;
309 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200310
Serhiy Storchakacf296532017-11-05 11:27:48 +0200311 if (PyExceptionInstance_Check(value)) {
312 inclass = PyExceptionInstance_Class(value);
313 is_subclass = PyObject_IsSubclass(inclass, type);
314 if (is_subclass < 0) {
315 goto error;
316 }
317 }
318
319 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 whose class is (or is derived from) type, then use the
321 value as an argument to instantiation of the type
322 class.
323 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200324 if (!is_subclass) {
325 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200326 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200327 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200330 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200332 /* If the class of the instance doesn't exactly match the
333 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 */
335 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200336 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 Py_DECREF(type);
338 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 }
340 }
341 *exc = type;
342 *val = value;
343 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200344
345 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 Py_DECREF(type);
347 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200348 recursion_depth++;
349 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200350 _PyErr_SetString(tstate, PyExc_RecursionError,
351 "maximum recursion depth exceeded "
352 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200353 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 /* If the new exception doesn't set a traceback and the old
355 exception had a traceback, use the old traceback for the
356 new exception. It's better than nothing.
357 */
358 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200359 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200360 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 if (initial_tb != NULL) {
362 if (*tb == NULL)
363 *tb = initial_tb;
364 else
365 Py_DECREF(initial_tb);
366 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200367 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
368 corresponding RecursionError could not be normalized, and the
369 MemoryError raised when normalize this RecursionError could not be
370 normalized. */
371 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200372 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
373 Py_FatalError("Cannot recover from MemoryErrors "
374 "while normalizing exceptions.");
375 }
376 else {
377 Py_FatalError("Cannot recover from the recursive normalization "
378 "of an exception.");
379 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200381 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000382}
383
384
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200386PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387{
Victor Stinner50b48572018-11-01 01:51:40 +0100388 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200389 _PyErr_NormalizeException(tstate, exc, val, tb);
390}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000391
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200392
393static void
394_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
395 PyObject **p_traceback)
396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 *p_type = tstate->curexc_type;
398 *p_value = tstate->curexc_value;
399 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 tstate->curexc_type = NULL;
402 tstate->curexc_value = NULL;
403 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200406
407void
408PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
409{
410 PyThreadState *tstate = _PyThreadState_GET();
411 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
412}
413
414
415static void
416_PyErr_Clear(PyThreadState *tstate)
417{
418 _PyErr_Restore(tstate, NULL, NULL, NULL);
419}
420
421
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000423PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200425 PyThreadState *tstate = _PyThreadState_GET();
426 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000428
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200429
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200430void
431PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
432{
Victor Stinner50b48572018-11-01 01:51:40 +0100433 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200434
Mark Shannonae3087c2017-10-22 22:41:51 +0100435 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
436 *p_type = exc_info->exc_type;
437 *p_value = exc_info->exc_value;
438 *p_traceback = exc_info->exc_traceback;
439
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200440
441 Py_XINCREF(*p_type);
442 Py_XINCREF(*p_value);
443 Py_XINCREF(*p_traceback);
444}
445
446void
447PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
448{
449 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100450 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200451
Mark Shannonae3087c2017-10-22 22:41:51 +0100452 oldtype = tstate->exc_info->exc_type;
453 oldvalue = tstate->exc_info->exc_value;
454 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200455
Mark Shannonae3087c2017-10-22 22:41:51 +0100456 tstate->exc_info->exc_type = p_type;
457 tstate->exc_info->exc_value = p_value;
458 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200459
460 Py_XDECREF(oldtype);
461 Py_XDECREF(oldvalue);
462 Py_XDECREF(oldtraceback);
463}
464
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300465/* Like PyErr_Restore(), but if an exception is already set,
466 set the context associated with it.
467 */
468void
469_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
470{
471 if (exc == NULL)
472 return;
473
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200474 PyThreadState *tstate = _PyThreadState_GET();
475 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300476 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200477 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
478 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300479 if (tb != NULL) {
480 PyException_SetTraceback(val, tb);
481 Py_DECREF(tb);
482 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300483 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200484 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300485 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200486 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300487 }
488 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200489 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300490 }
491}
492
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300493static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200494_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
495 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300496{
497 PyObject *exc, *val, *val2, *tb;
498
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200499 assert(_PyErr_Occurred(tstate));
500 _PyErr_Fetch(tstate, &exc, &val, &tb);
501 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300502 if (tb != NULL) {
503 PyException_SetTraceback(val, tb);
504 Py_DECREF(tb);
505 }
506 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200507 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300508
509 PyErr_FormatV(exception, format, vargs);
510
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200511 _PyErr_Fetch(tstate, &exc, &val2, &tb);
512 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300513 Py_INCREF(val);
514 PyException_SetCause(val2, val);
515 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200516 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300517
518 return NULL;
519}
520
521PyObject *
522_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
523{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200524 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300525 va_list vargs;
526#ifdef HAVE_STDARG_PROTOTYPES
527 va_start(vargs, format);
528#else
529 va_start(vargs);
530#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200531 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300532 va_end(vargs);
533 return NULL;
534}
535
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000536/* Convenience functions to set a type error exception and return 0 */
537
538int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000540{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200541 PyThreadState *tstate = _PyThreadState_GET();
542 _PyErr_SetString(tstate, PyExc_TypeError,
543 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000545}
546
Guido van Rossum373c8691997-04-29 18:22:47 +0000547PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000549{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200550 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf54a5742013-07-22 22:28:37 +0200551 if (Py_TYPE(PyExc_MemoryError) == NULL) {
552 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
553 initialized by _PyExc_Init() */
554 Py_FatalError("Out of memory and PyExc_MemoryError is not "
555 "initialized yet");
556 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200557 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000559}
560
Guido van Rossum373c8691997-04-29 18:22:47 +0000561PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000562PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000563{
Larry Hastingsb0827312014-02-09 22:05:19 -0800564 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
565}
566
567PyObject *
568PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
569{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200570 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200572 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100574#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000576#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000577
Guido van Rossume9fbc091995-02-18 14:52:19 +0000578#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (i == EINTR && PyErr_CheckSignals())
580 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000581#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000582
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000583#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100584 if (i != 0) {
585 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100586 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100587 }
588 else {
589 /* Sometimes errno didn't get set */
590 message = PyUnicode_FromString("Error");
591 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000592#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (i == 0)
594 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
595 else
596 {
597 /* Note that the Win32 errors do not lineup with the
598 errno error. So if the error is in the MSVC error
599 table, we use it, otherwise we assume it really _is_
600 a Win32 error code
601 */
602 if (i > 0 && i < _sys_nerr) {
603 message = PyUnicode_FromString(_sys_errlist[i]);
604 }
605 else {
606 int len = FormatMessageW(
607 FORMAT_MESSAGE_ALLOCATE_BUFFER |
608 FORMAT_MESSAGE_FROM_SYSTEM |
609 FORMAT_MESSAGE_IGNORE_INSERTS,
610 NULL, /* no message source */
611 i,
612 MAKELANGID(LANG_NEUTRAL,
613 SUBLANG_DEFAULT),
614 /* Default language */
615 (LPWSTR) &s_buf,
616 0, /* size not used */
617 NULL); /* no args */
618 if (len==0) {
619 /* Only ever seen this in out-of-mem
620 situations */
621 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300622 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 } else {
624 /* remove trailing cr/lf and dots */
625 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
626 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200627 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 }
629 }
630 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000631#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (message == NULL)
634 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000635#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 return NULL;
639 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000640
Larry Hastingsb0827312014-02-09 22:05:19 -0800641 if (filenameObject != NULL) {
642 if (filenameObject2 != NULL)
643 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
644 else
645 args = Py_BuildValue("(iOO)", i, message, filenameObject);
646 } else {
647 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200648 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800649 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000651
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200652 if (args != NULL) {
653 v = PyObject_Call(exc, args, NULL);
654 Py_DECREF(args);
655 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200656 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200657 Py_DECREF(v);
658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000660#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000664}
Guido van Rossum743007d1999-04-21 15:27:31 +0000665
Barry Warsaw97d95151998-07-23 16:05:56 +0000666PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000667PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800670 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 Py_XDECREF(name);
672 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000673}
674
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000675#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000676PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000677PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000678{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200679 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800680 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 Py_XDECREF(name);
682 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000683}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000684#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000685
686PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000688{
Larry Hastingsb0827312014-02-09 22:05:19 -0800689 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000690}
Guido van Rossum683a0721990-10-21 22:09:12 +0000691
Brett Cannonbf364092006-03-01 04:25:17 +0000692#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000693/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000694PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 PyObject *exc,
696 int ierr,
697 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000698{
Larry Hastingsb0827312014-02-09 22:05:19 -0800699 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
700 filenameObject, NULL);
701}
702
703PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
704 PyObject *exc,
705 int ierr,
706 PyObject *filenameObject,
707 PyObject *filenameObject2)
708{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200709 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 int len;
711 WCHAR *s_buf = NULL; /* Free via LocalFree */
712 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200713 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200716 if (err==0) {
717 err = GetLastError();
718 }
719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 len = FormatMessageW(
721 /* Error API error */
722 FORMAT_MESSAGE_ALLOCATE_BUFFER |
723 FORMAT_MESSAGE_FROM_SYSTEM |
724 FORMAT_MESSAGE_IGNORE_INSERTS,
725 NULL, /* no message source */
726 err,
727 MAKELANGID(LANG_NEUTRAL,
728 SUBLANG_DEFAULT), /* Default language */
729 (LPWSTR) &s_buf,
730 0, /* size not used */
731 NULL); /* no args */
732 if (len==0) {
733 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300734 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 s_buf = NULL;
736 } else {
737 /* remove trailing cr/lf and dots */
738 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
739 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200740 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 if (message == NULL)
744 {
745 LocalFree(s_buf);
746 return NULL;
747 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000748
Larry Hastingsb0827312014-02-09 22:05:19 -0800749 if (filenameObject == NULL) {
750 assert(filenameObject2 == NULL);
751 filenameObject = filenameObject2 = Py_None;
752 }
753 else if (filenameObject2 == NULL)
754 filenameObject2 = Py_None;
755 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200756 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800757 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000759
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200760 if (args != NULL) {
761 v = PyObject_Call(exc, args, NULL);
762 Py_DECREF(args);
763 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200764 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200765 Py_DECREF(v);
766 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
768 LocalFree(s_buf);
769 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000770}
771
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000772PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *exc,
774 int ierr,
775 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000776{
Victor Stinner92be9392010-12-28 00:28:21 +0000777 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800778 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800780 name,
781 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 Py_XDECREF(name);
783 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000784}
785
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000786PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 PyObject *exc,
788 int ierr,
789 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000790{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200791 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800792 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800794 name,
795 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 Py_XDECREF(name);
797 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000798}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000799
Thomas Heller085358a2002-07-29 14:27:41 +0000800PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
801{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800802 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000803}
804
Guido van Rossum795e1892000-02-17 15:19:15 +0000805PyObject *PyErr_SetFromWindowsErr(int ierr)
806{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800807 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
808 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800809}
810
Thomas Heller085358a2002-07-29 14:27:41 +0000811PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 int ierr,
813 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000814{
Victor Stinner92be9392010-12-28 00:28:21 +0000815 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800816 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200817 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800818 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 Py_XDECREF(name);
820 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000821}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000822
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000823PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 int ierr,
825 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000826{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200827 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800828 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200829 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800830 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 Py_XDECREF(name);
832 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000833}
Guido van Rossum795e1892000-02-17 15:19:15 +0000834#endif /* MS_WINDOWS */
835
Brett Cannon79ec55e2012-04-12 20:24:54 -0400836PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700837PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
838 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400839{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200840 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700841 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200842 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500843
Eric Snow46f97b82016-09-07 16:56:15 -0700844 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
845 if (issubclass < 0) {
846 return NULL;
847 }
848 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200849 _PyErr_SetString(tstate, PyExc_TypeError,
850 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500851 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200852 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500853
Eric Snow46f97b82016-09-07 16:56:15 -0700854 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200855 _PyErr_SetString(tstate, PyExc_TypeError,
856 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500857 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400858 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500859
Brian Curtin94c001b2012-04-18 08:30:51 -0500860 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500861 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500862 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500863 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500864 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500865 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500866
Eric Snow46f97b82016-09-07 16:56:15 -0700867 kwargs = PyDict_New();
868 if (kwargs == NULL) {
869 return NULL;
870 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200871 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300872 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200873 }
874 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300875 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200876 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400877
Eric Snow46f97b82016-09-07 16:56:15 -0700878 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400879 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200880 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500881 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400882 }
883
Berker Peksagec766d32016-05-01 09:06:36 +0300884done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400885 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500886 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400887}
888
Eric Snow46f97b82016-09-07 16:56:15 -0700889PyObject *
890PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
891{
892 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
893}
894
Guido van Rossum683a0721990-10-21 22:09:12 +0000895void
Neal Norwitzb382b842007-08-24 20:00:37 +0000896_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 PyErr_Format(PyExc_SystemError,
899 "%s:%d: bad argument to internal function",
900 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000901}
902
903/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
904 export the entry point for existing object code: */
905#undef PyErr_BadInternalCall
906void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000907PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000908{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200909 assert(0 && "bad argument to internal function");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 PyErr_Format(PyExc_SystemError,
911 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000912}
Fred Drake6d63adf2000-08-24 22:38:39 +0000913#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
914
Guido van Rossum1548bac1997-02-14 17:09:47 +0000915
Guido van Rossum1548bac1997-02-14 17:09:47 +0000916PyObject *
Antoine Pitrou0676a402014-09-30 21:16:27 +0200917PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000918{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200919 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000921
Victor Stinnerde821be2015-03-24 12:41:23 +0100922 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
923 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200924 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100927
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200928 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000931}
Guido van Rossum7617e051997-09-16 18:43:50 +0000932
933
Antoine Pitrou0676a402014-09-30 21:16:27 +0200934PyObject *
935PyErr_Format(PyObject *exception, const char *format, ...)
936{
937 va_list vargs;
938#ifdef HAVE_STDARG_PROTOTYPES
939 va_start(vargs, format);
940#else
941 va_start(vargs);
942#endif
943 PyErr_FormatV(exception, format, vargs);
944 va_end(vargs);
945 return NULL;
946}
947
Thomas Wouters477c8d52006-05-27 19:21:47 +0000948
Guido van Rossum7617e051997-09-16 18:43:50 +0000949PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000950PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000951{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200952 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200953 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PyObject *modulename = NULL;
955 PyObject *classname = NULL;
956 PyObject *mydict = NULL;
957 PyObject *bases = NULL;
958 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200959
960 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200962 _PyErr_SetString(tstate, PyExc_SystemError,
963 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 return NULL;
965 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200966 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 if (dict == NULL) {
970 dict = mydict = PyDict_New();
971 if (dict == NULL)
972 goto failure;
973 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200974
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200975 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200976 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200977 goto failure;
978 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 modulename = PyUnicode_FromStringAndSize(name,
980 (Py_ssize_t)(dot-name));
981 if (modulename == NULL)
982 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200983 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 goto failure;
985 }
986 if (PyTuple_Check(base)) {
987 bases = base;
988 /* INCREF as we create a new ref in the else branch */
989 Py_INCREF(bases);
990 } else {
991 bases = PyTuple_Pack(1, base);
992 if (bases == NULL)
993 goto failure;
994 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100995 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000996 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000998 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 Py_XDECREF(bases);
1000 Py_XDECREF(mydict);
1001 Py_XDECREF(classname);
1002 Py_XDECREF(modulename);
1003 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001004}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001005
Georg Brandl1e28a272009-12-28 08:41:01 +00001006
1007/* Create an exception with docstring */
1008PyObject *
1009PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 int result;
1013 PyObject *ret = NULL;
1014 PyObject *mydict = NULL; /* points to the dict only if we create it */
1015 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 if (dict == NULL) {
1018 dict = mydict = PyDict_New();
1019 if (dict == NULL) {
1020 return NULL;
1021 }
1022 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 if (doc != NULL) {
1025 docobj = PyUnicode_FromString(doc);
1026 if (docobj == NULL)
1027 goto failure;
1028 result = PyDict_SetItemString(dict, "__doc__", docobj);
1029 Py_DECREF(docobj);
1030 if (result < 0)
1031 goto failure;
1032 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001035 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 Py_XDECREF(mydict);
1037 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001038}
1039
1040
Victor Stinneref9d9b62019-05-22 11:28:22 +02001041PyDoc_STRVAR(UnraisableHookArgs__doc__,
1042"UnraisableHookArgs\n\
1043\n\
1044Type used to pass arguments to sys.unraisablehook.");
1045
1046static PyTypeObject UnraisableHookArgsType;
1047
1048static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1049 {"exc_type", "Exception type"},
1050 {"exc_value", "Exception value"},
1051 {"exc_traceback", "Exception traceback"},
1052 {"object", "Object causing the exception"},
1053 {0}
1054};
1055
1056static PyStructSequence_Desc UnraisableHookArgs_desc = {
1057 .name = "UnraisableHookArgs",
1058 .doc = UnraisableHookArgs__doc__,
1059 .fields = UnraisableHookArgs_fields,
1060 .n_in_sequence = 4
1061};
1062
1063
1064_PyInitError
1065_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001066{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001067 if (UnraisableHookArgsType.tp_name == NULL) {
1068 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1069 &UnraisableHookArgs_desc) < 0) {
1070 return _Py_INIT_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001071 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001072 }
1073 return _Py_INIT_OK();
1074}
1075
1076
1077static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001078make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
1079 PyObject *exc_value, PyObject *exc_tb, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001080{
1081 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1082 if (args == NULL) {
1083 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001085
Victor Stinneref9d9b62019-05-22 11:28:22 +02001086 Py_ssize_t pos = 0;
1087#define ADD_ITEM(exc_type) \
1088 do { \
1089 if (exc_type == NULL) { \
1090 exc_type = Py_None; \
1091 } \
1092 Py_INCREF(exc_type); \
1093 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1094 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001095
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001096
Victor Stinneref9d9b62019-05-22 11:28:22 +02001097 ADD_ITEM(exc_type);
1098 ADD_ITEM(exc_value);
1099 ADD_ITEM(exc_tb);
1100 ADD_ITEM(obj);
1101#undef ADD_ITEM
1102
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001103 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001104 Py_DECREF(args);
1105 return NULL;
1106 }
1107 return args;
1108}
1109
1110
1111
1112/* Default implementation of sys.unraisablehook.
1113
1114 It can be called to log the exception of a custom sys.unraisablehook.
1115
1116 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1117static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001118write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1119 PyObject *exc_value, PyObject *exc_tb,
1120 PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001121{
1122 if (obj != NULL && obj != Py_None) {
1123 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1124 return -1;
1125 }
1126
1127 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001128 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001129 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1130 return -1;
1131 }
1132 }
1133 if (PyFile_WriteString("\n", file) < 0) {
1134 return -1;
1135 }
1136 }
1137
1138 if (exc_tb != NULL && exc_tb != Py_None) {
1139 if (PyTraceBack_Print(exc_tb, file) < 0) {
1140 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001141 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001142 }
1143 }
1144
Victor Stinnerdf22c032019-05-23 01:00:58 +02001145 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001146 return -1;
1147 }
1148
1149 assert(PyExceptionClass_Check(exc_type));
1150 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001151 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001152 const char *dot = strrchr(className, '.');
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001153 if (dot != NULL)
1154 className = dot+1;
1155 }
1156
Victor Stinneref9d9b62019-05-22 11:28:22 +02001157 _Py_IDENTIFIER(__module__);
1158 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001159 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001160 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001161 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001162 if (PyFile_WriteString("<unknown>", file) < 0) {
1163 return -1;
1164 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001165 }
1166 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001167 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001168 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1169 Py_DECREF(moduleName);
1170 return -1;
1171 }
1172 Py_DECREF(moduleName);
1173 if (PyFile_WriteString(".", file) < 0) {
1174 return -1;
1175 }
1176 }
1177 else {
1178 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001179 }
1180 }
1181 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001182 if (PyFile_WriteString("<unknown>", file) < 0) {
1183 return -1;
1184 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001185 }
1186 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001187 if (PyFile_WriteString(className, file) < 0) {
1188 return -1;
1189 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001190 }
1191
Victor Stinneref9d9b62019-05-22 11:28:22 +02001192 if (exc_value && exc_value != Py_None) {
1193 if (PyFile_WriteString(": ", file) < 0) {
1194 return -1;
1195 }
1196 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001197 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001198 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1199 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001200 }
1201 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001202 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001203
Victor Stinneref9d9b62019-05-22 11:28:22 +02001204 if (PyFile_WriteString("\n", file) < 0) {
1205 return -1;
1206 }
1207 return 0;
1208}
1209
1210
1211static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001212write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
1213 PyObject *exc_value, PyObject *exc_tb, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001214{
1215 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1216 if (file == NULL || file == Py_None) {
1217 return 0;
1218 }
1219
1220 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1221 while we use it */
1222 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001223 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinneref9d9b62019-05-22 11:28:22 +02001224 obj, file);
1225 Py_DECREF(file);
1226
1227 return res;
1228}
1229
1230
1231PyObject*
1232_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1233{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001234 PyThreadState *tstate = _PyThreadState_GET();
1235
Victor Stinneref9d9b62019-05-22 11:28:22 +02001236 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001237 _PyErr_SetString(tstate, PyExc_TypeError,
1238 "sys.unraisablehook argument type "
1239 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001240 return NULL;
1241 }
1242
1243 /* Borrowed references */
1244 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1245 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1246 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
1247 PyObject *obj = PyStructSequence_GET_ITEM(args, 3);
1248
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001249 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001250 return NULL;
1251 }
1252 Py_RETURN_NONE;
1253}
1254
1255
1256/* Call sys.unraisablehook().
1257
1258 This function can be used when an exception has occurred but there is no way
1259 for Python to handle it. For example, when a destructor raises an exception
1260 or during garbage collection (gc.collect()).
1261
1262 An exception must be set when calling this function. */
1263void
1264PyErr_WriteUnraisable(PyObject *obj)
1265{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001266 PyThreadState *tstate = _PyThreadState_GET();
1267 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001268
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001269 PyObject *exc_type, *exc_value, *exc_tb;
1270 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001271
1272 assert(exc_type != NULL);
1273
1274 if (exc_type == NULL) {
1275 /* sys.unraisablehook requires that at least exc_type is set */
1276 goto default_hook;
1277 }
1278
Victor Stinnerdf22c032019-05-23 01:00:58 +02001279 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001280 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001281 if (frame != NULL) {
1282 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1283 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001284 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001285 }
1286 }
1287 }
1288
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001289 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001290
1291 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1292 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001293 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001294 }
1295 }
1296
Victor Stinneref9d9b62019-05-22 11:28:22 +02001297 _Py_IDENTIFIER(unraisablehook);
1298 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
1299 if (hook != NULL && hook != Py_None) {
1300 PyObject *hook_args;
1301
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001302 hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value,
1303 exc_tb, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001304 if (hook_args != NULL) {
1305 PyObject *args[1] = {hook_args};
1306 PyObject *res = _PyObject_FastCall(hook, args, 1);
1307 Py_DECREF(hook_args);
1308 if (res != NULL) {
1309 Py_DECREF(res);
1310 goto done;
1311 }
1312 }
1313
1314 /* sys.unraisablehook failed: log its error using default hook */
1315 Py_XDECREF(exc_type);
1316 Py_XDECREF(exc_value);
1317 Py_XDECREF(exc_tb);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001318 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001319
1320 obj = hook;
1321 }
1322
1323default_hook:
1324 /* Call the default unraisable hook (ignore failure) */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001325 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001326
1327done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001328 Py_XDECREF(exc_type);
1329 Py_XDECREF(exc_value);
1330 Py_XDECREF(exc_tb);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001331 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001332}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001333
Armin Rigo092381a2003-10-25 14:29:27 +00001334extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001335
Guido van Rossum2fd45652001-02-28 21:46:24 +00001336
Benjamin Peterson2c539712010-09-20 22:42:10 +00001337void
Victor Stinner14e461d2013-08-26 22:28:21 +02001338PyErr_SyntaxLocation(const char *filename, int lineno)
1339{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001340 PyErr_SyntaxLocationEx(filename, lineno, -1);
1341}
1342
1343
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001344/* Set file and line information for the current exception.
1345 If the exception is not a SyntaxError, also sets additional attributes
1346 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001347
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001348void
Victor Stinner14e461d2013-08-26 22:28:21 +02001349PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001352 _Py_IDENTIFIER(filename);
1353 _Py_IDENTIFIER(lineno);
1354 _Py_IDENTIFIER(msg);
1355 _Py_IDENTIFIER(offset);
1356 _Py_IDENTIFIER(print_file_and_line);
1357 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001358 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001361 _PyErr_Fetch(tstate, &exc, &v, &tb);
1362 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 /* XXX check that it is, indeed, a syntax error. It might not
1364 * be, though. */
1365 tmp = PyLong_FromLong(lineno);
1366 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001367 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001369 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1370 _PyErr_Clear(tstate);
1371 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 Py_DECREF(tmp);
1373 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001374 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001375 if (col_offset >= 0) {
1376 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001377 if (tmp == NULL) {
1378 _PyErr_Clear(tstate);
1379 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001380 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001381 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1382 _PyErr_Clear(tstate);
1383 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001384 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001386 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1387 _PyErr_Clear(tstate);
1388 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001389
Victor Stinner14e461d2013-08-26 22:28:21 +02001390 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001392 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1393 _PyErr_Clear(tstate);
1394 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 Py_DECREF(tmp);
1396 }
1397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001399 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 tmp = PyObject_Str(v);
1401 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001402 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1403 _PyErr_Clear(tstate);
1404 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001406 }
1407 else {
1408 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 }
1410 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001411 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1412 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001413 Py_None)) {
1414 _PyErr_Clear(tstate);
1415 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 }
1417 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001418 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001419}
1420
Victor Stinner14e461d2013-08-26 22:28:21 +02001421void
1422PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1423{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001424 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001425 PyObject *fileobj;
1426 if (filename != NULL) {
1427 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001428 if (fileobj == NULL) {
1429 _PyErr_Clear(tstate);
1430 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001431 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001432 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001433 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001434 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001435 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1436 Py_XDECREF(fileobj);
1437}
1438
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001439/* Attempt to load the line of text that the exception refers to. If it
1440 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001441
1442 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001443 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001444
Antoine Pitrou409b5382013-10-12 22:41:17 +02001445static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001446err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 int i;
1449 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 if (fp == NULL)
1452 return NULL;
1453 for (i = 0; i < lineno; i++) {
1454 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1455 do {
1456 *pLastChar = '\0';
1457 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1458 fp, NULL) == NULL)
1459 break;
1460 /* fgets read *something*; if it didn't get as
1461 far as pLastChar, it must have found a newline
1462 or hit the end of the file; if pLastChar is \n,
1463 it obviously found a newline; else we haven't
1464 yet seen a newline, so must continue */
1465 } while (*pLastChar != '\0' && *pLastChar != '\n');
1466 }
1467 fclose(fp);
1468 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001470 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001472 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 return res;
1474 }
1475 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001476}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001477
Victor Stinner14e461d2013-08-26 22:28:21 +02001478PyObject *
1479PyErr_ProgramText(const char *filename, int lineno)
1480{
1481 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001482 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001483 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001484 }
1485 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001486 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001487 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001488}
1489
1490PyObject *
1491PyErr_ProgramTextObject(PyObject *filename, int lineno)
1492{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001493 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001494 return NULL;
1495 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001496
1497 PyThreadState *tstate = _PyThreadState_GET();
1498 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1499 if (fp == NULL) {
1500 _PyErr_Clear(tstate);
1501 return NULL;
1502 }
1503 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001504}
1505
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001506#ifdef __cplusplus
1507}
1508#endif