blob: cdb44605056a5fec3e0ad0688908d4d80ea598e1 [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
Victor Stinnerbd303c12013-11-07 23:07:29 +010027_Py_IDENTIFIER(builtins);
28_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020029_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010030
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000031
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 {
Jeroen Demeyer196a5302019-07-04 12:31:34 +020096 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();
454 return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
455}
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{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200576 if (Py_TYPE(PyExc_MemoryError) == NULL) {
577 /* 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) {
617 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
Eric Snow46f97b82016-09-07 16:56:15 -0700910 error = _PyObject_FastCallDict(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();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001012 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 PyObject *modulename = NULL;
1014 PyObject *classname = NULL;
1015 PyObject *mydict = NULL;
1016 PyObject *bases = NULL;
1017 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001018
1019 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001021 _PyErr_SetString(tstate, PyExc_SystemError,
1022 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 return NULL;
1024 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001025 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 if (dict == NULL) {
1029 dict = mydict = PyDict_New();
1030 if (dict == NULL)
1031 goto failure;
1032 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001033
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001034 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001035 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001036 goto failure;
1037 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 modulename = PyUnicode_FromStringAndSize(name,
1039 (Py_ssize_t)(dot-name));
1040 if (modulename == NULL)
1041 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001042 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 goto failure;
1044 }
1045 if (PyTuple_Check(base)) {
1046 bases = base;
1047 /* INCREF as we create a new ref in the else branch */
1048 Py_INCREF(bases);
1049 } else {
1050 bases = PyTuple_Pack(1, base);
1051 if (bases == NULL)
1052 goto failure;
1053 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001054 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001055 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001057 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 Py_XDECREF(bases);
1059 Py_XDECREF(mydict);
1060 Py_XDECREF(classname);
1061 Py_XDECREF(modulename);
1062 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001063}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001064
Georg Brandl1e28a272009-12-28 08:41:01 +00001065
1066/* Create an exception with docstring */
1067PyObject *
1068PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 int result;
1072 PyObject *ret = NULL;
1073 PyObject *mydict = NULL; /* points to the dict only if we create it */
1074 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 if (dict == NULL) {
1077 dict = mydict = PyDict_New();
1078 if (dict == NULL) {
1079 return NULL;
1080 }
1081 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 if (doc != NULL) {
1084 docobj = PyUnicode_FromString(doc);
1085 if (docobj == NULL)
1086 goto failure;
1087 result = PyDict_SetItemString(dict, "__doc__", docobj);
1088 Py_DECREF(docobj);
1089 if (result < 0)
1090 goto failure;
1091 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001094 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 Py_XDECREF(mydict);
1096 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001097}
1098
1099
Victor Stinneref9d9b62019-05-22 11:28:22 +02001100PyDoc_STRVAR(UnraisableHookArgs__doc__,
1101"UnraisableHookArgs\n\
1102\n\
1103Type used to pass arguments to sys.unraisablehook.");
1104
1105static PyTypeObject UnraisableHookArgsType;
1106
1107static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1108 {"exc_type", "Exception type"},
1109 {"exc_value", "Exception value"},
1110 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001111 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001112 {"object", "Object causing the exception"},
1113 {0}
1114};
1115
1116static PyStructSequence_Desc UnraisableHookArgs_desc = {
1117 .name = "UnraisableHookArgs",
1118 .doc = UnraisableHookArgs__doc__,
1119 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001120 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001121};
1122
1123
Victor Stinner331a6a52019-05-27 16:39:22 +02001124PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001125_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001126{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001127 if (UnraisableHookArgsType.tp_name == NULL) {
1128 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1129 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001130 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001131 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001132 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001133 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001134}
1135
1136
1137static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001138make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001139 PyObject *exc_value, PyObject *exc_tb,
1140 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001141{
1142 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1143 if (args == NULL) {
1144 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001146
Victor Stinneref9d9b62019-05-22 11:28:22 +02001147 Py_ssize_t pos = 0;
1148#define ADD_ITEM(exc_type) \
1149 do { \
1150 if (exc_type == NULL) { \
1151 exc_type = Py_None; \
1152 } \
1153 Py_INCREF(exc_type); \
1154 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1155 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001156
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001157
Victor Stinneref9d9b62019-05-22 11:28:22 +02001158 ADD_ITEM(exc_type);
1159 ADD_ITEM(exc_value);
1160 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001161 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001162 ADD_ITEM(obj);
1163#undef ADD_ITEM
1164
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001165 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001166 Py_DECREF(args);
1167 return NULL;
1168 }
1169 return args;
1170}
1171
1172
1173
1174/* Default implementation of sys.unraisablehook.
1175
1176 It can be called to log the exception of a custom sys.unraisablehook.
1177
1178 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1179static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001180write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1181 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001182 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001183{
1184 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001185 if (err_msg != NULL && err_msg != Py_None) {
1186 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1187 return -1;
1188 }
1189 if (PyFile_WriteString(": ", file) < 0) {
1190 return -1;
1191 }
1192 }
1193 else {
1194 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1195 return -1;
1196 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001197 }
1198
1199 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001200 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001201 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1202 return -1;
1203 }
1204 }
1205 if (PyFile_WriteString("\n", file) < 0) {
1206 return -1;
1207 }
1208 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001209 else if (err_msg != NULL && err_msg != Py_None) {
1210 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1211 return -1;
1212 }
1213 if (PyFile_WriteString(":\n", file) < 0) {
1214 return -1;
1215 }
1216 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001217
1218 if (exc_tb != NULL && exc_tb != Py_None) {
1219 if (PyTraceBack_Print(exc_tb, file) < 0) {
1220 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001221 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001222 }
1223 }
1224
Victor Stinnerdf22c032019-05-23 01:00:58 +02001225 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001226 return -1;
1227 }
1228
1229 assert(PyExceptionClass_Check(exc_type));
1230 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001231 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001232 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001233 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001234 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001235 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001236 }
1237
Victor Stinneref9d9b62019-05-22 11:28:22 +02001238 _Py_IDENTIFIER(__module__);
1239 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001240 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001241 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001242 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001243 if (PyFile_WriteString("<unknown>", file) < 0) {
1244 return -1;
1245 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001246 }
1247 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001248 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001249 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1250 Py_DECREF(moduleName);
1251 return -1;
1252 }
1253 Py_DECREF(moduleName);
1254 if (PyFile_WriteString(".", file) < 0) {
1255 return -1;
1256 }
1257 }
1258 else {
1259 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001260 }
1261 }
1262 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001263 if (PyFile_WriteString("<unknown>", file) < 0) {
1264 return -1;
1265 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001266 }
1267 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001268 if (PyFile_WriteString(className, file) < 0) {
1269 return -1;
1270 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001271 }
1272
Victor Stinneref9d9b62019-05-22 11:28:22 +02001273 if (exc_value && exc_value != Py_None) {
1274 if (PyFile_WriteString(": ", file) < 0) {
1275 return -1;
1276 }
1277 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001278 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001279 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1280 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001281 }
1282 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001283 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001284
Victor Stinneref9d9b62019-05-22 11:28:22 +02001285 if (PyFile_WriteString("\n", file) < 0) {
1286 return -1;
1287 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001288
1289 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001290 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001291 if (!res) {
1292 return -1;
1293 }
1294 Py_DECREF(res);
1295
Victor Stinneref9d9b62019-05-22 11:28:22 +02001296 return 0;
1297}
1298
1299
1300static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001301write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001302 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1303 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001304{
1305 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1306 if (file == NULL || file == Py_None) {
1307 return 0;
1308 }
1309
1310 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1311 while we use it */
1312 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001313 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001314 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001315 Py_DECREF(file);
1316
1317 return res;
1318}
1319
1320
1321PyObject*
1322_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1323{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001324 PyThreadState *tstate = _PyThreadState_GET();
1325
Victor Stinneref9d9b62019-05-22 11:28:22 +02001326 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001327 _PyErr_SetString(tstate, PyExc_TypeError,
1328 "sys.unraisablehook argument type "
1329 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001330 return NULL;
1331 }
1332
1333 /* Borrowed references */
1334 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1335 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1336 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001337 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1338 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001339
Victor Stinner71c52e32019-05-27 08:57:14 +02001340 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001341 return NULL;
1342 }
1343 Py_RETURN_NONE;
1344}
1345
1346
1347/* Call sys.unraisablehook().
1348
1349 This function can be used when an exception has occurred but there is no way
1350 for Python to handle it. For example, when a destructor raises an exception
1351 or during garbage collection (gc.collect()).
1352
Victor Stinner71c52e32019-05-27 08:57:14 +02001353 If err_msg_str is non-NULL, the error message is formatted as:
1354 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1355 error message.
1356
Victor Stinneref9d9b62019-05-22 11:28:22 +02001357 An exception must be set when calling this function. */
1358void
Victor Stinner71c52e32019-05-27 08:57:14 +02001359_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001360{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001361 PyThreadState *tstate = _PyThreadState_GET();
1362 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001363
Victor Stinner71c52e32019-05-27 08:57:14 +02001364 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001365 PyObject *exc_type, *exc_value, *exc_tb;
1366 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001367
1368 assert(exc_type != NULL);
1369
1370 if (exc_type == NULL) {
1371 /* sys.unraisablehook requires that at least exc_type is set */
1372 goto default_hook;
1373 }
1374
Victor Stinnerdf22c032019-05-23 01:00:58 +02001375 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001376 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001377 if (frame != NULL) {
1378 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1379 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001380 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001381 }
1382 }
1383 }
1384
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001385 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001386
1387 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1388 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001389 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001390 }
1391 }
1392
Victor Stinner71c52e32019-05-27 08:57:14 +02001393 if (err_msg_str != NULL) {
1394 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1395 if (err_msg == NULL) {
1396 PyErr_Clear();
1397 }
1398 }
1399
Steve Dowerbea33f52019-11-28 08:46:11 -08001400 PyObject *hook_args = make_unraisable_hook_args(
1401 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1402 if (hook_args == NULL) {
1403 err_msg_str = ("Exception ignored on building "
1404 "sys.unraisablehook arguments");
1405 goto error;
1406 }
1407
Victor Stinneref9d9b62019-05-22 11:28:22 +02001408 _Py_IDENTIFIER(unraisablehook);
1409 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001410 if (hook == NULL) {
1411 Py_DECREF(hook_args);
1412 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001413 }
1414
Steve Dowerbea33f52019-11-28 08:46:11 -08001415 if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) {
1416 Py_DECREF(hook_args);
1417 err_msg_str = "Exception ignored in audit hook";
1418 obj = NULL;
1419 goto error;
1420 }
1421
1422 if (hook == Py_None) {
1423 Py_DECREF(hook_args);
1424 goto default_hook;
1425 }
1426
1427 PyObject *res = _PyObject_CallOneArg(hook, hook_args);
1428 Py_DECREF(hook_args);
1429 if (res != NULL) {
1430 Py_DECREF(res);
1431 goto done;
1432 }
1433
1434 /* sys.unraisablehook failed: log its error using default hook */
1435 obj = hook;
1436 err_msg_str = NULL;
1437
1438error:
1439 /* err_msg_str and obj have been updated and we have a new exception */
1440 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1441 err_msg_str : "Exception ignored in sys.unraisablehook"));
1442 Py_XDECREF(exc_type);
1443 Py_XDECREF(exc_value);
1444 Py_XDECREF(exc_tb);
1445 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1446
Victor Stinneref9d9b62019-05-22 11:28:22 +02001447default_hook:
1448 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001449 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1450 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001451
1452done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001453 Py_XDECREF(exc_type);
1454 Py_XDECREF(exc_value);
1455 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001456 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001457 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001458}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001459
Victor Stinner71c52e32019-05-27 08:57:14 +02001460
1461void
1462PyErr_WriteUnraisable(PyObject *obj)
1463{
1464 _PyErr_WriteUnraisableMsg(NULL, obj);
1465}
1466
1467
Armin Rigo092381a2003-10-25 14:29:27 +00001468extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001469
Guido van Rossum2fd45652001-02-28 21:46:24 +00001470
Benjamin Peterson2c539712010-09-20 22:42:10 +00001471void
Victor Stinner14e461d2013-08-26 22:28:21 +02001472PyErr_SyntaxLocation(const char *filename, int lineno)
1473{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001474 PyErr_SyntaxLocationEx(filename, lineno, -1);
1475}
1476
1477
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001478/* Set file and line information for the current exception.
1479 If the exception is not a SyntaxError, also sets additional attributes
1480 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001481
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001482void
Victor Stinner14e461d2013-08-26 22:28:21 +02001483PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001486 _Py_IDENTIFIER(filename);
1487 _Py_IDENTIFIER(lineno);
1488 _Py_IDENTIFIER(msg);
1489 _Py_IDENTIFIER(offset);
1490 _Py_IDENTIFIER(print_file_and_line);
1491 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001492 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001495 _PyErr_Fetch(tstate, &exc, &v, &tb);
1496 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 /* XXX check that it is, indeed, a syntax error. It might not
1498 * be, though. */
1499 tmp = PyLong_FromLong(lineno);
1500 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001501 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001503 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1504 _PyErr_Clear(tstate);
1505 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_DECREF(tmp);
1507 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001508 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001509 if (col_offset >= 0) {
1510 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001511 if (tmp == NULL) {
1512 _PyErr_Clear(tstate);
1513 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001514 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001515 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1516 _PyErr_Clear(tstate);
1517 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001518 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001520 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1521 _PyErr_Clear(tstate);
1522 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001523
Victor Stinner14e461d2013-08-26 22:28:21 +02001524 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001526 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1527 _PyErr_Clear(tstate);
1528 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 Py_DECREF(tmp);
1530 }
1531 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001533 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 tmp = PyObject_Str(v);
1535 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001536 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1537 _PyErr_Clear(tstate);
1538 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001540 }
1541 else {
1542 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 }
1544 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001545 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1546 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001547 Py_None)) {
1548 _PyErr_Clear(tstate);
1549 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 }
1551 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001552 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001553}
1554
Victor Stinner14e461d2013-08-26 22:28:21 +02001555void
1556PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1557{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001558 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001559 PyObject *fileobj;
1560 if (filename != NULL) {
1561 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001562 if (fileobj == NULL) {
1563 _PyErr_Clear(tstate);
1564 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001565 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001566 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001567 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001568 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001569 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1570 Py_XDECREF(fileobj);
1571}
1572
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001573/* Attempt to load the line of text that the exception refers to. If it
1574 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001575
1576 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001577 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001578
Antoine Pitrou409b5382013-10-12 22:41:17 +02001579static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001580err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 int i;
1583 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 if (fp == NULL)
1586 return NULL;
1587 for (i = 0; i < lineno; i++) {
1588 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1589 do {
1590 *pLastChar = '\0';
1591 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1592 fp, NULL) == NULL)
1593 break;
1594 /* fgets read *something*; if it didn't get as
1595 far as pLastChar, it must have found a newline
1596 or hit the end of the file; if pLastChar is \n,
1597 it obviously found a newline; else we haven't
1598 yet seen a newline, so must continue */
1599 } while (*pLastChar != '\0' && *pLastChar != '\n');
1600 }
1601 fclose(fp);
1602 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001604 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001606 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 return res;
1608 }
1609 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001610}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001611
Victor Stinner14e461d2013-08-26 22:28:21 +02001612PyObject *
1613PyErr_ProgramText(const char *filename, int lineno)
1614{
1615 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001616 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001617 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001618 }
1619 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001620 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001621 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001622}
1623
1624PyObject *
1625PyErr_ProgramTextObject(PyObject *filename, int lineno)
1626{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001627 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001628 return NULL;
1629 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001630
1631 PyThreadState *tstate = _PyThreadState_GET();
1632 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1633 if (fp == NULL) {
1634 _PyErr_Clear(tstate);
1635 return NULL;
1636 }
1637 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001638}
1639
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001640#ifdef __cplusplus
1641}
1642#endif