blob: 4656fb2a33670609935eefe069eaf8b95e82fa03 [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 Stinner331a6a52019-05-27 16:39:22 +02005#include "pycore_initconfig.h"
Victor Stinner438a12d2019-05-24 17:01:38 +02006#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pystate.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +02008#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00009
Guido van Rossum53e8d441995-03-09 12:11:31 +000010#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000011#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000012extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000013#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000014#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000015
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000016#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000017#include <windows.h>
18#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000019#endif
20
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000021#include <ctype.h>
22
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000023#ifdef __cplusplus
24extern "C" {
25#endif
26
Hai Shi46874c22020-01-30 17:20:25 -060027_Py_IDENTIFIER(__module__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010028_Py_IDENTIFIER(builtins);
29_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020030_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010031
Victor Stinner438a12d2019-05-24 17:01:38 +020032/* Forward declarations */
33static PyObject *
34_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
35 const char *format, va_list vargs);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020036
37
Victor Stinner438a12d2019-05-24 17:01:38 +020038void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020039_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
40 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
45 /* XXX Should never happen -- fatal error instead? */
46 /* Well, it could be None. */
47 Py_DECREF(traceback);
48 traceback = NULL;
49 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 /* Save these in locals to safeguard against recursive
52 invocation through Py_XDECREF */
53 oldtype = tstate->curexc_type;
54 oldvalue = tstate->curexc_value;
55 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 tstate->curexc_type = type;
58 tstate->curexc_value = value;
59 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 Py_XDECREF(oldtype);
62 Py_XDECREF(oldvalue);
63 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064}
65
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020066void
67PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
68{
69 PyThreadState *tstate = _PyThreadState_GET();
70 _PyErr_Restore(tstate, type, value, traceback);
71}
72
73
Mark Shannonae3087c2017-10-22 22:41:51 +010074_PyErr_StackItem *
75_PyErr_GetTopmostException(PyThreadState *tstate)
76{
77 _PyErr_StackItem *exc_info = tstate->exc_info;
78 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
79 exc_info->previous_item != NULL)
80 {
81 exc_info = exc_info->previous_item;
82 }
83 return exc_info;
84}
85
Victor Stinner3a840972016-08-22 23:59:08 +020086static PyObject*
87_PyErr_CreateException(PyObject *exception, PyObject *value)
88{
89 if (value == NULL || value == Py_None) {
90 return _PyObject_CallNoArg(exception);
91 }
92 else if (PyTuple_Check(value)) {
93 return PyObject_Call(exception, value, NULL);
94 }
95 else {
Petr Viktorinffd97532020-02-11 17:46:57 +010096 return PyObject_CallOneArg(exception, value);
Victor Stinner3a840972016-08-22 23:59:08 +020097 }
98}
99
Victor Stinner438a12d2019-05-24 17:01:38 +0200100void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200101_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 PyObject *exc_value;
104 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 if (exception != NULL &&
107 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200108 _PyErr_Format(tstate, PyExc_SystemError,
109 "exception %R not a BaseException subclass",
110 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 return;
112 }
Victor Stinner3a840972016-08-22 23:59:08 +0200113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100115 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 if (exc_value != NULL && exc_value != Py_None) {
117 /* Implicit exception chaining */
118 Py_INCREF(exc_value);
119 if (value == NULL || !PyExceptionInstance_Check(value)) {
120 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200121 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100122
Victor Stinner3a840972016-08-22 23:59:08 +0200123 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100124 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200125 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100126
Victor Stinner3a840972016-08-22 23:59:08 +0200127 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200129 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300130 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200132 }
133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 value = fixed_value;
135 }
Victor Stinner3a840972016-08-22 23:59:08 +0200136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 /* Avoid reference cycles through the context chain.
138 This is O(chain length) but context chains are
139 usually very short. Sensitive readers may try
140 to inline the call to PyException_GetContext. */
141 if (exc_value != value) {
142 PyObject *o = exc_value, *context;
143 while ((context = PyException_GetContext(o))) {
144 Py_DECREF(context);
145 if (context == value) {
146 PyException_SetContext(o, NULL);
147 break;
148 }
149 o = context;
150 }
151 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200152 }
153 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 Py_DECREF(exc_value);
155 }
156 }
157 if (value != NULL && PyExceptionInstance_Check(value))
158 tb = PyException_GetTraceback(value);
159 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200160 _PyErr_Restore(tstate, exception, value, tb);
161}
162
163void
164PyErr_SetObject(PyObject *exception, PyObject *value)
165{
166 PyThreadState *tstate = _PyThreadState_GET();
167 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168}
169
Raymond Hettinger69492da2013-09-02 15:59:26 -0700170/* Set a key error with the specified argument, wrapping it in a
171 * tuple automatically so that tuple keys are not unpacked as the
172 * exception arguments. */
173void
174_PyErr_SetKeyError(PyObject *arg)
175{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200176 PyThreadState *tstate = _PyThreadState_GET();
177 PyObject *tup = PyTuple_Pack(1, arg);
178 if (!tup) {
179 /* caller will expect error to be set anyway */
180 return;
181 }
182 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700183 Py_DECREF(tup);
184}
185
Victor Stinner438a12d2019-05-24 17:01:38 +0200186void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200187_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
188{
189 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
190}
191
192
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000194PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200196 PyThreadState *tstate = _PyThreadState_GET();
197 _PyErr_SetNone(tstate, exception);
198}
199
200
Victor Stinner438a12d2019-05-24 17:01:38 +0200201void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200202_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
203 const char *string)
204{
205 PyObject *value = PyUnicode_FromString(string);
206 _PyErr_SetObject(tstate, exception, value);
207 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
210void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200213 PyThreadState *tstate = _PyThreadState_GET();
214 _PyErr_SetString(tstate, exception, string);
215}
216
217
Victor Stinnerc6944e72016-11-11 02:13:35 +0100218PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100221 /* The caller must hold the GIL. */
222 assert(PyGILState_Check());
223
Victor Stinner50b48572018-11-01 01:51:40 +0100224 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200225 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226}
227
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228
229int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (err == NULL || exc == NULL) {
233 /* maybe caused by "import exceptions" that failed early on */
234 return 0;
235 }
236 if (PyTuple_Check(exc)) {
237 Py_ssize_t i, n;
238 n = PyTuple_Size(exc);
239 for (i = 0; i < n; i++) {
240 /* Test recursively */
241 if (PyErr_GivenExceptionMatches(
242 err, PyTuple_GET_ITEM(exc, i)))
243 {
244 return 1;
245 }
246 }
247 return 0;
248 }
249 /* err might be an instance, so check its class. */
250 if (PyExceptionInstance_Check(err))
251 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200254 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000258}
Guido van Rossum743007d1999-04-21 15:27:31 +0000259
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260
261int
Victor Stinner438a12d2019-05-24 17:01:38 +0200262_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
263{
264 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
265}
266
267
268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000270{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200271 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200272 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000273}
274
275
xdegaye56d1f5c2017-10-26 15:09:06 +0200276#ifndef Py_NORMALIZE_RECURSION_LIMIT
277#define Py_NORMALIZE_RECURSION_LIMIT 32
278#endif
279
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000280/* Used in many places to normalize a raised exception, including in
281 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000282
283 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000285*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200286void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200287_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
288 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000289{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200290 int recursion_depth = 0;
291 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000292
Serhiy Storchakacf296532017-11-05 11:27:48 +0200293 restart:
294 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 if (type == NULL) {
296 /* There was no exception, so nothing to do. */
297 return;
298 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000299
Serhiy Storchakacf296532017-11-05 11:27:48 +0200300 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 /* If PyErr_SetNone() was used, the value will have been actually
302 set to NULL.
303 */
304 if (!value) {
305 value = Py_None;
306 Py_INCREF(value);
307 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 /* Normalize the exception so that if the type is a class, the
310 value will be an instance.
311 */
312 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200313 PyObject *inclass = NULL;
314 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200315
Serhiy Storchakacf296532017-11-05 11:27:48 +0200316 if (PyExceptionInstance_Check(value)) {
317 inclass = PyExceptionInstance_Class(value);
318 is_subclass = PyObject_IsSubclass(inclass, type);
319 if (is_subclass < 0) {
320 goto error;
321 }
322 }
323
324 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 whose class is (or is derived from) type, then use the
326 value as an argument to instantiation of the type
327 class.
328 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200329 if (!is_subclass) {
330 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200331 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200332 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200335 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200337 /* If the class of the instance doesn't exactly match the
338 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 */
340 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200341 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 Py_DECREF(type);
343 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 }
345 }
346 *exc = type;
347 *val = value;
348 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200349
350 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 Py_DECREF(type);
352 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200353 recursion_depth++;
354 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200355 _PyErr_SetString(tstate, PyExc_RecursionError,
356 "maximum recursion depth exceeded "
357 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200358 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 /* If the new exception doesn't set a traceback and the old
360 exception had a traceback, use the old traceback for the
361 new exception. It's better than nothing.
362 */
363 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200364 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200365 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 if (initial_tb != NULL) {
367 if (*tb == NULL)
368 *tb = initial_tb;
369 else
370 Py_DECREF(initial_tb);
371 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200372 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
373 corresponding RecursionError could not be normalized, and the
374 MemoryError raised when normalize this RecursionError could not be
375 normalized. */
376 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200377 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
378 Py_FatalError("Cannot recover from MemoryErrors "
379 "while normalizing exceptions.");
380 }
381 else {
382 Py_FatalError("Cannot recover from the recursive normalization "
383 "of an exception.");
384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200386 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000387}
388
389
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200391PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Victor Stinner50b48572018-11-01 01:51:40 +0100393 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200394 _PyErr_NormalizeException(tstate, exc, val, tb);
395}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200397
Victor Stinner438a12d2019-05-24 17:01:38 +0200398void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200399_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
400 PyObject **p_traceback)
401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 *p_type = tstate->curexc_type;
403 *p_value = tstate->curexc_value;
404 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 tstate->curexc_type = NULL;
407 tstate->curexc_value = NULL;
408 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409}
410
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200411
412void
413PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
414{
415 PyThreadState *tstate = _PyThreadState_GET();
416 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
417}
418
419
Victor Stinner438a12d2019-05-24 17:01:38 +0200420void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200421_PyErr_Clear(PyThreadState *tstate)
422{
423 _PyErr_Restore(tstate, NULL, NULL, NULL);
424}
425
426
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200430 PyThreadState *tstate = _PyThreadState_GET();
431 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000433
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200434
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200435void
Julien Danjou3430c552020-01-13 17:30:14 +0100436_PyErr_GetExcInfo(PyThreadState *tstate,
437 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200438{
Mark Shannonae3087c2017-10-22 22:41:51 +0100439 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
440 *p_type = exc_info->exc_type;
441 *p_value = exc_info->exc_value;
442 *p_traceback = exc_info->exc_traceback;
443
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200444 Py_XINCREF(*p_type);
445 Py_XINCREF(*p_value);
446 Py_XINCREF(*p_traceback);
447}
448
Julien Danjou3430c552020-01-13 17:30:14 +0100449
450void
451PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
452{
453 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100454 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100455}
456
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200457void
458PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
459{
460 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100461 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200462
Mark Shannonae3087c2017-10-22 22:41:51 +0100463 oldtype = tstate->exc_info->exc_type;
464 oldvalue = tstate->exc_info->exc_value;
465 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200466
Mark Shannonae3087c2017-10-22 22:41:51 +0100467 tstate->exc_info->exc_type = p_type;
468 tstate->exc_info->exc_value = p_value;
469 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200470
471 Py_XDECREF(oldtype);
472 Py_XDECREF(oldvalue);
473 Py_XDECREF(oldtraceback);
474}
475
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300476/* Like PyErr_Restore(), but if an exception is already set,
477 set the context associated with it.
478 */
479void
480_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
481{
482 if (exc == NULL)
483 return;
484
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200485 PyThreadState *tstate = _PyThreadState_GET();
486 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300487 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200488 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
489 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300490 if (tb != NULL) {
491 PyException_SetTraceback(val, tb);
492 Py_DECREF(tb);
493 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300494 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200495 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300496 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200497 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300498 }
499 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200500 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300501 }
502}
503
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300504static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200505_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
506 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300507{
508 PyObject *exc, *val, *val2, *tb;
509
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200510 assert(_PyErr_Occurred(tstate));
511 _PyErr_Fetch(tstate, &exc, &val, &tb);
512 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300513 if (tb != NULL) {
514 PyException_SetTraceback(val, tb);
515 Py_DECREF(tb);
516 }
517 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200518 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300519
Victor Stinner438a12d2019-05-24 17:01:38 +0200520 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300521
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200522 _PyErr_Fetch(tstate, &exc, &val2, &tb);
523 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300524 Py_INCREF(val);
525 PyException_SetCause(val2, val);
526 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200527 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300528
529 return NULL;
530}
531
532PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100533_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
534 const char *format, ...)
535{
536 va_list vargs;
537#ifdef HAVE_STDARG_PROTOTYPES
538 va_start(vargs, format);
539#else
540 va_start(vargs);
541#endif
542 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
543 va_end(vargs);
544 return NULL;
545}
546
547PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300548_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
549{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200550 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300551 va_list vargs;
552#ifdef HAVE_STDARG_PROTOTYPES
553 va_start(vargs, format);
554#else
555 va_start(vargs);
556#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200557 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300558 va_end(vargs);
559 return NULL;
560}
561
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000562/* Convenience functions to set a type error exception and return 0 */
563
564int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000566{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200567 PyThreadState *tstate = _PyThreadState_GET();
568 _PyErr_SetString(tstate, PyExc_TypeError,
569 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000571}
572
Guido van Rossum373c8691997-04-29 18:22:47 +0000573PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200574_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000575{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600576 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200577 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
578 initialized by _PyExc_Init() */
579 Py_FatalError("Out of memory and PyExc_MemoryError is not "
580 "initialized yet");
581 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200582 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000584}
585
Guido van Rossum373c8691997-04-29 18:22:47 +0000586PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200587PyErr_NoMemory(void)
588{
589 PyThreadState *tstate = _PyThreadState_GET();
590 return _PyErr_NoMemory(tstate);
591}
592
593PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000594PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000595{
Larry Hastingsb0827312014-02-09 22:05:19 -0800596 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
597}
598
599PyObject *
600PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
601{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200602 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200604 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100606#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000608#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000609
Guido van Rossume9fbc091995-02-18 14:52:19 +0000610#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (i == EINTR && PyErr_CheckSignals())
612 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000613#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000614
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000615#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100616 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600617 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100618 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100619 }
620 else {
621 /* Sometimes errno didn't get set */
622 message = PyUnicode_FromString("Error");
623 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (i == 0)
626 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
627 else
628 {
629 /* Note that the Win32 errors do not lineup with the
630 errno error. So if the error is in the MSVC error
631 table, we use it, otherwise we assume it really _is_
632 a Win32 error code
633 */
634 if (i > 0 && i < _sys_nerr) {
635 message = PyUnicode_FromString(_sys_errlist[i]);
636 }
637 else {
638 int len = FormatMessageW(
639 FORMAT_MESSAGE_ALLOCATE_BUFFER |
640 FORMAT_MESSAGE_FROM_SYSTEM |
641 FORMAT_MESSAGE_IGNORE_INSERTS,
642 NULL, /* no message source */
643 i,
644 MAKELANGID(LANG_NEUTRAL,
645 SUBLANG_DEFAULT),
646 /* Default language */
647 (LPWSTR) &s_buf,
648 0, /* size not used */
649 NULL); /* no args */
650 if (len==0) {
651 /* Only ever seen this in out-of-mem
652 situations */
653 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300654 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 } else {
656 /* remove trailing cr/lf and dots */
657 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
658 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200659 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 }
661 }
662 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000663#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 if (message == NULL)
666 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000667#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 return NULL;
671 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000672
Larry Hastingsb0827312014-02-09 22:05:19 -0800673 if (filenameObject != NULL) {
674 if (filenameObject2 != NULL)
675 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
676 else
677 args = Py_BuildValue("(iOO)", i, message, filenameObject);
678 } else {
679 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200680 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800681 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000683
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200684 if (args != NULL) {
685 v = PyObject_Call(exc, args, NULL);
686 Py_DECREF(args);
687 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200688 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200689 Py_DECREF(v);
690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000692#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000696}
Guido van Rossum743007d1999-04-21 15:27:31 +0000697
Barry Warsaw97d95151998-07-23 16:05:56 +0000698PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000699PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800702 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 Py_XDECREF(name);
704 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000705}
706
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000707#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000708PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000709PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000710{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200711 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800712 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 Py_XDECREF(name);
714 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000715}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000716#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000717
718PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000720{
Larry Hastingsb0827312014-02-09 22:05:19 -0800721 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000722}
Guido van Rossum683a0721990-10-21 22:09:12 +0000723
Brett Cannonbf364092006-03-01 04:25:17 +0000724#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000725/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000726PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 PyObject *exc,
728 int ierr,
729 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000730{
Larry Hastingsb0827312014-02-09 22:05:19 -0800731 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
732 filenameObject, NULL);
733}
734
735PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
736 PyObject *exc,
737 int ierr,
738 PyObject *filenameObject,
739 PyObject *filenameObject2)
740{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200741 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 int len;
743 WCHAR *s_buf = NULL; /* Free via LocalFree */
744 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200745 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200748 if (err==0) {
749 err = GetLastError();
750 }
751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 len = FormatMessageW(
753 /* Error API error */
754 FORMAT_MESSAGE_ALLOCATE_BUFFER |
755 FORMAT_MESSAGE_FROM_SYSTEM |
756 FORMAT_MESSAGE_IGNORE_INSERTS,
757 NULL, /* no message source */
758 err,
759 MAKELANGID(LANG_NEUTRAL,
760 SUBLANG_DEFAULT), /* Default language */
761 (LPWSTR) &s_buf,
762 0, /* size not used */
763 NULL); /* no args */
764 if (len==0) {
765 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300766 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 s_buf = NULL;
768 } else {
769 /* remove trailing cr/lf and dots */
770 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
771 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200772 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 if (message == NULL)
776 {
777 LocalFree(s_buf);
778 return NULL;
779 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000780
Larry Hastingsb0827312014-02-09 22:05:19 -0800781 if (filenameObject == NULL) {
782 assert(filenameObject2 == NULL);
783 filenameObject = filenameObject2 = Py_None;
784 }
785 else if (filenameObject2 == NULL)
786 filenameObject2 = Py_None;
787 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200788 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800789 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000791
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200792 if (args != NULL) {
793 v = PyObject_Call(exc, args, NULL);
794 Py_DECREF(args);
795 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200796 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200797 Py_DECREF(v);
798 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 }
800 LocalFree(s_buf);
801 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000802}
803
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000804PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 PyObject *exc,
806 int ierr,
807 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000808{
Victor Stinner92be9392010-12-28 00:28:21 +0000809 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800810 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800812 name,
813 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 Py_XDECREF(name);
815 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000816}
817
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000818PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 PyObject *exc,
820 int ierr,
821 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000822{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200823 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800824 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800826 name,
827 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 Py_XDECREF(name);
829 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000830}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000831
Thomas Heller085358a2002-07-29 14:27:41 +0000832PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
833{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800834 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000835}
836
Guido van Rossum795e1892000-02-17 15:19:15 +0000837PyObject *PyErr_SetFromWindowsErr(int ierr)
838{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800839 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
840 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800841}
842
Thomas Heller085358a2002-07-29 14:27:41 +0000843PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 int ierr,
845 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000846{
Victor Stinner92be9392010-12-28 00:28:21 +0000847 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800848 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200849 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800850 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 Py_XDECREF(name);
852 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000853}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000854
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000855PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 int ierr,
857 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000858{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200859 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800860 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200861 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800862 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 Py_XDECREF(name);
864 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000865}
Guido van Rossum795e1892000-02-17 15:19:15 +0000866#endif /* MS_WINDOWS */
867
Brett Cannon79ec55e2012-04-12 20:24:54 -0400868PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700869PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
870 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400871{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200872 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700873 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200874 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500875
Eric Snow46f97b82016-09-07 16:56:15 -0700876 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
877 if (issubclass < 0) {
878 return NULL;
879 }
880 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200881 _PyErr_SetString(tstate, PyExc_TypeError,
882 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500883 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200884 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500885
Eric Snow46f97b82016-09-07 16:56:15 -0700886 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200887 _PyErr_SetString(tstate, PyExc_TypeError,
888 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500889 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400890 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500891
Brian Curtin94c001b2012-04-18 08:30:51 -0500892 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500893 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500894 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500895 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500896 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500897 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500898
Eric Snow46f97b82016-09-07 16:56:15 -0700899 kwargs = PyDict_New();
900 if (kwargs == NULL) {
901 return NULL;
902 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200903 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300904 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200905 }
906 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300907 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200908 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400909
Petr Viktorinffd97532020-02-11 17:46:57 +0100910 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400911 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200912 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500913 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400914 }
915
Berker Peksagec766d32016-05-01 09:06:36 +0300916done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400917 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500918 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400919}
920
Eric Snow46f97b82016-09-07 16:56:15 -0700921PyObject *
922PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
923{
924 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
925}
926
Guido van Rossum683a0721990-10-21 22:09:12 +0000927void
Neal Norwitzb382b842007-08-24 20:00:37 +0000928_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000929{
Victor Stinner438a12d2019-05-24 17:01:38 +0200930 PyThreadState *tstate = _PyThreadState_GET();
931 _PyErr_Format(tstate, PyExc_SystemError,
932 "%s:%d: bad argument to internal function",
933 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000934}
935
936/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
937 export the entry point for existing object code: */
938#undef PyErr_BadInternalCall
939void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000940PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000941{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200942 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200943 PyThreadState *tstate = _PyThreadState_GET();
944 _PyErr_SetString(tstate, PyExc_SystemError,
945 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000946}
Fred Drake6d63adf2000-08-24 22:38:39 +0000947#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
948
Guido van Rossum1548bac1997-02-14 17:09:47 +0000949
Victor Stinner438a12d2019-05-24 17:01:38 +0200950static PyObject *
951_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
952 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000955
Victor Stinnerde821be2015-03-24 12:41:23 +0100956 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
957 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200958 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100961
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200962 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000965}
Guido van Rossum7617e051997-09-16 18:43:50 +0000966
967
Antoine Pitrou0676a402014-09-30 21:16:27 +0200968PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200969PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
970{
971 PyThreadState *tstate = _PyThreadState_GET();
972 return _PyErr_FormatV(tstate, exception, format, vargs);
973}
974
975
976PyObject *
977_PyErr_Format(PyThreadState *tstate, PyObject *exception,
978 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200979{
980 va_list vargs;
981#ifdef HAVE_STDARG_PROTOTYPES
982 va_start(vargs, format);
983#else
984 va_start(vargs);
985#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200986 _PyErr_FormatV(tstate, exception, format, vargs);
987 va_end(vargs);
988 return NULL;
989}
990
991
992PyObject *
993PyErr_Format(PyObject *exception, const char *format, ...)
994{
995 PyThreadState *tstate = _PyThreadState_GET();
996 va_list vargs;
997#ifdef HAVE_STDARG_PROTOTYPES
998 va_start(vargs, format);
999#else
1000 va_start(vargs);
1001#endif
1002 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001003 va_end(vargs);
1004 return NULL;
1005}
1006
Thomas Wouters477c8d52006-05-27 19:21:47 +00001007
Guido van Rossum7617e051997-09-16 18:43:50 +00001008PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001009PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001010{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001011 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 PyObject *modulename = NULL;
1013 PyObject *classname = NULL;
1014 PyObject *mydict = NULL;
1015 PyObject *bases = NULL;
1016 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001017
1018 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001020 _PyErr_SetString(tstate, PyExc_SystemError,
1021 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 return NULL;
1023 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001024 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001026 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 if (dict == NULL) {
1028 dict = mydict = PyDict_New();
1029 if (dict == NULL)
1030 goto failure;
1031 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001032
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001033 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001034 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001035 goto failure;
1036 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 modulename = PyUnicode_FromStringAndSize(name,
1038 (Py_ssize_t)(dot-name));
1039 if (modulename == NULL)
1040 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001041 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 goto failure;
1043 }
1044 if (PyTuple_Check(base)) {
1045 bases = base;
1046 /* INCREF as we create a new ref in the else branch */
1047 Py_INCREF(bases);
1048 } else {
1049 bases = PyTuple_Pack(1, base);
1050 if (bases == NULL)
1051 goto failure;
1052 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001053 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001054 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001056 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 Py_XDECREF(bases);
1058 Py_XDECREF(mydict);
1059 Py_XDECREF(classname);
1060 Py_XDECREF(modulename);
1061 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001062}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001063
Georg Brandl1e28a272009-12-28 08:41:01 +00001064
1065/* Create an exception with docstring */
1066PyObject *
1067PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 int result;
1071 PyObject *ret = NULL;
1072 PyObject *mydict = NULL; /* points to the dict only if we create it */
1073 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 if (dict == NULL) {
1076 dict = mydict = PyDict_New();
1077 if (dict == NULL) {
1078 return NULL;
1079 }
1080 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 if (doc != NULL) {
1083 docobj = PyUnicode_FromString(doc);
1084 if (docobj == NULL)
1085 goto failure;
1086 result = PyDict_SetItemString(dict, "__doc__", docobj);
1087 Py_DECREF(docobj);
1088 if (result < 0)
1089 goto failure;
1090 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001093 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 Py_XDECREF(mydict);
1095 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001096}
1097
1098
Victor Stinneref9d9b62019-05-22 11:28:22 +02001099PyDoc_STRVAR(UnraisableHookArgs__doc__,
1100"UnraisableHookArgs\n\
1101\n\
1102Type used to pass arguments to sys.unraisablehook.");
1103
1104static PyTypeObject UnraisableHookArgsType;
1105
1106static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1107 {"exc_type", "Exception type"},
1108 {"exc_value", "Exception value"},
1109 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001110 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001111 {"object", "Object causing the exception"},
1112 {0}
1113};
1114
1115static PyStructSequence_Desc UnraisableHookArgs_desc = {
1116 .name = "UnraisableHookArgs",
1117 .doc = UnraisableHookArgs__doc__,
1118 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001119 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001120};
1121
1122
Victor Stinner331a6a52019-05-27 16:39:22 +02001123PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001124_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001125{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001126 if (UnraisableHookArgsType.tp_name == NULL) {
1127 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1128 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001129 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001130 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001131 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001132 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001133}
1134
1135
1136static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001137make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001138 PyObject *exc_value, PyObject *exc_tb,
1139 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001140{
1141 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1142 if (args == NULL) {
1143 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001145
Victor Stinneref9d9b62019-05-22 11:28:22 +02001146 Py_ssize_t pos = 0;
1147#define ADD_ITEM(exc_type) \
1148 do { \
1149 if (exc_type == NULL) { \
1150 exc_type = Py_None; \
1151 } \
1152 Py_INCREF(exc_type); \
1153 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1154 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001155
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001156
Victor Stinneref9d9b62019-05-22 11:28:22 +02001157 ADD_ITEM(exc_type);
1158 ADD_ITEM(exc_value);
1159 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001160 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001161 ADD_ITEM(obj);
1162#undef ADD_ITEM
1163
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001164 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001165 Py_DECREF(args);
1166 return NULL;
1167 }
1168 return args;
1169}
1170
1171
1172
1173/* Default implementation of sys.unraisablehook.
1174
1175 It can be called to log the exception of a custom sys.unraisablehook.
1176
1177 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1178static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001179write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1180 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001181 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001182{
1183 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001184 if (err_msg != NULL && err_msg != Py_None) {
1185 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1186 return -1;
1187 }
1188 if (PyFile_WriteString(": ", file) < 0) {
1189 return -1;
1190 }
1191 }
1192 else {
1193 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1194 return -1;
1195 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001196 }
1197
1198 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001199 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001200 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1201 return -1;
1202 }
1203 }
1204 if (PyFile_WriteString("\n", file) < 0) {
1205 return -1;
1206 }
1207 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001208 else if (err_msg != NULL && err_msg != Py_None) {
1209 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1210 return -1;
1211 }
1212 if (PyFile_WriteString(":\n", file) < 0) {
1213 return -1;
1214 }
1215 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001216
1217 if (exc_tb != NULL && exc_tb != Py_None) {
1218 if (PyTraceBack_Print(exc_tb, file) < 0) {
1219 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001220 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001221 }
1222 }
1223
Victor Stinnerdf22c032019-05-23 01:00:58 +02001224 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001225 return -1;
1226 }
1227
1228 assert(PyExceptionClass_Check(exc_type));
1229 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001230 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001231 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001232 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001233 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001234 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001235 }
1236
Victor Stinneref9d9b62019-05-22 11:28:22 +02001237 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001238 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001239 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001240 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001241 if (PyFile_WriteString("<unknown>", file) < 0) {
1242 return -1;
1243 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001244 }
1245 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001246 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001247 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1248 Py_DECREF(moduleName);
1249 return -1;
1250 }
1251 Py_DECREF(moduleName);
1252 if (PyFile_WriteString(".", file) < 0) {
1253 return -1;
1254 }
1255 }
1256 else {
1257 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001258 }
1259 }
1260 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001261 if (PyFile_WriteString("<unknown>", file) < 0) {
1262 return -1;
1263 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001264 }
1265 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001266 if (PyFile_WriteString(className, file) < 0) {
1267 return -1;
1268 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001269 }
1270
Victor Stinneref9d9b62019-05-22 11:28:22 +02001271 if (exc_value && exc_value != Py_None) {
1272 if (PyFile_WriteString(": ", file) < 0) {
1273 return -1;
1274 }
1275 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001276 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001277 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1278 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001279 }
1280 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001281 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001282
Victor Stinneref9d9b62019-05-22 11:28:22 +02001283 if (PyFile_WriteString("\n", file) < 0) {
1284 return -1;
1285 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001286
1287 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001288 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001289 if (!res) {
1290 return -1;
1291 }
1292 Py_DECREF(res);
1293
Victor Stinneref9d9b62019-05-22 11:28:22 +02001294 return 0;
1295}
1296
1297
1298static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001299write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001300 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1301 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001302{
1303 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1304 if (file == NULL || file == Py_None) {
1305 return 0;
1306 }
1307
1308 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1309 while we use it */
1310 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001311 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001312 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001313 Py_DECREF(file);
1314
1315 return res;
1316}
1317
1318
1319PyObject*
1320_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1321{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001322 PyThreadState *tstate = _PyThreadState_GET();
1323
Andy Lester55728702020-03-06 16:53:17 -06001324 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001325 _PyErr_SetString(tstate, PyExc_TypeError,
1326 "sys.unraisablehook argument type "
1327 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001328 return NULL;
1329 }
1330
1331 /* Borrowed references */
1332 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1333 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1334 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001335 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1336 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001337
Victor Stinner71c52e32019-05-27 08:57:14 +02001338 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001339 return NULL;
1340 }
1341 Py_RETURN_NONE;
1342}
1343
1344
1345/* Call sys.unraisablehook().
1346
1347 This function can be used when an exception has occurred but there is no way
1348 for Python to handle it. For example, when a destructor raises an exception
1349 or during garbage collection (gc.collect()).
1350
Victor Stinner71c52e32019-05-27 08:57:14 +02001351 If err_msg_str is non-NULL, the error message is formatted as:
1352 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1353 error message.
1354
Victor Stinneref9d9b62019-05-22 11:28:22 +02001355 An exception must be set when calling this function. */
1356void
Victor Stinner71c52e32019-05-27 08:57:14 +02001357_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001358{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001359 PyThreadState *tstate = _PyThreadState_GET();
1360 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001361
Victor Stinner71c52e32019-05-27 08:57:14 +02001362 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001363 PyObject *exc_type, *exc_value, *exc_tb;
1364 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001365
1366 assert(exc_type != NULL);
1367
1368 if (exc_type == NULL) {
1369 /* sys.unraisablehook requires that at least exc_type is set */
1370 goto default_hook;
1371 }
1372
Victor Stinnerdf22c032019-05-23 01:00:58 +02001373 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001374 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001375 if (frame != NULL) {
1376 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1377 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001378 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001379 }
1380 }
1381 }
1382
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001383 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001384
1385 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1386 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001387 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001388 }
1389 }
1390
Victor Stinner71c52e32019-05-27 08:57:14 +02001391 if (err_msg_str != NULL) {
1392 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1393 if (err_msg == NULL) {
1394 PyErr_Clear();
1395 }
1396 }
1397
Steve Dowerbea33f52019-11-28 08:46:11 -08001398 PyObject *hook_args = make_unraisable_hook_args(
1399 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1400 if (hook_args == NULL) {
1401 err_msg_str = ("Exception ignored on building "
1402 "sys.unraisablehook arguments");
1403 goto error;
1404 }
1405
Victor Stinneref9d9b62019-05-22 11:28:22 +02001406 _Py_IDENTIFIER(unraisablehook);
1407 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001408 if (hook == NULL) {
1409 Py_DECREF(hook_args);
1410 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001411 }
1412
Steve Dowerbea33f52019-11-28 08:46:11 -08001413 if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) {
1414 Py_DECREF(hook_args);
1415 err_msg_str = "Exception ignored in audit hook";
1416 obj = NULL;
1417 goto error;
1418 }
1419
1420 if (hook == Py_None) {
1421 Py_DECREF(hook_args);
1422 goto default_hook;
1423 }
1424
Petr Viktorinffd97532020-02-11 17:46:57 +01001425 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001426 Py_DECREF(hook_args);
1427 if (res != NULL) {
1428 Py_DECREF(res);
1429 goto done;
1430 }
1431
1432 /* sys.unraisablehook failed: log its error using default hook */
1433 obj = hook;
1434 err_msg_str = NULL;
1435
1436error:
1437 /* err_msg_str and obj have been updated and we have a new exception */
1438 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1439 err_msg_str : "Exception ignored in sys.unraisablehook"));
1440 Py_XDECREF(exc_type);
1441 Py_XDECREF(exc_value);
1442 Py_XDECREF(exc_tb);
1443 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1444
Victor Stinneref9d9b62019-05-22 11:28:22 +02001445default_hook:
1446 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001447 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1448 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001449
1450done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001451 Py_XDECREF(exc_type);
1452 Py_XDECREF(exc_value);
1453 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001454 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001455 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001456}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001457
Victor Stinner71c52e32019-05-27 08:57:14 +02001458
1459void
1460PyErr_WriteUnraisable(PyObject *obj)
1461{
1462 _PyErr_WriteUnraisableMsg(NULL, obj);
1463}
1464
1465
Armin Rigo092381a2003-10-25 14:29:27 +00001466extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001467
Guido van Rossum2fd45652001-02-28 21:46:24 +00001468
Benjamin Peterson2c539712010-09-20 22:42:10 +00001469void
Victor Stinner14e461d2013-08-26 22:28:21 +02001470PyErr_SyntaxLocation(const char *filename, int lineno)
1471{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001472 PyErr_SyntaxLocationEx(filename, lineno, -1);
1473}
1474
1475
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001476/* Set file and line information for the current exception.
1477 If the exception is not a SyntaxError, also sets additional attributes
1478 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001479
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001480void
Victor Stinner14e461d2013-08-26 22:28:21 +02001481PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001484 _Py_IDENTIFIER(filename);
1485 _Py_IDENTIFIER(lineno);
1486 _Py_IDENTIFIER(msg);
1487 _Py_IDENTIFIER(offset);
1488 _Py_IDENTIFIER(print_file_and_line);
1489 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001490 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001493 _PyErr_Fetch(tstate, &exc, &v, &tb);
1494 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 /* XXX check that it is, indeed, a syntax error. It might not
1496 * be, though. */
1497 tmp = PyLong_FromLong(lineno);
1498 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001499 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001501 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1502 _PyErr_Clear(tstate);
1503 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 Py_DECREF(tmp);
1505 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001506 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001507 if (col_offset >= 0) {
1508 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001509 if (tmp == NULL) {
1510 _PyErr_Clear(tstate);
1511 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001512 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001513 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1514 _PyErr_Clear(tstate);
1515 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001516 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001518 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1519 _PyErr_Clear(tstate);
1520 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001521
Victor Stinner14e461d2013-08-26 22:28:21 +02001522 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001524 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1525 _PyErr_Clear(tstate);
1526 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 Py_DECREF(tmp);
1528 }
1529 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001531 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 tmp = PyObject_Str(v);
1533 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001534 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1535 _PyErr_Clear(tstate);
1536 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001538 }
1539 else {
1540 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 }
1542 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001543 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1544 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001545 Py_None)) {
1546 _PyErr_Clear(tstate);
1547 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 }
1549 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001550 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001551}
1552
Victor Stinner14e461d2013-08-26 22:28:21 +02001553void
1554PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1555{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001556 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001557 PyObject *fileobj;
1558 if (filename != NULL) {
1559 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001560 if (fileobj == NULL) {
1561 _PyErr_Clear(tstate);
1562 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001563 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001564 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001565 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001566 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001567 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1568 Py_XDECREF(fileobj);
1569}
1570
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001571/* Attempt to load the line of text that the exception refers to. If it
1572 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001573
1574 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001575 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001576
Antoine Pitrou409b5382013-10-12 22:41:17 +02001577static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001578err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 int i;
1581 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (fp == NULL)
1584 return NULL;
1585 for (i = 0; i < lineno; i++) {
1586 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1587 do {
1588 *pLastChar = '\0';
1589 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1590 fp, NULL) == NULL)
1591 break;
1592 /* fgets read *something*; if it didn't get as
1593 far as pLastChar, it must have found a newline
1594 or hit the end of the file; if pLastChar is \n,
1595 it obviously found a newline; else we haven't
1596 yet seen a newline, so must continue */
1597 } while (*pLastChar != '\0' && *pLastChar != '\n');
1598 }
1599 fclose(fp);
1600 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001602 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001604 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 return res;
1606 }
1607 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001608}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001609
Victor Stinner14e461d2013-08-26 22:28:21 +02001610PyObject *
1611PyErr_ProgramText(const char *filename, int lineno)
1612{
1613 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001614 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001615 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001616 }
1617 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001618 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001619 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001620}
1621
1622PyObject *
1623PyErr_ProgramTextObject(PyObject *filename, int lineno)
1624{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001625 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001626 return NULL;
1627 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001628
1629 PyThreadState *tstate = _PyThreadState_GET();
1630 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1631 if (fp == NULL) {
1632 _PyErr_Clear(tstate);
1633 return NULL;
1634 }
1635 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001636}
1637
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001638#ifdef __cplusplus
1639}
1640#endif