blob: f80ae21fdde7ce6e1a83fcec588e51cbcf387af8 [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,
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200110 "_PyErr_SetObject: "
111 "exception %R is not a BaseException subclass",
Victor Stinner438a12d2019-05-24 17:01:38 +0200112 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 return;
114 }
Victor Stinner3a840972016-08-22 23:59:08 +0200115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100117 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 if (exc_value != NULL && exc_value != Py_None) {
119 /* Implicit exception chaining */
120 Py_INCREF(exc_value);
121 if (value == NULL || !PyExceptionInstance_Check(value)) {
122 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200123 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100124
Victor Stinner3a840972016-08-22 23:59:08 +0200125 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100126 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200127 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100128
Victor Stinner3a840972016-08-22 23:59:08 +0200129 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200131 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300132 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200134 }
135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 value = fixed_value;
137 }
Victor Stinner3a840972016-08-22 23:59:08 +0200138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* Avoid reference cycles through the context chain.
140 This is O(chain length) but context chains are
141 usually very short. Sensitive readers may try
142 to inline the call to PyException_GetContext. */
143 if (exc_value != value) {
144 PyObject *o = exc_value, *context;
145 while ((context = PyException_GetContext(o))) {
146 Py_DECREF(context);
147 if (context == value) {
148 PyException_SetContext(o, NULL);
149 break;
150 }
151 o = context;
152 }
153 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200154 }
155 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 Py_DECREF(exc_value);
157 }
158 }
159 if (value != NULL && PyExceptionInstance_Check(value))
160 tb = PyException_GetTraceback(value);
161 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200162 _PyErr_Restore(tstate, exception, value, tb);
163}
164
165void
166PyErr_SetObject(PyObject *exception, PyObject *value)
167{
168 PyThreadState *tstate = _PyThreadState_GET();
169 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Raymond Hettinger69492da2013-09-02 15:59:26 -0700172/* Set a key error with the specified argument, wrapping it in a
173 * tuple automatically so that tuple keys are not unpacked as the
174 * exception arguments. */
175void
176_PyErr_SetKeyError(PyObject *arg)
177{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200178 PyThreadState *tstate = _PyThreadState_GET();
179 PyObject *tup = PyTuple_Pack(1, arg);
180 if (!tup) {
181 /* caller will expect error to be set anyway */
182 return;
183 }
184 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700185 Py_DECREF(tup);
186}
187
Victor Stinner438a12d2019-05-24 17:01:38 +0200188void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200189_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
190{
191 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
192}
193
194
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000196PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200198 PyThreadState *tstate = _PyThreadState_GET();
199 _PyErr_SetNone(tstate, exception);
200}
201
202
Victor Stinner438a12d2019-05-24 17:01:38 +0200203void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200204_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
205 const char *string)
206{
207 PyObject *value = PyUnicode_FromString(string);
208 _PyErr_SetObject(tstate, exception, value);
209 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210}
211
212void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000213PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200215 PyThreadState *tstate = _PyThreadState_GET();
216 _PyErr_SetString(tstate, exception, string);
217}
218
219
Victor Stinnerc6944e72016-11-11 02:13:35 +0100220PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100223 /* The caller must hold the GIL. */
224 assert(PyGILState_Check());
225
Victor Stinner50b48572018-11-01 01:51:40 +0100226 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200227 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228}
229
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000230
231int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (err == NULL || exc == NULL) {
235 /* maybe caused by "import exceptions" that failed early on */
236 return 0;
237 }
238 if (PyTuple_Check(exc)) {
239 Py_ssize_t i, n;
240 n = PyTuple_Size(exc);
241 for (i = 0; i < n; i++) {
242 /* Test recursively */
243 if (PyErr_GivenExceptionMatches(
244 err, PyTuple_GET_ITEM(exc, i)))
245 {
246 return 1;
247 }
248 }
249 return 0;
250 }
251 /* err might be an instance, so check its class. */
252 if (PyExceptionInstance_Check(err))
253 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200256 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260}
Guido van Rossum743007d1999-04-21 15:27:31 +0000261
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000262
263int
Victor Stinner438a12d2019-05-24 17:01:38 +0200264_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
265{
266 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
267}
268
269
270int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000272{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200273 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200274 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000275}
276
277
xdegaye56d1f5c2017-10-26 15:09:06 +0200278#ifndef Py_NORMALIZE_RECURSION_LIMIT
279#define Py_NORMALIZE_RECURSION_LIMIT 32
280#endif
281
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000282/* Used in many places to normalize a raised exception, including in
283 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000284
285 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000287*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200288void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200289_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
290 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000291{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200292 int recursion_depth = 0;
293 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000294
Serhiy Storchakacf296532017-11-05 11:27:48 +0200295 restart:
296 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 if (type == NULL) {
298 /* There was no exception, so nothing to do. */
299 return;
300 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000301
Serhiy Storchakacf296532017-11-05 11:27:48 +0200302 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 /* If PyErr_SetNone() was used, the value will have been actually
304 set to NULL.
305 */
306 if (!value) {
307 value = Py_None;
308 Py_INCREF(value);
309 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 /* Normalize the exception so that if the type is a class, the
312 value will be an instance.
313 */
314 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200315 PyObject *inclass = NULL;
316 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200317
Serhiy Storchakacf296532017-11-05 11:27:48 +0200318 if (PyExceptionInstance_Check(value)) {
319 inclass = PyExceptionInstance_Class(value);
320 is_subclass = PyObject_IsSubclass(inclass, type);
321 if (is_subclass < 0) {
322 goto error;
323 }
324 }
325
326 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 whose class is (or is derived from) type, then use the
328 value as an argument to instantiation of the type
329 class.
330 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200331 if (!is_subclass) {
332 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200333 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200334 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200337 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200339 /* If the class of the instance doesn't exactly match the
340 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 */
342 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200343 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 Py_DECREF(type);
345 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 }
347 }
348 *exc = type;
349 *val = value;
350 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200351
352 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 Py_DECREF(type);
354 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200355 recursion_depth++;
356 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200357 _PyErr_SetString(tstate, PyExc_RecursionError,
358 "maximum recursion depth exceeded "
359 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200360 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 /* If the new exception doesn't set a traceback and the old
362 exception had a traceback, use the old traceback for the
363 new exception. It's better than nothing.
364 */
365 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200366 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200367 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (initial_tb != NULL) {
369 if (*tb == NULL)
370 *tb = initial_tb;
371 else
372 Py_DECREF(initial_tb);
373 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200374 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
375 corresponding RecursionError could not be normalized, and the
376 MemoryError raised when normalize this RecursionError could not be
377 normalized. */
378 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200379 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
380 Py_FatalError("Cannot recover from MemoryErrors "
381 "while normalizing exceptions.");
382 }
383 else {
384 Py_FatalError("Cannot recover from the recursive normalization "
385 "of an exception.");
386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200388 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000389}
390
391
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200393PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394{
Victor Stinner50b48572018-11-01 01:51:40 +0100395 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200396 _PyErr_NormalizeException(tstate, exc, val, tb);
397}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000398
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200399
Victor Stinner438a12d2019-05-24 17:01:38 +0200400void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200401_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
402 PyObject **p_traceback)
403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 *p_type = tstate->curexc_type;
405 *p_value = tstate->curexc_value;
406 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 tstate->curexc_type = NULL;
409 tstate->curexc_value = NULL;
410 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411}
412
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200413
414void
415PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
416{
417 PyThreadState *tstate = _PyThreadState_GET();
418 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
419}
420
421
Victor Stinner438a12d2019-05-24 17:01:38 +0200422void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200423_PyErr_Clear(PyThreadState *tstate)
424{
425 _PyErr_Restore(tstate, NULL, NULL, NULL);
426}
427
428
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200432 PyThreadState *tstate = _PyThreadState_GET();
433 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000435
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200436
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200437void
Julien Danjou3430c552020-01-13 17:30:14 +0100438_PyErr_GetExcInfo(PyThreadState *tstate,
439 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200440{
Mark Shannonae3087c2017-10-22 22:41:51 +0100441 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
442 *p_type = exc_info->exc_type;
443 *p_value = exc_info->exc_value;
444 *p_traceback = exc_info->exc_traceback;
445
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200446 Py_XINCREF(*p_type);
447 Py_XINCREF(*p_value);
448 Py_XINCREF(*p_traceback);
449}
450
Julien Danjou3430c552020-01-13 17:30:14 +0100451
452void
453PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
454{
455 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100456 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100457}
458
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200459void
460PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
461{
462 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100463 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200464
Mark Shannonae3087c2017-10-22 22:41:51 +0100465 oldtype = tstate->exc_info->exc_type;
466 oldvalue = tstate->exc_info->exc_value;
467 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200468
Mark Shannonae3087c2017-10-22 22:41:51 +0100469 tstate->exc_info->exc_type = p_type;
470 tstate->exc_info->exc_value = p_value;
471 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200472
473 Py_XDECREF(oldtype);
474 Py_XDECREF(oldvalue);
475 Py_XDECREF(oldtraceback);
476}
477
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300478/* Like PyErr_Restore(), but if an exception is already set,
479 set the context associated with it.
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700480
481 The caller is responsible for ensuring that this call won't create
482 any cycles in the exception context chain. */
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300483void
484_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
485{
486 if (exc == NULL)
487 return;
488
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200489 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200490
491 if (!PyExceptionClass_Check(exc)) {
492 _PyErr_Format(tstate, PyExc_SystemError,
493 "_PyErr_ChainExceptions: "
494 "exception %R is not a BaseException subclass",
495 exc);
496 return;
497 }
498
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200499 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300500 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200501 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
502 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300503 if (tb != NULL) {
504 PyException_SetTraceback(val, tb);
505 Py_DECREF(tb);
506 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300507 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200508 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300509 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200510 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300511 }
512 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200513 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300514 }
515}
516
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700517/* Set the currently set exception's context to the given exception.
518
519 If the provided exc_info is NULL, then the current Python thread state's
520 exc_info will be used for the context instead.
521
522 This function can only be called when _PyErr_Occurred() is true.
523 Also, this function won't create any cycles in the exception context
524 chain to the extent that _PyErr_SetObject ensures this. */
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700525void
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700526_PyErr_ChainStackItem(_PyErr_StackItem *exc_info)
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700527{
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700528 PyThreadState *tstate = _PyThreadState_GET();
529 assert(_PyErr_Occurred(tstate));
530
531 int exc_info_given;
532 if (exc_info == NULL) {
533 exc_info_given = 0;
534 exc_info = tstate->exc_info;
535 } else {
536 exc_info_given = 1;
537 }
538 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) {
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700539 return;
540 }
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700541
542 _PyErr_StackItem *saved_exc_info;
543 if (exc_info_given) {
544 /* Temporarily set the thread state's exc_info since this is what
545 _PyErr_SetObject uses for implicit exception chaining. */
546 saved_exc_info = tstate->exc_info;
547 tstate->exc_info = exc_info;
548 }
549
550 PyObject *exc, *val, *tb;
551 _PyErr_Fetch(tstate, &exc, &val, &tb);
552
553 PyObject *exc2, *val2, *tb2;
554 exc2 = exc_info->exc_type;
555 val2 = exc_info->exc_value;
556 tb2 = exc_info->exc_traceback;
557 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
558 if (tb2 != NULL) {
559 PyException_SetTraceback(val2, tb2);
560 }
561
562 /* _PyErr_SetObject sets the context from PyThreadState. */
563 _PyErr_SetObject(tstate, exc, val);
564 Py_DECREF(exc); // since _PyErr_Occurred was true
565 Py_XDECREF(val);
566 Py_XDECREF(tb);
567
568 if (exc_info_given) {
569 tstate->exc_info = saved_exc_info;
570 }
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700571}
572
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300573static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200574_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
575 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300576{
577 PyObject *exc, *val, *val2, *tb;
578
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200579 assert(_PyErr_Occurred(tstate));
580 _PyErr_Fetch(tstate, &exc, &val, &tb);
581 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300582 if (tb != NULL) {
583 PyException_SetTraceback(val, tb);
584 Py_DECREF(tb);
585 }
586 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200587 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300588
Victor Stinner438a12d2019-05-24 17:01:38 +0200589 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300590
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200591 _PyErr_Fetch(tstate, &exc, &val2, &tb);
592 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300593 Py_INCREF(val);
594 PyException_SetCause(val2, val);
595 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200596 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300597
598 return NULL;
599}
600
601PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100602_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
603 const char *format, ...)
604{
605 va_list vargs;
606#ifdef HAVE_STDARG_PROTOTYPES
607 va_start(vargs, format);
608#else
609 va_start(vargs);
610#endif
611 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
612 va_end(vargs);
613 return NULL;
614}
615
616PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300617_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
618{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200619 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300620 va_list vargs;
621#ifdef HAVE_STDARG_PROTOTYPES
622 va_start(vargs, format);
623#else
624 va_start(vargs);
625#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200626 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300627 va_end(vargs);
628 return NULL;
629}
630
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000631/* Convenience functions to set a type error exception and return 0 */
632
633int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000634PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000635{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200636 PyThreadState *tstate = _PyThreadState_GET();
637 _PyErr_SetString(tstate, PyExc_TypeError,
638 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000640}
641
Guido van Rossum373c8691997-04-29 18:22:47 +0000642PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200643_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000644{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600645 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200646 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
647 initialized by _PyExc_Init() */
648 Py_FatalError("Out of memory and PyExc_MemoryError is not "
649 "initialized yet");
650 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200651 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000653}
654
Guido van Rossum373c8691997-04-29 18:22:47 +0000655PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200656PyErr_NoMemory(void)
657{
658 PyThreadState *tstate = _PyThreadState_GET();
659 return _PyErr_NoMemory(tstate);
660}
661
662PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000663PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000664{
Larry Hastingsb0827312014-02-09 22:05:19 -0800665 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
666}
667
668PyObject *
669PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
670{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200671 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200673 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100675#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000677#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000678
Guido van Rossume9fbc091995-02-18 14:52:19 +0000679#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (i == EINTR && PyErr_CheckSignals())
681 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000682#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000683
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000684#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100685 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600686 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100687 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100688 }
689 else {
690 /* Sometimes errno didn't get set */
691 message = PyUnicode_FromString("Error");
692 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000693#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 if (i == 0)
695 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
696 else
697 {
698 /* Note that the Win32 errors do not lineup with the
699 errno error. So if the error is in the MSVC error
700 table, we use it, otherwise we assume it really _is_
701 a Win32 error code
702 */
703 if (i > 0 && i < _sys_nerr) {
704 message = PyUnicode_FromString(_sys_errlist[i]);
705 }
706 else {
707 int len = FormatMessageW(
708 FORMAT_MESSAGE_ALLOCATE_BUFFER |
709 FORMAT_MESSAGE_FROM_SYSTEM |
710 FORMAT_MESSAGE_IGNORE_INSERTS,
711 NULL, /* no message source */
712 i,
713 MAKELANGID(LANG_NEUTRAL,
714 SUBLANG_DEFAULT),
715 /* Default language */
716 (LPWSTR) &s_buf,
717 0, /* size not used */
718 NULL); /* no args */
719 if (len==0) {
720 /* Only ever seen this in out-of-mem
721 situations */
722 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300723 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 } else {
725 /* remove trailing cr/lf and dots */
726 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
727 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200728 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 }
730 }
731 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000732#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (message == NULL)
735 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000736#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 return NULL;
740 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000741
Larry Hastingsb0827312014-02-09 22:05:19 -0800742 if (filenameObject != NULL) {
743 if (filenameObject2 != NULL)
744 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
745 else
746 args = Py_BuildValue("(iOO)", i, message, filenameObject);
747 } else {
748 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200749 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000752
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200753 if (args != NULL) {
754 v = PyObject_Call(exc, args, NULL);
755 Py_DECREF(args);
756 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200757 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200758 Py_DECREF(v);
759 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000761#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000765}
Guido van Rossum743007d1999-04-21 15:27:31 +0000766
Barry Warsaw97d95151998-07-23 16:05:56 +0000767PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000768PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800771 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 Py_XDECREF(name);
773 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000774}
775
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000776#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000777PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000778PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000779{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200780 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800781 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 Py_XDECREF(name);
783 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000784}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000785#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000786
787PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000789{
Larry Hastingsb0827312014-02-09 22:05:19 -0800790 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000791}
Guido van Rossum683a0721990-10-21 22:09:12 +0000792
Brett Cannonbf364092006-03-01 04:25:17 +0000793#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000794/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000795PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyObject *exc,
797 int ierr,
798 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000799{
Larry Hastingsb0827312014-02-09 22:05:19 -0800800 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
801 filenameObject, NULL);
802}
803
804PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
805 PyObject *exc,
806 int ierr,
807 PyObject *filenameObject,
808 PyObject *filenameObject2)
809{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200810 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 int len;
812 WCHAR *s_buf = NULL; /* Free via LocalFree */
813 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200814 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200817 if (err==0) {
818 err = GetLastError();
819 }
820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 len = FormatMessageW(
822 /* Error API error */
823 FORMAT_MESSAGE_ALLOCATE_BUFFER |
824 FORMAT_MESSAGE_FROM_SYSTEM |
825 FORMAT_MESSAGE_IGNORE_INSERTS,
826 NULL, /* no message source */
827 err,
828 MAKELANGID(LANG_NEUTRAL,
829 SUBLANG_DEFAULT), /* Default language */
830 (LPWSTR) &s_buf,
831 0, /* size not used */
832 NULL); /* no args */
833 if (len==0) {
834 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300835 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 s_buf = NULL;
837 } else {
838 /* remove trailing cr/lf and dots */
839 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
840 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200841 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 if (message == NULL)
845 {
846 LocalFree(s_buf);
847 return NULL;
848 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000849
Larry Hastingsb0827312014-02-09 22:05:19 -0800850 if (filenameObject == NULL) {
851 assert(filenameObject2 == NULL);
852 filenameObject = filenameObject2 = Py_None;
853 }
854 else if (filenameObject2 == NULL)
855 filenameObject2 = Py_None;
856 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200857 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800858 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000860
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200861 if (args != NULL) {
862 v = PyObject_Call(exc, args, NULL);
863 Py_DECREF(args);
864 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200865 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200866 Py_DECREF(v);
867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 }
869 LocalFree(s_buf);
870 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000871}
872
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000873PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 PyObject *exc,
875 int ierr,
876 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000877{
Victor Stinner92be9392010-12-28 00:28:21 +0000878 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800879 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800881 name,
882 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 Py_XDECREF(name);
884 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000885}
886
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000887PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 PyObject *exc,
889 int ierr,
890 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000891{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200892 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800893 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800895 name,
896 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 Py_XDECREF(name);
898 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000899}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000900
Thomas Heller085358a2002-07-29 14:27:41 +0000901PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
902{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800903 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000904}
905
Guido van Rossum795e1892000-02-17 15:19:15 +0000906PyObject *PyErr_SetFromWindowsErr(int ierr)
907{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800908 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
909 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800910}
911
Thomas Heller085358a2002-07-29 14:27:41 +0000912PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 int ierr,
914 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000915{
Victor Stinner92be9392010-12-28 00:28:21 +0000916 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800917 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200918 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800919 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 Py_XDECREF(name);
921 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000922}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000923
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000924PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 int ierr,
926 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000927{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200928 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800929 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200930 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800931 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 Py_XDECREF(name);
933 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000934}
Guido van Rossum795e1892000-02-17 15:19:15 +0000935#endif /* MS_WINDOWS */
936
Brett Cannon79ec55e2012-04-12 20:24:54 -0400937PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700938PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
939 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400940{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200941 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700942 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200943 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500944
Eric Snow46f97b82016-09-07 16:56:15 -0700945 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
946 if (issubclass < 0) {
947 return NULL;
948 }
949 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200950 _PyErr_SetString(tstate, PyExc_TypeError,
951 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500952 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200953 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500954
Eric Snow46f97b82016-09-07 16:56:15 -0700955 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200956 _PyErr_SetString(tstate, PyExc_TypeError,
957 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500958 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400959 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500960
Brian Curtin94c001b2012-04-18 08:30:51 -0500961 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500962 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500963 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500964 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500965 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500966 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500967
Eric Snow46f97b82016-09-07 16:56:15 -0700968 kwargs = PyDict_New();
969 if (kwargs == NULL) {
970 return NULL;
971 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200972 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300973 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200974 }
975 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300976 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200977 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400978
Petr Viktorinffd97532020-02-11 17:46:57 +0100979 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400980 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200981 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500982 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400983 }
984
Berker Peksagec766d32016-05-01 09:06:36 +0300985done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400986 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500987 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400988}
989
Eric Snow46f97b82016-09-07 16:56:15 -0700990PyObject *
991PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
992{
993 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
994}
995
Guido van Rossum683a0721990-10-21 22:09:12 +0000996void
Neal Norwitzb382b842007-08-24 20:00:37 +0000997_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000998{
Victor Stinner438a12d2019-05-24 17:01:38 +0200999 PyThreadState *tstate = _PyThreadState_GET();
1000 _PyErr_Format(tstate, PyExc_SystemError,
1001 "%s:%d: bad argument to internal function",
1002 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +00001003}
1004
1005/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
1006 export the entry point for existing object code: */
1007#undef PyErr_BadInternalCall
1008void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001009PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +00001010{
Victor Stinnerfb3a6302013-07-12 00:37:30 +02001011 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +02001012 PyThreadState *tstate = _PyThreadState_GET();
1013 _PyErr_SetString(tstate, PyExc_SystemError,
1014 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +00001015}
Fred Drake6d63adf2000-08-24 22:38:39 +00001016#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
1017
Guido van Rossum1548bac1997-02-14 17:09:47 +00001018
Victor Stinner438a12d2019-05-24 17:01:38 +02001019static PyObject *
1020_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
1021 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001024
Victor Stinnerde821be2015-03-24 12:41:23 +01001025 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
1026 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001027 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +02001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +01001030
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001031 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001034}
Guido van Rossum7617e051997-09-16 18:43:50 +00001035
1036
Antoine Pitrou0676a402014-09-30 21:16:27 +02001037PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02001038PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
1039{
1040 PyThreadState *tstate = _PyThreadState_GET();
1041 return _PyErr_FormatV(tstate, exception, format, vargs);
1042}
1043
1044
1045PyObject *
1046_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1047 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001048{
1049 va_list vargs;
1050#ifdef HAVE_STDARG_PROTOTYPES
1051 va_start(vargs, format);
1052#else
1053 va_start(vargs);
1054#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001055 _PyErr_FormatV(tstate, exception, format, vargs);
1056 va_end(vargs);
1057 return NULL;
1058}
1059
1060
1061PyObject *
1062PyErr_Format(PyObject *exception, const char *format, ...)
1063{
1064 PyThreadState *tstate = _PyThreadState_GET();
1065 va_list vargs;
1066#ifdef HAVE_STDARG_PROTOTYPES
1067 va_start(vargs, format);
1068#else
1069 va_start(vargs);
1070#endif
1071 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001072 va_end(vargs);
1073 return NULL;
1074}
1075
Thomas Wouters477c8d52006-05-27 19:21:47 +00001076
Guido van Rossum7617e051997-09-16 18:43:50 +00001077PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001078PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001079{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001080 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 PyObject *modulename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 PyObject *mydict = NULL;
1083 PyObject *bases = NULL;
1084 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001085
1086 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001088 _PyErr_SetString(tstate, PyExc_SystemError,
1089 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 return NULL;
1091 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001092 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001094 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 if (dict == NULL) {
1096 dict = mydict = PyDict_New();
1097 if (dict == NULL)
1098 goto failure;
1099 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001100
Serhiy Storchakab510e102020-10-26 12:47:57 +02001101 int r = _PyDict_ContainsId(dict, &PyId___module__);
1102 if (r < 0) {
1103 goto failure;
1104 }
1105 if (r == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 modulename = PyUnicode_FromStringAndSize(name,
1107 (Py_ssize_t)(dot-name));
1108 if (modulename == NULL)
1109 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001110 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 goto failure;
1112 }
1113 if (PyTuple_Check(base)) {
1114 bases = base;
1115 /* INCREF as we create a new ref in the else branch */
1116 Py_INCREF(bases);
1117 } else {
1118 bases = PyTuple_Pack(1, base);
1119 if (bases == NULL)
1120 goto failure;
1121 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001122 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001123 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001125 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 Py_XDECREF(bases);
1127 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 Py_XDECREF(modulename);
1129 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001130}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001131
Georg Brandl1e28a272009-12-28 08:41:01 +00001132
1133/* Create an exception with docstring */
1134PyObject *
1135PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 int result;
1139 PyObject *ret = NULL;
1140 PyObject *mydict = NULL; /* points to the dict only if we create it */
1141 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 if (dict == NULL) {
1144 dict = mydict = PyDict_New();
1145 if (dict == NULL) {
1146 return NULL;
1147 }
1148 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 if (doc != NULL) {
1151 docobj = PyUnicode_FromString(doc);
1152 if (docobj == NULL)
1153 goto failure;
1154 result = PyDict_SetItemString(dict, "__doc__", docobj);
1155 Py_DECREF(docobj);
1156 if (result < 0)
1157 goto failure;
1158 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001161 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 Py_XDECREF(mydict);
1163 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001164}
1165
1166
Victor Stinneref9d9b62019-05-22 11:28:22 +02001167PyDoc_STRVAR(UnraisableHookArgs__doc__,
1168"UnraisableHookArgs\n\
1169\n\
1170Type used to pass arguments to sys.unraisablehook.");
1171
1172static PyTypeObject UnraisableHookArgsType;
1173
1174static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1175 {"exc_type", "Exception type"},
1176 {"exc_value", "Exception value"},
1177 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001178 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001179 {"object", "Object causing the exception"},
1180 {0}
1181};
1182
1183static PyStructSequence_Desc UnraisableHookArgs_desc = {
1184 .name = "UnraisableHookArgs",
1185 .doc = UnraisableHookArgs__doc__,
1186 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001187 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001188};
1189
1190
Victor Stinner331a6a52019-05-27 16:39:22 +02001191PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001192_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001193{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001194 if (UnraisableHookArgsType.tp_name == NULL) {
1195 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1196 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001197 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001198 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001199 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001200 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001201}
1202
1203
1204static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001205make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001206 PyObject *exc_value, PyObject *exc_tb,
1207 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001208{
1209 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1210 if (args == NULL) {
1211 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001213
Victor Stinneref9d9b62019-05-22 11:28:22 +02001214 Py_ssize_t pos = 0;
1215#define ADD_ITEM(exc_type) \
1216 do { \
1217 if (exc_type == NULL) { \
1218 exc_type = Py_None; \
1219 } \
1220 Py_INCREF(exc_type); \
1221 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1222 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001223
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001224
Victor Stinneref9d9b62019-05-22 11:28:22 +02001225 ADD_ITEM(exc_type);
1226 ADD_ITEM(exc_value);
1227 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001228 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001229 ADD_ITEM(obj);
1230#undef ADD_ITEM
1231
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001232 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001233 Py_DECREF(args);
1234 return NULL;
1235 }
1236 return args;
1237}
1238
1239
1240
1241/* Default implementation of sys.unraisablehook.
1242
1243 It can be called to log the exception of a custom sys.unraisablehook.
1244
1245 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1246static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001247write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1248 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001249 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001250{
1251 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001252 if (err_msg != NULL && err_msg != Py_None) {
1253 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1254 return -1;
1255 }
1256 if (PyFile_WriteString(": ", file) < 0) {
1257 return -1;
1258 }
1259 }
1260 else {
1261 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1262 return -1;
1263 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001264 }
1265
1266 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001267 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001268 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1269 return -1;
1270 }
1271 }
1272 if (PyFile_WriteString("\n", file) < 0) {
1273 return -1;
1274 }
1275 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001276 else if (err_msg != NULL && err_msg != Py_None) {
1277 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1278 return -1;
1279 }
1280 if (PyFile_WriteString(":\n", file) < 0) {
1281 return -1;
1282 }
1283 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001284
1285 if (exc_tb != NULL && exc_tb != Py_None) {
1286 if (PyTraceBack_Print(exc_tb, file) < 0) {
1287 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001288 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001289 }
1290 }
1291
Victor Stinnerdf22c032019-05-23 01:00:58 +02001292 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001293 return -1;
1294 }
1295
1296 assert(PyExceptionClass_Check(exc_type));
1297 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001298 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001299 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001300 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001301 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001302 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001303 }
1304
Victor Stinneref9d9b62019-05-22 11:28:22 +02001305 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001306 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001307 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001308 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001309 if (PyFile_WriteString("<unknown>", file) < 0) {
1310 return -1;
1311 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001312 }
1313 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001314 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001315 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1316 Py_DECREF(moduleName);
1317 return -1;
1318 }
1319 Py_DECREF(moduleName);
1320 if (PyFile_WriteString(".", file) < 0) {
1321 return -1;
1322 }
1323 }
1324 else {
1325 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001326 }
1327 }
1328 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001329 if (PyFile_WriteString("<unknown>", file) < 0) {
1330 return -1;
1331 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001332 }
1333 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001334 if (PyFile_WriteString(className, file) < 0) {
1335 return -1;
1336 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001337 }
1338
Victor Stinneref9d9b62019-05-22 11:28:22 +02001339 if (exc_value && exc_value != Py_None) {
1340 if (PyFile_WriteString(": ", file) < 0) {
1341 return -1;
1342 }
1343 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001344 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001345 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1346 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001347 }
1348 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001349 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001350
Victor Stinneref9d9b62019-05-22 11:28:22 +02001351 if (PyFile_WriteString("\n", file) < 0) {
1352 return -1;
1353 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001354
1355 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001356 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001357 if (!res) {
1358 return -1;
1359 }
1360 Py_DECREF(res);
1361
Victor Stinneref9d9b62019-05-22 11:28:22 +02001362 return 0;
1363}
1364
1365
1366static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001367write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001368 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1369 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001370{
1371 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1372 if (file == NULL || file == Py_None) {
1373 return 0;
1374 }
1375
1376 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1377 while we use it */
1378 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001379 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001380 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001381 Py_DECREF(file);
1382
1383 return res;
1384}
1385
1386
1387PyObject*
1388_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1389{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001390 PyThreadState *tstate = _PyThreadState_GET();
1391
Andy Lester55728702020-03-06 16:53:17 -06001392 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001393 _PyErr_SetString(tstate, PyExc_TypeError,
1394 "sys.unraisablehook argument type "
1395 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001396 return NULL;
1397 }
1398
1399 /* Borrowed references */
1400 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1401 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1402 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001403 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1404 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001405
Victor Stinner71c52e32019-05-27 08:57:14 +02001406 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001407 return NULL;
1408 }
1409 Py_RETURN_NONE;
1410}
1411
1412
1413/* Call sys.unraisablehook().
1414
1415 This function can be used when an exception has occurred but there is no way
1416 for Python to handle it. For example, when a destructor raises an exception
1417 or during garbage collection (gc.collect()).
1418
Victor Stinner71c52e32019-05-27 08:57:14 +02001419 If err_msg_str is non-NULL, the error message is formatted as:
1420 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1421 error message.
1422
Victor Stinneref9d9b62019-05-22 11:28:22 +02001423 An exception must be set when calling this function. */
1424void
Victor Stinner71c52e32019-05-27 08:57:14 +02001425_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001426{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001427 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +02001428 _Py_EnsureTstateNotNULL(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001429
Victor Stinner71c52e32019-05-27 08:57:14 +02001430 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001431 PyObject *exc_type, *exc_value, *exc_tb;
1432 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001433
1434 assert(exc_type != NULL);
1435
1436 if (exc_type == NULL) {
1437 /* sys.unraisablehook requires that at least exc_type is set */
1438 goto default_hook;
1439 }
1440
Victor Stinnerdf22c032019-05-23 01:00:58 +02001441 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001442 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001443 if (frame != NULL) {
1444 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1445 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001446 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001447 }
1448 }
1449 }
1450
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001451 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001452
1453 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1454 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001455 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001456 }
1457 }
1458
Victor Stinner71c52e32019-05-27 08:57:14 +02001459 if (err_msg_str != NULL) {
1460 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1461 if (err_msg == NULL) {
1462 PyErr_Clear();
1463 }
1464 }
1465
Steve Dowerbea33f52019-11-28 08:46:11 -08001466 PyObject *hook_args = make_unraisable_hook_args(
1467 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1468 if (hook_args == NULL) {
1469 err_msg_str = ("Exception ignored on building "
1470 "sys.unraisablehook arguments");
1471 goto error;
1472 }
1473
Victor Stinneref9d9b62019-05-22 11:28:22 +02001474 _Py_IDENTIFIER(unraisablehook);
1475 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001476 if (hook == NULL) {
1477 Py_DECREF(hook_args);
1478 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001479 }
1480
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001481 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001482 Py_DECREF(hook_args);
1483 err_msg_str = "Exception ignored in audit hook";
1484 obj = NULL;
1485 goto error;
1486 }
1487
1488 if (hook == Py_None) {
1489 Py_DECREF(hook_args);
1490 goto default_hook;
1491 }
1492
Petr Viktorinffd97532020-02-11 17:46:57 +01001493 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001494 Py_DECREF(hook_args);
1495 if (res != NULL) {
1496 Py_DECREF(res);
1497 goto done;
1498 }
1499
1500 /* sys.unraisablehook failed: log its error using default hook */
1501 obj = hook;
1502 err_msg_str = NULL;
1503
1504error:
1505 /* err_msg_str and obj have been updated and we have a new exception */
1506 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1507 err_msg_str : "Exception ignored in sys.unraisablehook"));
1508 Py_XDECREF(exc_type);
1509 Py_XDECREF(exc_value);
1510 Py_XDECREF(exc_tb);
1511 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1512
Victor Stinneref9d9b62019-05-22 11:28:22 +02001513default_hook:
1514 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001515 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1516 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001517
1518done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001519 Py_XDECREF(exc_type);
1520 Py_XDECREF(exc_value);
1521 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001522 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001523 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001524}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001525
Victor Stinner71c52e32019-05-27 08:57:14 +02001526
1527void
1528PyErr_WriteUnraisable(PyObject *obj)
1529{
1530 _PyErr_WriteUnraisableMsg(NULL, obj);
1531}
1532
1533
Armin Rigo092381a2003-10-25 14:29:27 +00001534extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001535
Guido van Rossum2fd45652001-02-28 21:46:24 +00001536
Benjamin Peterson2c539712010-09-20 22:42:10 +00001537void
Victor Stinner14e461d2013-08-26 22:28:21 +02001538PyErr_SyntaxLocation(const char *filename, int lineno)
1539{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001540 PyErr_SyntaxLocationEx(filename, lineno, -1);
1541}
1542
1543
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001544/* Set file and line information for the current exception.
1545 If the exception is not a SyntaxError, also sets additional attributes
1546 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001547
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001548void
Victor Stinner14e461d2013-08-26 22:28:21 +02001549PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001552 _Py_IDENTIFIER(filename);
1553 _Py_IDENTIFIER(lineno);
1554 _Py_IDENTIFIER(msg);
1555 _Py_IDENTIFIER(offset);
1556 _Py_IDENTIFIER(print_file_and_line);
1557 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001558 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001561 _PyErr_Fetch(tstate, &exc, &v, &tb);
1562 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 /* XXX check that it is, indeed, a syntax error. It might not
1564 * be, though. */
1565 tmp = PyLong_FromLong(lineno);
1566 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001567 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001569 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1570 _PyErr_Clear(tstate);
1571 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 Py_DECREF(tmp);
1573 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001574 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001575 if (col_offset >= 0) {
1576 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001577 if (tmp == NULL) {
1578 _PyErr_Clear(tstate);
1579 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001580 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001581 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1582 _PyErr_Clear(tstate);
1583 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001584 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001586 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1587 _PyErr_Clear(tstate);
1588 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001589
Victor Stinner14e461d2013-08-26 22:28:21 +02001590 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001592 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1593 _PyErr_Clear(tstate);
1594 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 Py_DECREF(tmp);
1596 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001597 else {
1598 _PyErr_Clear(tstate);
1599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 if (exc != PyExc_SyntaxError) {
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001602 if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) {
1603 _PyErr_Clear(tstate);
1604 }
1605 else if (tmp) {
1606 Py_DECREF(tmp);
1607 }
1608 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 tmp = PyObject_Str(v);
1610 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001611 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1612 _PyErr_Clear(tstate);
1613 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001615 }
1616 else {
1617 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 }
1619 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001620 if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) {
1621 _PyErr_Clear(tstate);
1622 }
1623 else if (tmp) {
1624 Py_DECREF(tmp);
1625 }
1626 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001627 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001628 Py_None)) {
1629 _PyErr_Clear(tstate);
1630 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 }
1632 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001633 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001634}
1635
Victor Stinner14e461d2013-08-26 22:28:21 +02001636void
1637PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1638{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001639 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001640 PyObject *fileobj;
1641 if (filename != NULL) {
1642 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001643 if (fileobj == NULL) {
1644 _PyErr_Clear(tstate);
1645 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001646 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001647 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001648 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001649 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001650 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1651 Py_XDECREF(fileobj);
1652}
1653
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001654/* Attempt to load the line of text that the exception refers to. If it
1655 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001656
1657 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001658 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001659
Antoine Pitrou409b5382013-10-12 22:41:17 +02001660static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001661err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 int i;
1664 char linebuf[1000];
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001665 if (fp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 return NULL;
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001667 }
1668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 for (i = 0; i < lineno; i++) {
1670 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1671 do {
1672 *pLastChar = '\0';
1673 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001674 fp, NULL) == NULL) {
1675 goto after_loop;
1676 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 /* fgets read *something*; if it didn't get as
1678 far as pLastChar, it must have found a newline
1679 or hit the end of the file; if pLastChar is \n,
1680 it obviously found a newline; else we haven't
1681 yet seen a newline, so must continue */
1682 } while (*pLastChar != '\0' && *pLastChar != '\n');
1683 }
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001684
1685after_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 fclose(fp);
1687 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001689 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001691 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 return res;
1693 }
1694 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001695}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001696
Victor Stinner14e461d2013-08-26 22:28:21 +02001697PyObject *
1698PyErr_ProgramText(const char *filename, int lineno)
1699{
1700 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001701 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001702 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001703 }
1704 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001705 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001706 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001707}
1708
1709PyObject *
1710PyErr_ProgramTextObject(PyObject *filename, int lineno)
1711{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001712 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001713 return NULL;
1714 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001715
1716 PyThreadState *tstate = _PyThreadState_GET();
1717 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1718 if (fp == NULL) {
1719 _PyErr_Clear(tstate);
1720 return NULL;
1721 }
1722 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001723}
1724
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001725#ifdef __cplusplus
1726}
1727#endif