blob: db007709d263ea3068699842b7e8bbbd97c76dd2 [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 Stinnere5014be2020-04-14 17:52:15 +02007#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +01008#include "pycore_sysmodule.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +02009#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000010
Guido van Rossum53e8d441995-03-09 12:11:31 +000011#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000012#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000013extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000014#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000015#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000016
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000017#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000018#include <windows.h>
19#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000020#endif
21
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000022#include <ctype.h>
23
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024#ifdef __cplusplus
25extern "C" {
26#endif
27
Hai Shi46874c22020-01-30 17:20:25 -060028_Py_IDENTIFIER(__module__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010029_Py_IDENTIFIER(builtins);
30_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020031_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010032
Victor Stinner438a12d2019-05-24 17:01:38 +020033/* Forward declarations */
34static PyObject *
35_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
36 const char *format, va_list vargs);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020037
38
Victor Stinner438a12d2019-05-24 17:01:38 +020039void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020040_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
41 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
46 /* XXX Should never happen -- fatal error instead? */
47 /* Well, it could be None. */
48 Py_DECREF(traceback);
49 traceback = NULL;
50 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 /* Save these in locals to safeguard against recursive
53 invocation through Py_XDECREF */
54 oldtype = tstate->curexc_type;
55 oldvalue = tstate->curexc_value;
56 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 tstate->curexc_type = type;
59 tstate->curexc_value = value;
60 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 Py_XDECREF(oldtype);
63 Py_XDECREF(oldvalue);
64 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065}
66
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020067void
68PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
69{
70 PyThreadState *tstate = _PyThreadState_GET();
71 _PyErr_Restore(tstate, type, value, traceback);
72}
73
74
Mark Shannonae3087c2017-10-22 22:41:51 +010075_PyErr_StackItem *
76_PyErr_GetTopmostException(PyThreadState *tstate)
77{
78 _PyErr_StackItem *exc_info = tstate->exc_info;
79 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
80 exc_info->previous_item != NULL)
81 {
82 exc_info = exc_info->previous_item;
83 }
84 return exc_info;
85}
86
Victor Stinner3a840972016-08-22 23:59:08 +020087static PyObject*
88_PyErr_CreateException(PyObject *exception, PyObject *value)
89{
90 if (value == NULL || value == Py_None) {
91 return _PyObject_CallNoArg(exception);
92 }
93 else if (PyTuple_Check(value)) {
94 return PyObject_Call(exception, value, NULL);
95 }
96 else {
Petr Viktorinffd97532020-02-11 17:46:57 +010097 return PyObject_CallOneArg(exception, value);
Victor Stinner3a840972016-08-22 23:59:08 +020098 }
99}
100
Victor Stinner438a12d2019-05-24 17:01:38 +0200101void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200102_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PyObject *exc_value;
105 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (exception != NULL &&
108 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200109 _PyErr_Format(tstate, PyExc_SystemError,
110 "exception %R not a BaseException subclass",
111 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 return;
113 }
Victor Stinner3a840972016-08-22 23:59:08 +0200114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100116 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 if (exc_value != NULL && exc_value != Py_None) {
118 /* Implicit exception chaining */
119 Py_INCREF(exc_value);
120 if (value == NULL || !PyExceptionInstance_Check(value)) {
121 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200122 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100123
Victor Stinner3a840972016-08-22 23:59:08 +0200124 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100125 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200126 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100127
Victor Stinner3a840972016-08-22 23:59:08 +0200128 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200130 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300131 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200133 }
134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 value = fixed_value;
136 }
Victor Stinner3a840972016-08-22 23:59:08 +0200137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 /* Avoid reference cycles through the context chain.
139 This is O(chain length) but context chains are
140 usually very short. Sensitive readers may try
141 to inline the call to PyException_GetContext. */
142 if (exc_value != value) {
143 PyObject *o = exc_value, *context;
144 while ((context = PyException_GetContext(o))) {
145 Py_DECREF(context);
146 if (context == value) {
147 PyException_SetContext(o, NULL);
148 break;
149 }
150 o = context;
151 }
152 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200153 }
154 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 Py_DECREF(exc_value);
156 }
157 }
158 if (value != NULL && PyExceptionInstance_Check(value))
159 tb = PyException_GetTraceback(value);
160 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200161 _PyErr_Restore(tstate, exception, value, tb);
162}
163
164void
165PyErr_SetObject(PyObject *exception, PyObject *value)
166{
167 PyThreadState *tstate = _PyThreadState_GET();
168 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169}
170
Raymond Hettinger69492da2013-09-02 15:59:26 -0700171/* Set a key error with the specified argument, wrapping it in a
172 * tuple automatically so that tuple keys are not unpacked as the
173 * exception arguments. */
174void
175_PyErr_SetKeyError(PyObject *arg)
176{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200177 PyThreadState *tstate = _PyThreadState_GET();
178 PyObject *tup = PyTuple_Pack(1, arg);
179 if (!tup) {
180 /* caller will expect error to be set anyway */
181 return;
182 }
183 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700184 Py_DECREF(tup);
185}
186
Victor Stinner438a12d2019-05-24 17:01:38 +0200187void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200188_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
189{
190 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
191}
192
193
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000195PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200197 PyThreadState *tstate = _PyThreadState_GET();
198 _PyErr_SetNone(tstate, exception);
199}
200
201
Victor Stinner438a12d2019-05-24 17:01:38 +0200202void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200203_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
204 const char *string)
205{
206 PyObject *value = PyUnicode_FromString(string);
207 _PyErr_SetObject(tstate, exception, value);
208 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
211void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000212PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200214 PyThreadState *tstate = _PyThreadState_GET();
215 _PyErr_SetString(tstate, exception, string);
216}
217
218
Victor Stinnerc6944e72016-11-11 02:13:35 +0100219PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100222 /* The caller must hold the GIL. */
223 assert(PyGILState_Check());
224
Victor Stinner50b48572018-11-01 01:51:40 +0100225 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200226 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227}
228
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000229
230int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000231PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 if (err == NULL || exc == NULL) {
234 /* maybe caused by "import exceptions" that failed early on */
235 return 0;
236 }
237 if (PyTuple_Check(exc)) {
238 Py_ssize_t i, n;
239 n = PyTuple_Size(exc);
240 for (i = 0; i < n; i++) {
241 /* Test recursively */
242 if (PyErr_GivenExceptionMatches(
243 err, PyTuple_GET_ITEM(exc, i)))
244 {
245 return 1;
246 }
247 }
248 return 0;
249 }
250 /* err might be an instance, so check its class. */
251 if (PyExceptionInstance_Check(err))
252 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200255 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000259}
Guido van Rossum743007d1999-04-21 15:27:31 +0000260
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000261
262int
Victor Stinner438a12d2019-05-24 17:01:38 +0200263_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
264{
265 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
266}
267
268
269int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000271{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200272 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200273 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000274}
275
276
xdegaye56d1f5c2017-10-26 15:09:06 +0200277#ifndef Py_NORMALIZE_RECURSION_LIMIT
278#define Py_NORMALIZE_RECURSION_LIMIT 32
279#endif
280
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000281/* Used in many places to normalize a raised exception, including in
282 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000283
284 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000286*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200287void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200288_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
289 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000290{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200291 int recursion_depth = 0;
292 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000293
Serhiy Storchakacf296532017-11-05 11:27:48 +0200294 restart:
295 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 if (type == NULL) {
297 /* There was no exception, so nothing to do. */
298 return;
299 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000300
Serhiy Storchakacf296532017-11-05 11:27:48 +0200301 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 /* If PyErr_SetNone() was used, the value will have been actually
303 set to NULL.
304 */
305 if (!value) {
306 value = Py_None;
307 Py_INCREF(value);
308 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 /* Normalize the exception so that if the type is a class, the
311 value will be an instance.
312 */
313 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200314 PyObject *inclass = NULL;
315 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200316
Serhiy Storchakacf296532017-11-05 11:27:48 +0200317 if (PyExceptionInstance_Check(value)) {
318 inclass = PyExceptionInstance_Class(value);
319 is_subclass = PyObject_IsSubclass(inclass, type);
320 if (is_subclass < 0) {
321 goto error;
322 }
323 }
324
325 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 whose class is (or is derived from) type, then use the
327 value as an argument to instantiation of the type
328 class.
329 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200330 if (!is_subclass) {
331 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200332 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200333 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200336 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200338 /* If the class of the instance doesn't exactly match the
339 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 */
341 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200342 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 Py_DECREF(type);
344 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 }
346 }
347 *exc = type;
348 *val = value;
349 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200350
351 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 Py_DECREF(type);
353 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200354 recursion_depth++;
355 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200356 _PyErr_SetString(tstate, PyExc_RecursionError,
357 "maximum recursion depth exceeded "
358 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200359 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 /* If the new exception doesn't set a traceback and the old
361 exception had a traceback, use the old traceback for the
362 new exception. It's better than nothing.
363 */
364 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200365 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200366 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 if (initial_tb != NULL) {
368 if (*tb == NULL)
369 *tb = initial_tb;
370 else
371 Py_DECREF(initial_tb);
372 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200373 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
374 corresponding RecursionError could not be normalized, and the
375 MemoryError raised when normalize this RecursionError could not be
376 normalized. */
377 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200378 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
379 Py_FatalError("Cannot recover from MemoryErrors "
380 "while normalizing exceptions.");
381 }
382 else {
383 Py_FatalError("Cannot recover from the recursive normalization "
384 "of an exception.");
385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200387 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000388}
389
390
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200392PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393{
Victor Stinner50b48572018-11-01 01:51:40 +0100394 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200395 _PyErr_NormalizeException(tstate, exc, val, tb);
396}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200398
Victor Stinner438a12d2019-05-24 17:01:38 +0200399void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200400_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
401 PyObject **p_traceback)
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 *p_type = tstate->curexc_type;
404 *p_value = tstate->curexc_value;
405 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 tstate->curexc_type = NULL;
408 tstate->curexc_value = NULL;
409 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410}
411
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200412
413void
414PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
415{
416 PyThreadState *tstate = _PyThreadState_GET();
417 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
418}
419
420
Victor Stinner438a12d2019-05-24 17:01:38 +0200421void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200422_PyErr_Clear(PyThreadState *tstate)
423{
424 _PyErr_Restore(tstate, NULL, NULL, NULL);
425}
426
427
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000429PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200431 PyThreadState *tstate = _PyThreadState_GET();
432 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000434
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200435
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200436void
Julien Danjou3430c552020-01-13 17:30:14 +0100437_PyErr_GetExcInfo(PyThreadState *tstate,
438 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200439{
Mark Shannonae3087c2017-10-22 22:41:51 +0100440 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
441 *p_type = exc_info->exc_type;
442 *p_value = exc_info->exc_value;
443 *p_traceback = exc_info->exc_traceback;
444
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200445 Py_XINCREF(*p_type);
446 Py_XINCREF(*p_value);
447 Py_XINCREF(*p_traceback);
448}
449
Julien Danjou3430c552020-01-13 17:30:14 +0100450
451void
452PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
453{
454 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100455 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100456}
457
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200458void
459PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
460{
461 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100462 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200463
Mark Shannonae3087c2017-10-22 22:41:51 +0100464 oldtype = tstate->exc_info->exc_type;
465 oldvalue = tstate->exc_info->exc_value;
466 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200467
Mark Shannonae3087c2017-10-22 22:41:51 +0100468 tstate->exc_info->exc_type = p_type;
469 tstate->exc_info->exc_value = p_value;
470 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200471
472 Py_XDECREF(oldtype);
473 Py_XDECREF(oldvalue);
474 Py_XDECREF(oldtraceback);
475}
476
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300477/* Like PyErr_Restore(), but if an exception is already set,
478 set the context associated with it.
479 */
480void
481_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
482{
483 if (exc == NULL)
484 return;
485
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200486 PyThreadState *tstate = _PyThreadState_GET();
487 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300488 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200489 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
490 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300491 if (tb != NULL) {
492 PyException_SetTraceback(val, tb);
493 Py_DECREF(tb);
494 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300495 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200496 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300497 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200498 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300499 }
500 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200501 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300502 }
503}
504
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300505static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200506_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
507 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300508{
509 PyObject *exc, *val, *val2, *tb;
510
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200511 assert(_PyErr_Occurred(tstate));
512 _PyErr_Fetch(tstate, &exc, &val, &tb);
513 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300514 if (tb != NULL) {
515 PyException_SetTraceback(val, tb);
516 Py_DECREF(tb);
517 }
518 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200519 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300520
Victor Stinner438a12d2019-05-24 17:01:38 +0200521 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300522
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200523 _PyErr_Fetch(tstate, &exc, &val2, &tb);
524 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300525 Py_INCREF(val);
526 PyException_SetCause(val2, val);
527 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200528 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300529
530 return NULL;
531}
532
533PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100534_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
535 const char *format, ...)
536{
537 va_list vargs;
538#ifdef HAVE_STDARG_PROTOTYPES
539 va_start(vargs, format);
540#else
541 va_start(vargs);
542#endif
543 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
544 va_end(vargs);
545 return NULL;
546}
547
548PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300549_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
550{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200551 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300552 va_list vargs;
553#ifdef HAVE_STDARG_PROTOTYPES
554 va_start(vargs, format);
555#else
556 va_start(vargs);
557#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200558 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300559 va_end(vargs);
560 return NULL;
561}
562
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000563/* Convenience functions to set a type error exception and return 0 */
564
565int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000567{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200568 PyThreadState *tstate = _PyThreadState_GET();
569 _PyErr_SetString(tstate, PyExc_TypeError,
570 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000572}
573
Guido van Rossum373c8691997-04-29 18:22:47 +0000574PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200575_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000576{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600577 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200578 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
579 initialized by _PyExc_Init() */
580 Py_FatalError("Out of memory and PyExc_MemoryError is not "
581 "initialized yet");
582 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200583 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000585}
586
Guido van Rossum373c8691997-04-29 18:22:47 +0000587PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200588PyErr_NoMemory(void)
589{
590 PyThreadState *tstate = _PyThreadState_GET();
591 return _PyErr_NoMemory(tstate);
592}
593
594PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000595PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000596{
Larry Hastingsb0827312014-02-09 22:05:19 -0800597 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
598}
599
600PyObject *
601PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
602{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200603 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200605 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100607#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000609#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000610
Guido van Rossume9fbc091995-02-18 14:52:19 +0000611#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (i == EINTR && PyErr_CheckSignals())
613 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000614#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000615
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000616#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100617 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600618 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100619 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100620 }
621 else {
622 /* Sometimes errno didn't get set */
623 message = PyUnicode_FromString("Error");
624 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000625#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 if (i == 0)
627 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
628 else
629 {
630 /* Note that the Win32 errors do not lineup with the
631 errno error. So if the error is in the MSVC error
632 table, we use it, otherwise we assume it really _is_
633 a Win32 error code
634 */
635 if (i > 0 && i < _sys_nerr) {
636 message = PyUnicode_FromString(_sys_errlist[i]);
637 }
638 else {
639 int len = FormatMessageW(
640 FORMAT_MESSAGE_ALLOCATE_BUFFER |
641 FORMAT_MESSAGE_FROM_SYSTEM |
642 FORMAT_MESSAGE_IGNORE_INSERTS,
643 NULL, /* no message source */
644 i,
645 MAKELANGID(LANG_NEUTRAL,
646 SUBLANG_DEFAULT),
647 /* Default language */
648 (LPWSTR) &s_buf,
649 0, /* size not used */
650 NULL); /* no args */
651 if (len==0) {
652 /* Only ever seen this in out-of-mem
653 situations */
654 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300655 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 } else {
657 /* remove trailing cr/lf and dots */
658 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
659 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200660 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 }
662 }
663 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000664#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (message == NULL)
667 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000668#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return NULL;
672 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000673
Larry Hastingsb0827312014-02-09 22:05:19 -0800674 if (filenameObject != NULL) {
675 if (filenameObject2 != NULL)
676 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
677 else
678 args = Py_BuildValue("(iOO)", i, message, filenameObject);
679 } else {
680 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200681 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000684
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200685 if (args != NULL) {
686 v = PyObject_Call(exc, args, NULL);
687 Py_DECREF(args);
688 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200689 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200690 Py_DECREF(v);
691 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000693#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000697}
Guido van Rossum743007d1999-04-21 15:27:31 +0000698
Barry Warsaw97d95151998-07-23 16:05:56 +0000699PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000700PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800703 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 Py_XDECREF(name);
705 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000706}
707
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000708#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000709PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000710PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000711{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200712 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800713 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 Py_XDECREF(name);
715 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000716}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000717#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000718
719PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000720PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000721{
Larry Hastingsb0827312014-02-09 22:05:19 -0800722 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000723}
Guido van Rossum683a0721990-10-21 22:09:12 +0000724
Brett Cannonbf364092006-03-01 04:25:17 +0000725#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000726/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000727PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 PyObject *exc,
729 int ierr,
730 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000731{
Larry Hastingsb0827312014-02-09 22:05:19 -0800732 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
733 filenameObject, NULL);
734}
735
736PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
737 PyObject *exc,
738 int ierr,
739 PyObject *filenameObject,
740 PyObject *filenameObject2)
741{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200742 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 int len;
744 WCHAR *s_buf = NULL; /* Free via LocalFree */
745 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200746 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200749 if (err==0) {
750 err = GetLastError();
751 }
752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 len = FormatMessageW(
754 /* Error API error */
755 FORMAT_MESSAGE_ALLOCATE_BUFFER |
756 FORMAT_MESSAGE_FROM_SYSTEM |
757 FORMAT_MESSAGE_IGNORE_INSERTS,
758 NULL, /* no message source */
759 err,
760 MAKELANGID(LANG_NEUTRAL,
761 SUBLANG_DEFAULT), /* Default language */
762 (LPWSTR) &s_buf,
763 0, /* size not used */
764 NULL); /* no args */
765 if (len==0) {
766 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300767 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 s_buf = NULL;
769 } else {
770 /* remove trailing cr/lf and dots */
771 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
772 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200773 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (message == NULL)
777 {
778 LocalFree(s_buf);
779 return NULL;
780 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000781
Larry Hastingsb0827312014-02-09 22:05:19 -0800782 if (filenameObject == NULL) {
783 assert(filenameObject2 == NULL);
784 filenameObject = filenameObject2 = Py_None;
785 }
786 else if (filenameObject2 == NULL)
787 filenameObject2 = Py_None;
788 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200789 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800790 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000792
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200793 if (args != NULL) {
794 v = PyObject_Call(exc, args, NULL);
795 Py_DECREF(args);
796 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200797 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200798 Py_DECREF(v);
799 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 }
801 LocalFree(s_buf);
802 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000803}
804
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000805PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 PyObject *exc,
807 int ierr,
808 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000809{
Victor Stinner92be9392010-12-28 00:28:21 +0000810 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800811 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800813 name,
814 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 Py_XDECREF(name);
816 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000817}
818
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000819PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 PyObject *exc,
821 int ierr,
822 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000823{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200824 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800825 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800827 name,
828 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 Py_XDECREF(name);
830 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000831}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000832
Thomas Heller085358a2002-07-29 14:27:41 +0000833PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
834{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800835 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000836}
837
Guido van Rossum795e1892000-02-17 15:19:15 +0000838PyObject *PyErr_SetFromWindowsErr(int ierr)
839{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800840 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
841 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800842}
843
Thomas Heller085358a2002-07-29 14:27:41 +0000844PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 int ierr,
846 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000847{
Victor Stinner92be9392010-12-28 00:28:21 +0000848 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800849 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200850 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800851 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 Py_XDECREF(name);
853 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000854}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000855
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000856PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 int ierr,
858 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000859{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200860 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800861 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200862 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800863 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 Py_XDECREF(name);
865 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000866}
Guido van Rossum795e1892000-02-17 15:19:15 +0000867#endif /* MS_WINDOWS */
868
Brett Cannon79ec55e2012-04-12 20:24:54 -0400869PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700870PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
871 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400872{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200873 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700874 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200875 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500876
Eric Snow46f97b82016-09-07 16:56:15 -0700877 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
878 if (issubclass < 0) {
879 return NULL;
880 }
881 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200882 _PyErr_SetString(tstate, PyExc_TypeError,
883 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500884 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200885 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500886
Eric Snow46f97b82016-09-07 16:56:15 -0700887 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200888 _PyErr_SetString(tstate, PyExc_TypeError,
889 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500890 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400891 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500892
Brian Curtin94c001b2012-04-18 08:30:51 -0500893 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500894 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500895 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500896 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500897 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500898 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500899
Eric Snow46f97b82016-09-07 16:56:15 -0700900 kwargs = PyDict_New();
901 if (kwargs == NULL) {
902 return NULL;
903 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200904 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300905 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200906 }
907 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300908 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200909 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400910
Petr Viktorinffd97532020-02-11 17:46:57 +0100911 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400912 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200913 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500914 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400915 }
916
Berker Peksagec766d32016-05-01 09:06:36 +0300917done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400918 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500919 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400920}
921
Eric Snow46f97b82016-09-07 16:56:15 -0700922PyObject *
923PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
924{
925 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
926}
927
Guido van Rossum683a0721990-10-21 22:09:12 +0000928void
Neal Norwitzb382b842007-08-24 20:00:37 +0000929_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000930{
Victor Stinner438a12d2019-05-24 17:01:38 +0200931 PyThreadState *tstate = _PyThreadState_GET();
932 _PyErr_Format(tstate, PyExc_SystemError,
933 "%s:%d: bad argument to internal function",
934 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000935}
936
937/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
938 export the entry point for existing object code: */
939#undef PyErr_BadInternalCall
940void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000941PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000942{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200943 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200944 PyThreadState *tstate = _PyThreadState_GET();
945 _PyErr_SetString(tstate, PyExc_SystemError,
946 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000947}
Fred Drake6d63adf2000-08-24 22:38:39 +0000948#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
949
Guido van Rossum1548bac1997-02-14 17:09:47 +0000950
Victor Stinner438a12d2019-05-24 17:01:38 +0200951static PyObject *
952_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
953 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000956
Victor Stinnerde821be2015-03-24 12:41:23 +0100957 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
958 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200959 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100962
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200963 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000966}
Guido van Rossum7617e051997-09-16 18:43:50 +0000967
968
Antoine Pitrou0676a402014-09-30 21:16:27 +0200969PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200970PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
971{
972 PyThreadState *tstate = _PyThreadState_GET();
973 return _PyErr_FormatV(tstate, exception, format, vargs);
974}
975
976
977PyObject *
978_PyErr_Format(PyThreadState *tstate, PyObject *exception,
979 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200980{
981 va_list vargs;
982#ifdef HAVE_STDARG_PROTOTYPES
983 va_start(vargs, format);
984#else
985 va_start(vargs);
986#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200987 _PyErr_FormatV(tstate, exception, format, vargs);
988 va_end(vargs);
989 return NULL;
990}
991
992
993PyObject *
994PyErr_Format(PyObject *exception, const char *format, ...)
995{
996 PyThreadState *tstate = _PyThreadState_GET();
997 va_list vargs;
998#ifdef HAVE_STDARG_PROTOTYPES
999 va_start(vargs, format);
1000#else
1001 va_start(vargs);
1002#endif
1003 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001004 va_end(vargs);
1005 return NULL;
1006}
1007
Thomas Wouters477c8d52006-05-27 19:21:47 +00001008
Guido van Rossum7617e051997-09-16 18:43:50 +00001009PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001010PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001011{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001012 PyThreadState *tstate = _PyThreadState_GET();
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 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001239 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001240 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001241 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001242 if (PyFile_WriteString("<unknown>", file) < 0) {
1243 return -1;
1244 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001245 }
1246 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001247 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001248 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1249 Py_DECREF(moduleName);
1250 return -1;
1251 }
1252 Py_DECREF(moduleName);
1253 if (PyFile_WriteString(".", file) < 0) {
1254 return -1;
1255 }
1256 }
1257 else {
1258 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001259 }
1260 }
1261 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001262 if (PyFile_WriteString("<unknown>", file) < 0) {
1263 return -1;
1264 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001265 }
1266 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001267 if (PyFile_WriteString(className, file) < 0) {
1268 return -1;
1269 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001270 }
1271
Victor Stinneref9d9b62019-05-22 11:28:22 +02001272 if (exc_value && exc_value != Py_None) {
1273 if (PyFile_WriteString(": ", file) < 0) {
1274 return -1;
1275 }
1276 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001277 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001278 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1279 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001280 }
1281 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001282 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001283
Victor Stinneref9d9b62019-05-22 11:28:22 +02001284 if (PyFile_WriteString("\n", file) < 0) {
1285 return -1;
1286 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001287
1288 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001289 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001290 if (!res) {
1291 return -1;
1292 }
1293 Py_DECREF(res);
1294
Victor Stinneref9d9b62019-05-22 11:28:22 +02001295 return 0;
1296}
1297
1298
1299static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001300write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001301 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1302 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001303{
1304 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1305 if (file == NULL || file == Py_None) {
1306 return 0;
1307 }
1308
1309 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1310 while we use it */
1311 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001312 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001313 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001314 Py_DECREF(file);
1315
1316 return res;
1317}
1318
1319
1320PyObject*
1321_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1322{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001323 PyThreadState *tstate = _PyThreadState_GET();
1324
Andy Lester55728702020-03-06 16:53:17 -06001325 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001326 _PyErr_SetString(tstate, PyExc_TypeError,
1327 "sys.unraisablehook argument type "
1328 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001329 return NULL;
1330 }
1331
1332 /* Borrowed references */
1333 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1334 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1335 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001336 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1337 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001338
Victor Stinner71c52e32019-05-27 08:57:14 +02001339 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001340 return NULL;
1341 }
1342 Py_RETURN_NONE;
1343}
1344
1345
1346/* Call sys.unraisablehook().
1347
1348 This function can be used when an exception has occurred but there is no way
1349 for Python to handle it. For example, when a destructor raises an exception
1350 or during garbage collection (gc.collect()).
1351
Victor Stinner71c52e32019-05-27 08:57:14 +02001352 If err_msg_str is non-NULL, the error message is formatted as:
1353 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1354 error message.
1355
Victor Stinneref9d9b62019-05-22 11:28:22 +02001356 An exception must be set when calling this function. */
1357void
Victor Stinner71c52e32019-05-27 08:57:14 +02001358_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001359{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001360 PyThreadState *tstate = _PyThreadState_GET();
1361 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001362
Victor Stinner71c52e32019-05-27 08:57:14 +02001363 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001364 PyObject *exc_type, *exc_value, *exc_tb;
1365 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001366
1367 assert(exc_type != NULL);
1368
1369 if (exc_type == NULL) {
1370 /* sys.unraisablehook requires that at least exc_type is set */
1371 goto default_hook;
1372 }
1373
Victor Stinnerdf22c032019-05-23 01:00:58 +02001374 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001375 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001376 if (frame != NULL) {
1377 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1378 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001379 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001380 }
1381 }
1382 }
1383
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001384 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001385
1386 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1387 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001388 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001389 }
1390 }
1391
Victor Stinner71c52e32019-05-27 08:57:14 +02001392 if (err_msg_str != NULL) {
1393 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1394 if (err_msg == NULL) {
1395 PyErr_Clear();
1396 }
1397 }
1398
Steve Dowerbea33f52019-11-28 08:46:11 -08001399 PyObject *hook_args = make_unraisable_hook_args(
1400 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1401 if (hook_args == NULL) {
1402 err_msg_str = ("Exception ignored on building "
1403 "sys.unraisablehook arguments");
1404 goto error;
1405 }
1406
Victor Stinneref9d9b62019-05-22 11:28:22 +02001407 _Py_IDENTIFIER(unraisablehook);
1408 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001409 if (hook == NULL) {
1410 Py_DECREF(hook_args);
1411 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001412 }
1413
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001414 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001415 Py_DECREF(hook_args);
1416 err_msg_str = "Exception ignored in audit hook";
1417 obj = NULL;
1418 goto error;
1419 }
1420
1421 if (hook == Py_None) {
1422 Py_DECREF(hook_args);
1423 goto default_hook;
1424 }
1425
Petr Viktorinffd97532020-02-11 17:46:57 +01001426 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001427 Py_DECREF(hook_args);
1428 if (res != NULL) {
1429 Py_DECREF(res);
1430 goto done;
1431 }
1432
1433 /* sys.unraisablehook failed: log its error using default hook */
1434 obj = hook;
1435 err_msg_str = NULL;
1436
1437error:
1438 /* err_msg_str and obj have been updated and we have a new exception */
1439 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1440 err_msg_str : "Exception ignored in sys.unraisablehook"));
1441 Py_XDECREF(exc_type);
1442 Py_XDECREF(exc_value);
1443 Py_XDECREF(exc_tb);
1444 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1445
Victor Stinneref9d9b62019-05-22 11:28:22 +02001446default_hook:
1447 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001448 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1449 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001450
1451done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001452 Py_XDECREF(exc_type);
1453 Py_XDECREF(exc_value);
1454 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001455 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001456 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001457}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001458
Victor Stinner71c52e32019-05-27 08:57:14 +02001459
1460void
1461PyErr_WriteUnraisable(PyObject *obj)
1462{
1463 _PyErr_WriteUnraisableMsg(NULL, obj);
1464}
1465
1466
Armin Rigo092381a2003-10-25 14:29:27 +00001467extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001468
Guido van Rossum2fd45652001-02-28 21:46:24 +00001469
Benjamin Peterson2c539712010-09-20 22:42:10 +00001470void
Victor Stinner14e461d2013-08-26 22:28:21 +02001471PyErr_SyntaxLocation(const char *filename, int lineno)
1472{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001473 PyErr_SyntaxLocationEx(filename, lineno, -1);
1474}
1475
1476
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001477/* Set file and line information for the current exception.
1478 If the exception is not a SyntaxError, also sets additional attributes
1479 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001480
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001481void
Victor Stinner14e461d2013-08-26 22:28:21 +02001482PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001485 _Py_IDENTIFIER(filename);
1486 _Py_IDENTIFIER(lineno);
1487 _Py_IDENTIFIER(msg);
1488 _Py_IDENTIFIER(offset);
1489 _Py_IDENTIFIER(print_file_and_line);
1490 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001491 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001494 _PyErr_Fetch(tstate, &exc, &v, &tb);
1495 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 /* XXX check that it is, indeed, a syntax error. It might not
1497 * be, though. */
1498 tmp = PyLong_FromLong(lineno);
1499 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001500 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001502 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1503 _PyErr_Clear(tstate);
1504 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 Py_DECREF(tmp);
1506 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001507 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001508 if (col_offset >= 0) {
1509 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001510 if (tmp == NULL) {
1511 _PyErr_Clear(tstate);
1512 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001513 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001514 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1515 _PyErr_Clear(tstate);
1516 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001517 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001519 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1520 _PyErr_Clear(tstate);
1521 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001522
Victor Stinner14e461d2013-08-26 22:28:21 +02001523 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001525 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1526 _PyErr_Clear(tstate);
1527 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 Py_DECREF(tmp);
1529 }
1530 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001532 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 tmp = PyObject_Str(v);
1534 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001535 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1536 _PyErr_Clear(tstate);
1537 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001539 }
1540 else {
1541 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 }
1543 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001544 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1545 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001546 Py_None)) {
1547 _PyErr_Clear(tstate);
1548 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 }
1550 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001551 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001552}
1553
Victor Stinner14e461d2013-08-26 22:28:21 +02001554void
1555PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1556{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001557 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001558 PyObject *fileobj;
1559 if (filename != NULL) {
1560 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001561 if (fileobj == NULL) {
1562 _PyErr_Clear(tstate);
1563 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001564 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001565 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001566 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001567 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001568 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1569 Py_XDECREF(fileobj);
1570}
1571
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001572/* Attempt to load the line of text that the exception refers to. If it
1573 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001574
1575 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001576 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001577
Antoine Pitrou409b5382013-10-12 22:41:17 +02001578static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001579err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 int i;
1582 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 if (fp == NULL)
1585 return NULL;
1586 for (i = 0; i < lineno; i++) {
1587 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1588 do {
1589 *pLastChar = '\0';
1590 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1591 fp, NULL) == NULL)
1592 break;
1593 /* fgets read *something*; if it didn't get as
1594 far as pLastChar, it must have found a newline
1595 or hit the end of the file; if pLastChar is \n,
1596 it obviously found a newline; else we haven't
1597 yet seen a newline, so must continue */
1598 } while (*pLastChar != '\0' && *pLastChar != '\n');
1599 }
1600 fclose(fp);
1601 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001603 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001605 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 return res;
1607 }
1608 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001609}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001610
Victor Stinner14e461d2013-08-26 22:28:21 +02001611PyObject *
1612PyErr_ProgramText(const char *filename, int lineno)
1613{
1614 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001615 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001616 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001617 }
1618 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001619 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001620 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001621}
1622
1623PyObject *
1624PyErr_ProgramTextObject(PyObject *filename, int lineno)
1625{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001626 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001627 return NULL;
1628 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001629
1630 PyThreadState *tstate = _PyThreadState_GET();
1631 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1632 if (fp == NULL) {
1633 _PyErr_Clear(tstate);
1634 return NULL;
1635 }
1636 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001637}
1638
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001639#ifdef __cplusplus
1640}
1641#endif