blob: 02cf47992b695ffcf4960e2ea31316322b373870 [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 Storchakaa24107b2019-02-25 17:59:46 +02001101 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001102 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001103 goto failure;
1104 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 modulename = PyUnicode_FromStringAndSize(name,
1106 (Py_ssize_t)(dot-name));
1107 if (modulename == NULL)
1108 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001109 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 goto failure;
1111 }
1112 if (PyTuple_Check(base)) {
1113 bases = base;
1114 /* INCREF as we create a new ref in the else branch */
1115 Py_INCREF(bases);
1116 } else {
1117 bases = PyTuple_Pack(1, base);
1118 if (bases == NULL)
1119 goto failure;
1120 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001121 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001122 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001124 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 Py_XDECREF(bases);
1126 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 Py_XDECREF(modulename);
1128 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001129}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001130
Georg Brandl1e28a272009-12-28 08:41:01 +00001131
1132/* Create an exception with docstring */
1133PyObject *
1134PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 int result;
1138 PyObject *ret = NULL;
1139 PyObject *mydict = NULL; /* points to the dict only if we create it */
1140 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 if (dict == NULL) {
1143 dict = mydict = PyDict_New();
1144 if (dict == NULL) {
1145 return NULL;
1146 }
1147 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (doc != NULL) {
1150 docobj = PyUnicode_FromString(doc);
1151 if (docobj == NULL)
1152 goto failure;
1153 result = PyDict_SetItemString(dict, "__doc__", docobj);
1154 Py_DECREF(docobj);
1155 if (result < 0)
1156 goto failure;
1157 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001160 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 Py_XDECREF(mydict);
1162 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001163}
1164
1165
Victor Stinneref9d9b62019-05-22 11:28:22 +02001166PyDoc_STRVAR(UnraisableHookArgs__doc__,
1167"UnraisableHookArgs\n\
1168\n\
1169Type used to pass arguments to sys.unraisablehook.");
1170
1171static PyTypeObject UnraisableHookArgsType;
1172
1173static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1174 {"exc_type", "Exception type"},
1175 {"exc_value", "Exception value"},
1176 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001177 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001178 {"object", "Object causing the exception"},
1179 {0}
1180};
1181
1182static PyStructSequence_Desc UnraisableHookArgs_desc = {
1183 .name = "UnraisableHookArgs",
1184 .doc = UnraisableHookArgs__doc__,
1185 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001186 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001187};
1188
1189
Victor Stinner331a6a52019-05-27 16:39:22 +02001190PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001191_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001192{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001193 if (UnraisableHookArgsType.tp_name == NULL) {
1194 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1195 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001196 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001197 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001198 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001199 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001200}
1201
1202
1203static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001204make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001205 PyObject *exc_value, PyObject *exc_tb,
1206 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001207{
1208 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1209 if (args == NULL) {
1210 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001212
Victor Stinneref9d9b62019-05-22 11:28:22 +02001213 Py_ssize_t pos = 0;
1214#define ADD_ITEM(exc_type) \
1215 do { \
1216 if (exc_type == NULL) { \
1217 exc_type = Py_None; \
1218 } \
1219 Py_INCREF(exc_type); \
1220 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1221 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001222
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001223
Victor Stinneref9d9b62019-05-22 11:28:22 +02001224 ADD_ITEM(exc_type);
1225 ADD_ITEM(exc_value);
1226 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001227 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001228 ADD_ITEM(obj);
1229#undef ADD_ITEM
1230
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001231 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001232 Py_DECREF(args);
1233 return NULL;
1234 }
1235 return args;
1236}
1237
1238
1239
1240/* Default implementation of sys.unraisablehook.
1241
1242 It can be called to log the exception of a custom sys.unraisablehook.
1243
1244 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1245static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001246write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1247 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001248 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001249{
1250 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001251 if (err_msg != NULL && err_msg != Py_None) {
1252 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1253 return -1;
1254 }
1255 if (PyFile_WriteString(": ", file) < 0) {
1256 return -1;
1257 }
1258 }
1259 else {
1260 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1261 return -1;
1262 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001263 }
1264
1265 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001266 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001267 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1268 return -1;
1269 }
1270 }
1271 if (PyFile_WriteString("\n", file) < 0) {
1272 return -1;
1273 }
1274 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001275 else if (err_msg != NULL && err_msg != Py_None) {
1276 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1277 return -1;
1278 }
1279 if (PyFile_WriteString(":\n", file) < 0) {
1280 return -1;
1281 }
1282 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001283
1284 if (exc_tb != NULL && exc_tb != Py_None) {
1285 if (PyTraceBack_Print(exc_tb, file) < 0) {
1286 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001287 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001288 }
1289 }
1290
Victor Stinnerdf22c032019-05-23 01:00:58 +02001291 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001292 return -1;
1293 }
1294
1295 assert(PyExceptionClass_Check(exc_type));
1296 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001297 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001298 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001299 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001300 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001301 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001302 }
1303
Victor Stinneref9d9b62019-05-22 11:28:22 +02001304 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001305 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001306 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001307 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001308 if (PyFile_WriteString("<unknown>", file) < 0) {
1309 return -1;
1310 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001311 }
1312 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001313 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001314 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1315 Py_DECREF(moduleName);
1316 return -1;
1317 }
1318 Py_DECREF(moduleName);
1319 if (PyFile_WriteString(".", file) < 0) {
1320 return -1;
1321 }
1322 }
1323 else {
1324 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001325 }
1326 }
1327 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001328 if (PyFile_WriteString("<unknown>", file) < 0) {
1329 return -1;
1330 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001331 }
1332 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001333 if (PyFile_WriteString(className, file) < 0) {
1334 return -1;
1335 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001336 }
1337
Victor Stinneref9d9b62019-05-22 11:28:22 +02001338 if (exc_value && exc_value != Py_None) {
1339 if (PyFile_WriteString(": ", file) < 0) {
1340 return -1;
1341 }
1342 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001343 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001344 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1345 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001346 }
1347 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001348 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001349
Victor Stinneref9d9b62019-05-22 11:28:22 +02001350 if (PyFile_WriteString("\n", file) < 0) {
1351 return -1;
1352 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001353
1354 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001355 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001356 if (!res) {
1357 return -1;
1358 }
1359 Py_DECREF(res);
1360
Victor Stinneref9d9b62019-05-22 11:28:22 +02001361 return 0;
1362}
1363
1364
1365static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001366write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001367 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1368 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001369{
1370 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1371 if (file == NULL || file == Py_None) {
1372 return 0;
1373 }
1374
1375 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1376 while we use it */
1377 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001378 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001379 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001380 Py_DECREF(file);
1381
1382 return res;
1383}
1384
1385
1386PyObject*
1387_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1388{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001389 PyThreadState *tstate = _PyThreadState_GET();
1390
Andy Lester55728702020-03-06 16:53:17 -06001391 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001392 _PyErr_SetString(tstate, PyExc_TypeError,
1393 "sys.unraisablehook argument type "
1394 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001395 return NULL;
1396 }
1397
1398 /* Borrowed references */
1399 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1400 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1401 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001402 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1403 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001404
Victor Stinner71c52e32019-05-27 08:57:14 +02001405 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001406 return NULL;
1407 }
1408 Py_RETURN_NONE;
1409}
1410
1411
1412/* Call sys.unraisablehook().
1413
1414 This function can be used when an exception has occurred but there is no way
1415 for Python to handle it. For example, when a destructor raises an exception
1416 or during garbage collection (gc.collect()).
1417
Victor Stinner71c52e32019-05-27 08:57:14 +02001418 If err_msg_str is non-NULL, the error message is formatted as:
1419 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1420 error message.
1421
Victor Stinneref9d9b62019-05-22 11:28:22 +02001422 An exception must be set when calling this function. */
1423void
Victor Stinner71c52e32019-05-27 08:57:14 +02001424_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001425{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001426 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +02001427 _Py_EnsureTstateNotNULL(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001428
Victor Stinner71c52e32019-05-27 08:57:14 +02001429 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001430 PyObject *exc_type, *exc_value, *exc_tb;
1431 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001432
1433 assert(exc_type != NULL);
1434
1435 if (exc_type == NULL) {
1436 /* sys.unraisablehook requires that at least exc_type is set */
1437 goto default_hook;
1438 }
1439
Victor Stinnerdf22c032019-05-23 01:00:58 +02001440 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001441 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001442 if (frame != NULL) {
1443 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1444 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001445 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001446 }
1447 }
1448 }
1449
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001450 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001451
1452 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1453 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001454 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001455 }
1456 }
1457
Victor Stinner71c52e32019-05-27 08:57:14 +02001458 if (err_msg_str != NULL) {
1459 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1460 if (err_msg == NULL) {
1461 PyErr_Clear();
1462 }
1463 }
1464
Steve Dowerbea33f52019-11-28 08:46:11 -08001465 PyObject *hook_args = make_unraisable_hook_args(
1466 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1467 if (hook_args == NULL) {
1468 err_msg_str = ("Exception ignored on building "
1469 "sys.unraisablehook arguments");
1470 goto error;
1471 }
1472
Victor Stinneref9d9b62019-05-22 11:28:22 +02001473 _Py_IDENTIFIER(unraisablehook);
1474 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001475 if (hook == NULL) {
1476 Py_DECREF(hook_args);
1477 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001478 }
1479
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001480 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001481 Py_DECREF(hook_args);
1482 err_msg_str = "Exception ignored in audit hook";
1483 obj = NULL;
1484 goto error;
1485 }
1486
1487 if (hook == Py_None) {
1488 Py_DECREF(hook_args);
1489 goto default_hook;
1490 }
1491
Petr Viktorinffd97532020-02-11 17:46:57 +01001492 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001493 Py_DECREF(hook_args);
1494 if (res != NULL) {
1495 Py_DECREF(res);
1496 goto done;
1497 }
1498
1499 /* sys.unraisablehook failed: log its error using default hook */
1500 obj = hook;
1501 err_msg_str = NULL;
1502
1503error:
1504 /* err_msg_str and obj have been updated and we have a new exception */
1505 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1506 err_msg_str : "Exception ignored in sys.unraisablehook"));
1507 Py_XDECREF(exc_type);
1508 Py_XDECREF(exc_value);
1509 Py_XDECREF(exc_tb);
1510 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1511
Victor Stinneref9d9b62019-05-22 11:28:22 +02001512default_hook:
1513 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001514 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1515 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001516
1517done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001518 Py_XDECREF(exc_type);
1519 Py_XDECREF(exc_value);
1520 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001521 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001522 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001523}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001524
Victor Stinner71c52e32019-05-27 08:57:14 +02001525
1526void
1527PyErr_WriteUnraisable(PyObject *obj)
1528{
1529 _PyErr_WriteUnraisableMsg(NULL, obj);
1530}
1531
1532
Armin Rigo092381a2003-10-25 14:29:27 +00001533extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001534
Guido van Rossum2fd45652001-02-28 21:46:24 +00001535
Benjamin Peterson2c539712010-09-20 22:42:10 +00001536void
Victor Stinner14e461d2013-08-26 22:28:21 +02001537PyErr_SyntaxLocation(const char *filename, int lineno)
1538{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001539 PyErr_SyntaxLocationEx(filename, lineno, -1);
1540}
1541
1542
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001543/* Set file and line information for the current exception.
1544 If the exception is not a SyntaxError, also sets additional attributes
1545 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001546
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001547void
Victor Stinner14e461d2013-08-26 22:28:21 +02001548PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001551 _Py_IDENTIFIER(filename);
1552 _Py_IDENTIFIER(lineno);
1553 _Py_IDENTIFIER(msg);
1554 _Py_IDENTIFIER(offset);
1555 _Py_IDENTIFIER(print_file_and_line);
1556 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001557 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001560 _PyErr_Fetch(tstate, &exc, &v, &tb);
1561 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 /* XXX check that it is, indeed, a syntax error. It might not
1563 * be, though. */
1564 tmp = PyLong_FromLong(lineno);
1565 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001566 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001568 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1569 _PyErr_Clear(tstate);
1570 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 Py_DECREF(tmp);
1572 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001573 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001574 if (col_offset >= 0) {
1575 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001576 if (tmp == NULL) {
1577 _PyErr_Clear(tstate);
1578 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001579 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001580 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1581 _PyErr_Clear(tstate);
1582 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001583 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001585 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1586 _PyErr_Clear(tstate);
1587 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001588
Victor Stinner14e461d2013-08-26 22:28:21 +02001589 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001591 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1592 _PyErr_Clear(tstate);
1593 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 Py_DECREF(tmp);
1595 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001596 else {
1597 _PyErr_Clear(tstate);
1598 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 if (exc != PyExc_SyntaxError) {
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001601 if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) {
1602 _PyErr_Clear(tstate);
1603 }
1604 else if (tmp) {
1605 Py_DECREF(tmp);
1606 }
1607 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 tmp = PyObject_Str(v);
1609 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001610 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1611 _PyErr_Clear(tstate);
1612 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001614 }
1615 else {
1616 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 }
1618 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001619 if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) {
1620 _PyErr_Clear(tstate);
1621 }
1622 else if (tmp) {
1623 Py_DECREF(tmp);
1624 }
1625 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001626 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001627 Py_None)) {
1628 _PyErr_Clear(tstate);
1629 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 }
1631 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001632 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001633}
1634
Victor Stinner14e461d2013-08-26 22:28:21 +02001635void
1636PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1637{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001638 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001639 PyObject *fileobj;
1640 if (filename != NULL) {
1641 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001642 if (fileobj == NULL) {
1643 _PyErr_Clear(tstate);
1644 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001645 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001646 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001647 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001648 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001649 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1650 Py_XDECREF(fileobj);
1651}
1652
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001653/* Attempt to load the line of text that the exception refers to. If it
1654 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001655
1656 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001657 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001658
Antoine Pitrou409b5382013-10-12 22:41:17 +02001659static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001660err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 int i;
1663 char linebuf[1000];
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001664 if (fp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return NULL;
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001666 }
1667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 for (i = 0; i < lineno; i++) {
1669 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1670 do {
1671 *pLastChar = '\0';
1672 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001673 fp, NULL) == NULL) {
1674 goto after_loop;
1675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 /* fgets read *something*; if it didn't get as
1677 far as pLastChar, it must have found a newline
1678 or hit the end of the file; if pLastChar is \n,
1679 it obviously found a newline; else we haven't
1680 yet seen a newline, so must continue */
1681 } while (*pLastChar != '\0' && *pLastChar != '\n');
1682 }
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001683
1684after_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 fclose(fp);
1686 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001688 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001690 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 return res;
1692 }
1693 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001694}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001695
Victor Stinner14e461d2013-08-26 22:28:21 +02001696PyObject *
1697PyErr_ProgramText(const char *filename, int lineno)
1698{
1699 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001700 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001701 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001702 }
1703 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001704 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001705 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001706}
1707
1708PyObject *
1709PyErr_ProgramTextObject(PyObject *filename, int lineno)
1710{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001711 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001712 return NULL;
1713 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001714
1715 PyThreadState *tstate = _PyThreadState_GET();
1716 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1717 if (fp == NULL) {
1718 _PyErr_Clear(tstate);
1719 return NULL;
1720 }
1721 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001722}
1723
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001724#ifdef __cplusplus
1725}
1726#endif