blob: d73ba93b02ece68101131ff0f26234c126b22adb [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;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000293 tstate->recursion_headroom++;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200294 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000295
Serhiy Storchakacf296532017-11-05 11:27:48 +0200296 restart:
297 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 if (type == NULL) {
299 /* There was no exception, so nothing to do. */
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000300 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 return;
302 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000303
Serhiy Storchakacf296532017-11-05 11:27:48 +0200304 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 /* If PyErr_SetNone() was used, the value will have been actually
306 set to NULL.
307 */
308 if (!value) {
309 value = Py_None;
310 Py_INCREF(value);
311 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 /* Normalize the exception so that if the type is a class, the
314 value will be an instance.
315 */
316 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200317 PyObject *inclass = NULL;
318 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200319
Serhiy Storchakacf296532017-11-05 11:27:48 +0200320 if (PyExceptionInstance_Check(value)) {
321 inclass = PyExceptionInstance_Class(value);
322 is_subclass = PyObject_IsSubclass(inclass, type);
323 if (is_subclass < 0) {
324 goto error;
325 }
326 }
327
328 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 whose class is (or is derived from) type, then use the
330 value as an argument to instantiation of the type
331 class.
332 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200333 if (!is_subclass) {
334 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200335 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200336 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200339 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200341 /* If the class of the instance doesn't exactly match the
342 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 */
344 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200345 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 Py_DECREF(type);
347 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 }
349 }
350 *exc = type;
351 *val = value;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000352 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200354
355 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 Py_DECREF(type);
357 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200358 recursion_depth++;
359 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200360 _PyErr_SetString(tstate, PyExc_RecursionError,
361 "maximum recursion depth exceeded "
362 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 /* If the new exception doesn't set a traceback and the old
365 exception had a traceback, use the old traceback for the
366 new exception. It's better than nothing.
367 */
368 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200369 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200370 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 if (initial_tb != NULL) {
372 if (*tb == NULL)
373 *tb = initial_tb;
374 else
375 Py_DECREF(initial_tb);
376 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200377 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
378 corresponding RecursionError could not be normalized, and the
379 MemoryError raised when normalize this RecursionError could not be
380 normalized. */
381 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200382 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
383 Py_FatalError("Cannot recover from MemoryErrors "
384 "while normalizing exceptions.");
385 }
386 else {
387 Py_FatalError("Cannot recover from the recursive normalization "
388 "of an exception.");
389 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200391 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000392}
393
394
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200396PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397{
Victor Stinner50b48572018-11-01 01:51:40 +0100398 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200399 _PyErr_NormalizeException(tstate, exc, val, tb);
400}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200402
Victor Stinner438a12d2019-05-24 17:01:38 +0200403void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200404_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
405 PyObject **p_traceback)
406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 *p_type = tstate->curexc_type;
408 *p_value = tstate->curexc_value;
409 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 tstate->curexc_type = NULL;
412 tstate->curexc_value = NULL;
413 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414}
415
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200416
417void
418PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
419{
420 PyThreadState *tstate = _PyThreadState_GET();
421 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
422}
423
424
Victor Stinner438a12d2019-05-24 17:01:38 +0200425void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200426_PyErr_Clear(PyThreadState *tstate)
427{
428 _PyErr_Restore(tstate, NULL, NULL, NULL);
429}
430
431
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200435 PyThreadState *tstate = _PyThreadState_GET();
436 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000438
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200439
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200440void
Julien Danjou3430c552020-01-13 17:30:14 +0100441_PyErr_GetExcInfo(PyThreadState *tstate,
442 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200443{
Mark Shannonae3087c2017-10-22 22:41:51 +0100444 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
445 *p_type = exc_info->exc_type;
446 *p_value = exc_info->exc_value;
447 *p_traceback = exc_info->exc_traceback;
448
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200449 Py_XINCREF(*p_type);
450 Py_XINCREF(*p_value);
451 Py_XINCREF(*p_traceback);
452}
453
Julien Danjou3430c552020-01-13 17:30:14 +0100454
455void
456PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
457{
458 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100459 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100460}
461
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200462void
463PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
464{
465 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100466 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200467
Mark Shannonae3087c2017-10-22 22:41:51 +0100468 oldtype = tstate->exc_info->exc_type;
469 oldvalue = tstate->exc_info->exc_value;
470 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200471
Mark Shannonae3087c2017-10-22 22:41:51 +0100472 tstate->exc_info->exc_type = p_type;
473 tstate->exc_info->exc_value = p_value;
474 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200475
476 Py_XDECREF(oldtype);
477 Py_XDECREF(oldvalue);
478 Py_XDECREF(oldtraceback);
479}
480
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300481/* Like PyErr_Restore(), but if an exception is already set,
482 set the context associated with it.
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700483
484 The caller is responsible for ensuring that this call won't create
485 any cycles in the exception context chain. */
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300486void
487_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
488{
489 if (exc == NULL)
490 return;
491
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200492 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200493
494 if (!PyExceptionClass_Check(exc)) {
495 _PyErr_Format(tstate, PyExc_SystemError,
496 "_PyErr_ChainExceptions: "
497 "exception %R is not a BaseException subclass",
498 exc);
499 return;
500 }
501
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200502 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300503 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200504 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
505 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300506 if (tb != NULL) {
507 PyException_SetTraceback(val, tb);
508 Py_DECREF(tb);
509 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300510 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200511 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300512 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200513 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300514 }
515 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200516 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300517 }
518}
519
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700520/* Set the currently set exception's context to the given exception.
521
522 If the provided exc_info is NULL, then the current Python thread state's
523 exc_info will be used for the context instead.
524
525 This function can only be called when _PyErr_Occurred() is true.
526 Also, this function won't create any cycles in the exception context
527 chain to the extent that _PyErr_SetObject ensures this. */
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700528void
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700529_PyErr_ChainStackItem(_PyErr_StackItem *exc_info)
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700530{
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700531 PyThreadState *tstate = _PyThreadState_GET();
532 assert(_PyErr_Occurred(tstate));
533
534 int exc_info_given;
535 if (exc_info == NULL) {
536 exc_info_given = 0;
537 exc_info = tstate->exc_info;
538 } else {
539 exc_info_given = 1;
540 }
541 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) {
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700542 return;
543 }
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700544
545 _PyErr_StackItem *saved_exc_info;
546 if (exc_info_given) {
547 /* Temporarily set the thread state's exc_info since this is what
548 _PyErr_SetObject uses for implicit exception chaining. */
549 saved_exc_info = tstate->exc_info;
550 tstate->exc_info = exc_info;
551 }
552
553 PyObject *exc, *val, *tb;
554 _PyErr_Fetch(tstate, &exc, &val, &tb);
555
556 PyObject *exc2, *val2, *tb2;
557 exc2 = exc_info->exc_type;
558 val2 = exc_info->exc_value;
559 tb2 = exc_info->exc_traceback;
560 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
561 if (tb2 != NULL) {
562 PyException_SetTraceback(val2, tb2);
563 }
564
565 /* _PyErr_SetObject sets the context from PyThreadState. */
566 _PyErr_SetObject(tstate, exc, val);
567 Py_DECREF(exc); // since _PyErr_Occurred was true
568 Py_XDECREF(val);
569 Py_XDECREF(tb);
570
571 if (exc_info_given) {
572 tstate->exc_info = saved_exc_info;
573 }
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700574}
575
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300576static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200577_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
578 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300579{
580 PyObject *exc, *val, *val2, *tb;
581
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200582 assert(_PyErr_Occurred(tstate));
583 _PyErr_Fetch(tstate, &exc, &val, &tb);
584 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300585 if (tb != NULL) {
586 PyException_SetTraceback(val, tb);
587 Py_DECREF(tb);
588 }
589 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200590 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300591
Victor Stinner438a12d2019-05-24 17:01:38 +0200592 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300593
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200594 _PyErr_Fetch(tstate, &exc, &val2, &tb);
595 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300596 Py_INCREF(val);
597 PyException_SetCause(val2, val);
598 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200599 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300600
601 return NULL;
602}
603
604PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100605_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
606 const char *format, ...)
607{
608 va_list vargs;
609#ifdef HAVE_STDARG_PROTOTYPES
610 va_start(vargs, format);
611#else
612 va_start(vargs);
613#endif
614 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
615 va_end(vargs);
616 return NULL;
617}
618
619PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300620_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
621{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200622 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300623 va_list vargs;
624#ifdef HAVE_STDARG_PROTOTYPES
625 va_start(vargs, format);
626#else
627 va_start(vargs);
628#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200629 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300630 va_end(vargs);
631 return NULL;
632}
633
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000634/* Convenience functions to set a type error exception and return 0 */
635
636int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000638{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200639 PyThreadState *tstate = _PyThreadState_GET();
640 _PyErr_SetString(tstate, PyExc_TypeError,
641 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000643}
644
Guido van Rossum373c8691997-04-29 18:22:47 +0000645PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200646_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000647{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600648 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200649 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
650 initialized by _PyExc_Init() */
651 Py_FatalError("Out of memory and PyExc_MemoryError is not "
652 "initialized yet");
653 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200654 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000656}
657
Guido van Rossum373c8691997-04-29 18:22:47 +0000658PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200659PyErr_NoMemory(void)
660{
661 PyThreadState *tstate = _PyThreadState_GET();
662 return _PyErr_NoMemory(tstate);
663}
664
665PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000666PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000667{
Larry Hastingsb0827312014-02-09 22:05:19 -0800668 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
669}
670
671PyObject *
672PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
673{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200674 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200676 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100678#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000680#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000681
Guido van Rossume9fbc091995-02-18 14:52:19 +0000682#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 if (i == EINTR && PyErr_CheckSignals())
684 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000685#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000686
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000687#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100688 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600689 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100690 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100691 }
692 else {
693 /* Sometimes errno didn't get set */
694 message = PyUnicode_FromString("Error");
695 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (i == 0)
698 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
699 else
700 {
701 /* Note that the Win32 errors do not lineup with the
702 errno error. So if the error is in the MSVC error
703 table, we use it, otherwise we assume it really _is_
704 a Win32 error code
705 */
706 if (i > 0 && i < _sys_nerr) {
707 message = PyUnicode_FromString(_sys_errlist[i]);
708 }
709 else {
710 int len = FormatMessageW(
711 FORMAT_MESSAGE_ALLOCATE_BUFFER |
712 FORMAT_MESSAGE_FROM_SYSTEM |
713 FORMAT_MESSAGE_IGNORE_INSERTS,
714 NULL, /* no message source */
715 i,
716 MAKELANGID(LANG_NEUTRAL,
717 SUBLANG_DEFAULT),
718 /* Default language */
719 (LPWSTR) &s_buf,
720 0, /* size not used */
721 NULL); /* no args */
722 if (len==0) {
723 /* Only ever seen this in out-of-mem
724 situations */
725 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300726 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 } else {
728 /* remove trailing cr/lf and dots */
729 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
730 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200731 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
733 }
734 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000735#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 if (message == NULL)
738 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000739#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 return NULL;
743 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000744
Larry Hastingsb0827312014-02-09 22:05:19 -0800745 if (filenameObject != NULL) {
746 if (filenameObject2 != NULL)
747 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
748 else
749 args = Py_BuildValue("(iOO)", i, message, filenameObject);
750 } else {
751 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200752 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800753 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000755
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200756 if (args != NULL) {
757 v = PyObject_Call(exc, args, NULL);
758 Py_DECREF(args);
759 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200760 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200761 Py_DECREF(v);
762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000764#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000768}
Guido van Rossum743007d1999-04-21 15:27:31 +0000769
Barry Warsaw97d95151998-07-23 16:05:56 +0000770PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000771PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800774 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 Py_XDECREF(name);
776 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000777}
778
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000779#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000780PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000781PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000782{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200783 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800784 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 Py_XDECREF(name);
786 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000787}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000788#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000789
790PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000791PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000792{
Larry Hastingsb0827312014-02-09 22:05:19 -0800793 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000794}
Guido van Rossum683a0721990-10-21 22:09:12 +0000795
Brett Cannonbf364092006-03-01 04:25:17 +0000796#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000797/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000798PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 PyObject *exc,
800 int ierr,
801 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000802{
Larry Hastingsb0827312014-02-09 22:05:19 -0800803 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
804 filenameObject, NULL);
805}
806
807PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
808 PyObject *exc,
809 int ierr,
810 PyObject *filenameObject,
811 PyObject *filenameObject2)
812{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200813 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 int len;
815 WCHAR *s_buf = NULL; /* Free via LocalFree */
816 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200817 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200820 if (err==0) {
821 err = GetLastError();
822 }
823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 len = FormatMessageW(
825 /* Error API error */
826 FORMAT_MESSAGE_ALLOCATE_BUFFER |
827 FORMAT_MESSAGE_FROM_SYSTEM |
828 FORMAT_MESSAGE_IGNORE_INSERTS,
829 NULL, /* no message source */
830 err,
831 MAKELANGID(LANG_NEUTRAL,
832 SUBLANG_DEFAULT), /* Default language */
833 (LPWSTR) &s_buf,
834 0, /* size not used */
835 NULL); /* no args */
836 if (len==0) {
837 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300838 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 s_buf = NULL;
840 } else {
841 /* remove trailing cr/lf and dots */
842 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
843 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200844 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 if (message == NULL)
848 {
849 LocalFree(s_buf);
850 return NULL;
851 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000852
Larry Hastingsb0827312014-02-09 22:05:19 -0800853 if (filenameObject == NULL) {
854 assert(filenameObject2 == NULL);
855 filenameObject = filenameObject2 = Py_None;
856 }
857 else if (filenameObject2 == NULL)
858 filenameObject2 = Py_None;
859 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200860 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800861 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000863
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200864 if (args != NULL) {
865 v = PyObject_Call(exc, args, NULL);
866 Py_DECREF(args);
867 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200868 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200869 Py_DECREF(v);
870 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 }
872 LocalFree(s_buf);
873 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000874}
875
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000876PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 PyObject *exc,
878 int ierr,
879 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000880{
Victor Stinner92be9392010-12-28 00:28:21 +0000881 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800882 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800884 name,
885 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 Py_XDECREF(name);
887 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000888}
889
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000890PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 PyObject *exc,
892 int ierr,
893 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000894{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200895 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800896 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800898 name,
899 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 Py_XDECREF(name);
901 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000902}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000903
Thomas Heller085358a2002-07-29 14:27:41 +0000904PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
905{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800906 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000907}
908
Guido van Rossum795e1892000-02-17 15:19:15 +0000909PyObject *PyErr_SetFromWindowsErr(int ierr)
910{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800911 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
912 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800913}
914
Thomas Heller085358a2002-07-29 14:27:41 +0000915PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 int ierr,
917 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000918{
Victor Stinner92be9392010-12-28 00:28:21 +0000919 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800920 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200921 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800922 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 Py_XDECREF(name);
924 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000925}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000926
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000927PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 int ierr,
929 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000930{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200931 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800932 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200933 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800934 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 Py_XDECREF(name);
936 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000937}
Guido van Rossum795e1892000-02-17 15:19:15 +0000938#endif /* MS_WINDOWS */
939
Brett Cannon79ec55e2012-04-12 20:24:54 -0400940PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700941PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
942 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400943{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200944 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700945 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200946 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500947
Eric Snow46f97b82016-09-07 16:56:15 -0700948 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
949 if (issubclass < 0) {
950 return NULL;
951 }
952 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200953 _PyErr_SetString(tstate, PyExc_TypeError,
954 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500955 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200956 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500957
Eric Snow46f97b82016-09-07 16:56:15 -0700958 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200959 _PyErr_SetString(tstate, PyExc_TypeError,
960 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500961 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400962 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500963
Brian Curtin94c001b2012-04-18 08:30:51 -0500964 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500965 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500966 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500967 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500968 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500969 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500970
Eric Snow46f97b82016-09-07 16:56:15 -0700971 kwargs = PyDict_New();
972 if (kwargs == NULL) {
973 return NULL;
974 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200975 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300976 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200977 }
978 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300979 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200980 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400981
Petr Viktorinffd97532020-02-11 17:46:57 +0100982 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400983 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200984 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500985 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400986 }
987
Berker Peksagec766d32016-05-01 09:06:36 +0300988done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400989 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500990 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400991}
992
Eric Snow46f97b82016-09-07 16:56:15 -0700993PyObject *
994PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
995{
996 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
997}
998
Guido van Rossum683a0721990-10-21 22:09:12 +0000999void
Neal Norwitzb382b842007-08-24 20:00:37 +00001000_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +00001001{
Victor Stinner438a12d2019-05-24 17:01:38 +02001002 PyThreadState *tstate = _PyThreadState_GET();
1003 _PyErr_Format(tstate, PyExc_SystemError,
1004 "%s:%d: bad argument to internal function",
1005 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +00001006}
1007
1008/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
1009 export the entry point for existing object code: */
1010#undef PyErr_BadInternalCall
1011void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001012PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +00001013{
Victor Stinnerfb3a6302013-07-12 00:37:30 +02001014 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +02001015 PyThreadState *tstate = _PyThreadState_GET();
1016 _PyErr_SetString(tstate, PyExc_SystemError,
1017 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +00001018}
Fred Drake6d63adf2000-08-24 22:38:39 +00001019#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
1020
Guido van Rossum1548bac1997-02-14 17:09:47 +00001021
Victor Stinner438a12d2019-05-24 17:01:38 +02001022static PyObject *
1023_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
1024 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +00001025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001027
Victor Stinnerde821be2015-03-24 12:41:23 +01001028 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
1029 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001030 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +02001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +01001033
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001034 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001037}
Guido van Rossum7617e051997-09-16 18:43:50 +00001038
1039
Antoine Pitrou0676a402014-09-30 21:16:27 +02001040PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02001041PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
1042{
1043 PyThreadState *tstate = _PyThreadState_GET();
1044 return _PyErr_FormatV(tstate, exception, format, vargs);
1045}
1046
1047
1048PyObject *
1049_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1050 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001051{
1052 va_list vargs;
1053#ifdef HAVE_STDARG_PROTOTYPES
1054 va_start(vargs, format);
1055#else
1056 va_start(vargs);
1057#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001058 _PyErr_FormatV(tstate, exception, format, vargs);
1059 va_end(vargs);
1060 return NULL;
1061}
1062
1063
1064PyObject *
1065PyErr_Format(PyObject *exception, const char *format, ...)
1066{
1067 PyThreadState *tstate = _PyThreadState_GET();
1068 va_list vargs;
1069#ifdef HAVE_STDARG_PROTOTYPES
1070 va_start(vargs, format);
1071#else
1072 va_start(vargs);
1073#endif
1074 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001075 va_end(vargs);
1076 return NULL;
1077}
1078
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079
Guido van Rossum7617e051997-09-16 18:43:50 +00001080PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001081PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001082{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001083 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 PyObject *modulename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 PyObject *mydict = NULL;
1086 PyObject *bases = NULL;
1087 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001088
1089 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001091 _PyErr_SetString(tstate, PyExc_SystemError,
1092 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 return NULL;
1094 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001095 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001097 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 if (dict == NULL) {
1099 dict = mydict = PyDict_New();
1100 if (dict == NULL)
1101 goto failure;
1102 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001103
Serhiy Storchakab510e102020-10-26 12:47:57 +02001104 int r = _PyDict_ContainsId(dict, &PyId___module__);
1105 if (r < 0) {
1106 goto failure;
1107 }
1108 if (r == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 modulename = PyUnicode_FromStringAndSize(name,
1110 (Py_ssize_t)(dot-name));
1111 if (modulename == NULL)
1112 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001113 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 goto failure;
1115 }
1116 if (PyTuple_Check(base)) {
1117 bases = base;
1118 /* INCREF as we create a new ref in the else branch */
1119 Py_INCREF(bases);
1120 } else {
1121 bases = PyTuple_Pack(1, base);
1122 if (bases == NULL)
1123 goto failure;
1124 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001125 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001126 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001128 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 Py_XDECREF(bases);
1130 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 Py_XDECREF(modulename);
1132 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001133}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001134
Georg Brandl1e28a272009-12-28 08:41:01 +00001135
1136/* Create an exception with docstring */
1137PyObject *
1138PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 int result;
1142 PyObject *ret = NULL;
1143 PyObject *mydict = NULL; /* points to the dict only if we create it */
1144 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (dict == NULL) {
1147 dict = mydict = PyDict_New();
1148 if (dict == NULL) {
1149 return NULL;
1150 }
1151 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (doc != NULL) {
1154 docobj = PyUnicode_FromString(doc);
1155 if (docobj == NULL)
1156 goto failure;
1157 result = PyDict_SetItemString(dict, "__doc__", docobj);
1158 Py_DECREF(docobj);
1159 if (result < 0)
1160 goto failure;
1161 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001164 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 Py_XDECREF(mydict);
1166 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001167}
1168
1169
Victor Stinneref9d9b62019-05-22 11:28:22 +02001170PyDoc_STRVAR(UnraisableHookArgs__doc__,
1171"UnraisableHookArgs\n\
1172\n\
1173Type used to pass arguments to sys.unraisablehook.");
1174
1175static PyTypeObject UnraisableHookArgsType;
1176
1177static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1178 {"exc_type", "Exception type"},
1179 {"exc_value", "Exception value"},
1180 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001181 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001182 {"object", "Object causing the exception"},
1183 {0}
1184};
1185
1186static PyStructSequence_Desc UnraisableHookArgs_desc = {
1187 .name = "UnraisableHookArgs",
1188 .doc = UnraisableHookArgs__doc__,
1189 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001190 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001191};
1192
1193
Victor Stinner331a6a52019-05-27 16:39:22 +02001194PyStatus
Victor Stinner442ad742021-04-02 15:28:13 +02001195_PyErr_InitTypes(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001196{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001197 if (UnraisableHookArgsType.tp_name == NULL) {
1198 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1199 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001200 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001201 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001202 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001203 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001204}
1205
1206
1207static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001208make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001209 PyObject *exc_value, PyObject *exc_tb,
1210 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001211{
1212 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1213 if (args == NULL) {
1214 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001216
Victor Stinneref9d9b62019-05-22 11:28:22 +02001217 Py_ssize_t pos = 0;
1218#define ADD_ITEM(exc_type) \
1219 do { \
1220 if (exc_type == NULL) { \
1221 exc_type = Py_None; \
1222 } \
1223 Py_INCREF(exc_type); \
1224 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1225 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001226
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001227
Victor Stinneref9d9b62019-05-22 11:28:22 +02001228 ADD_ITEM(exc_type);
1229 ADD_ITEM(exc_value);
1230 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001231 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001232 ADD_ITEM(obj);
1233#undef ADD_ITEM
1234
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001235 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001236 Py_DECREF(args);
1237 return NULL;
1238 }
1239 return args;
1240}
1241
1242
1243
1244/* Default implementation of sys.unraisablehook.
1245
1246 It can be called to log the exception of a custom sys.unraisablehook.
1247
1248 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1249static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001250write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1251 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001252 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001253{
1254 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001255 if (err_msg != NULL && err_msg != Py_None) {
1256 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1257 return -1;
1258 }
1259 if (PyFile_WriteString(": ", file) < 0) {
1260 return -1;
1261 }
1262 }
1263 else {
1264 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1265 return -1;
1266 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001267 }
1268
1269 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001270 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001271 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1272 return -1;
1273 }
1274 }
1275 if (PyFile_WriteString("\n", file) < 0) {
1276 return -1;
1277 }
1278 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001279 else if (err_msg != NULL && err_msg != Py_None) {
1280 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1281 return -1;
1282 }
1283 if (PyFile_WriteString(":\n", file) < 0) {
1284 return -1;
1285 }
1286 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001287
1288 if (exc_tb != NULL && exc_tb != Py_None) {
1289 if (PyTraceBack_Print(exc_tb, file) < 0) {
1290 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001291 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001292 }
1293 }
1294
Victor Stinnerdf22c032019-05-23 01:00:58 +02001295 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001296 return -1;
1297 }
1298
1299 assert(PyExceptionClass_Check(exc_type));
1300 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001301 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001302 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001303 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001304 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001305 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001306 }
1307
Victor Stinneref9d9b62019-05-22 11:28:22 +02001308 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001309 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001310 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001311 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001312 if (PyFile_WriteString("<unknown>", file) < 0) {
1313 return -1;
1314 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001315 }
1316 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001317 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001318 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1319 Py_DECREF(moduleName);
1320 return -1;
1321 }
1322 Py_DECREF(moduleName);
1323 if (PyFile_WriteString(".", file) < 0) {
1324 return -1;
1325 }
1326 }
1327 else {
1328 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001329 }
1330 }
1331 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001332 if (PyFile_WriteString("<unknown>", file) < 0) {
1333 return -1;
1334 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001335 }
1336 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001337 if (PyFile_WriteString(className, file) < 0) {
1338 return -1;
1339 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001340 }
1341
Victor Stinneref9d9b62019-05-22 11:28:22 +02001342 if (exc_value && exc_value != Py_None) {
1343 if (PyFile_WriteString(": ", file) < 0) {
1344 return -1;
1345 }
1346 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001347 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001348 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1349 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001350 }
1351 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001352 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001353
Victor Stinneref9d9b62019-05-22 11:28:22 +02001354 if (PyFile_WriteString("\n", file) < 0) {
1355 return -1;
1356 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001357
1358 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001359 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001360 if (!res) {
1361 return -1;
1362 }
1363 Py_DECREF(res);
1364
Victor Stinneref9d9b62019-05-22 11:28:22 +02001365 return 0;
1366}
1367
1368
1369static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001370write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001371 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1372 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001373{
1374 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1375 if (file == NULL || file == Py_None) {
1376 return 0;
1377 }
1378
1379 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1380 while we use it */
1381 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001382 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001383 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001384 Py_DECREF(file);
1385
1386 return res;
1387}
1388
1389
1390PyObject*
1391_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1392{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001393 PyThreadState *tstate = _PyThreadState_GET();
1394
Andy Lester55728702020-03-06 16:53:17 -06001395 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001396 _PyErr_SetString(tstate, PyExc_TypeError,
1397 "sys.unraisablehook argument type "
1398 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001399 return NULL;
1400 }
1401
1402 /* Borrowed references */
1403 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1404 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1405 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001406 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1407 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001408
Victor Stinner71c52e32019-05-27 08:57:14 +02001409 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001410 return NULL;
1411 }
1412 Py_RETURN_NONE;
1413}
1414
1415
1416/* Call sys.unraisablehook().
1417
1418 This function can be used when an exception has occurred but there is no way
1419 for Python to handle it. For example, when a destructor raises an exception
1420 or during garbage collection (gc.collect()).
1421
Victor Stinner71c52e32019-05-27 08:57:14 +02001422 If err_msg_str is non-NULL, the error message is formatted as:
1423 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1424 error message.
1425
Victor Stinneref9d9b62019-05-22 11:28:22 +02001426 An exception must be set when calling this function. */
1427void
Victor Stinner71c52e32019-05-27 08:57:14 +02001428_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001429{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001430 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +02001431 _Py_EnsureTstateNotNULL(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001432
Victor Stinner71c52e32019-05-27 08:57:14 +02001433 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001434 PyObject *exc_type, *exc_value, *exc_tb;
1435 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001436
1437 assert(exc_type != NULL);
1438
1439 if (exc_type == NULL) {
1440 /* sys.unraisablehook requires that at least exc_type is set */
1441 goto default_hook;
1442 }
1443
Victor Stinnerdf22c032019-05-23 01:00:58 +02001444 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001445 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001446 if (frame != NULL) {
1447 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1448 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001449 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001450 }
1451 }
1452 }
1453
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001454 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001455
1456 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1457 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001458 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001459 }
1460 }
1461
Victor Stinner71c52e32019-05-27 08:57:14 +02001462 if (err_msg_str != NULL) {
1463 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1464 if (err_msg == NULL) {
1465 PyErr_Clear();
1466 }
1467 }
1468
Steve Dowerbea33f52019-11-28 08:46:11 -08001469 PyObject *hook_args = make_unraisable_hook_args(
1470 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1471 if (hook_args == NULL) {
1472 err_msg_str = ("Exception ignored on building "
1473 "sys.unraisablehook arguments");
1474 goto error;
1475 }
1476
Victor Stinneref9d9b62019-05-22 11:28:22 +02001477 _Py_IDENTIFIER(unraisablehook);
1478 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001479 if (hook == NULL) {
1480 Py_DECREF(hook_args);
1481 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001482 }
1483
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001484 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001485 Py_DECREF(hook_args);
1486 err_msg_str = "Exception ignored in audit hook";
1487 obj = NULL;
1488 goto error;
1489 }
1490
1491 if (hook == Py_None) {
1492 Py_DECREF(hook_args);
1493 goto default_hook;
1494 }
1495
Petr Viktorinffd97532020-02-11 17:46:57 +01001496 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001497 Py_DECREF(hook_args);
1498 if (res != NULL) {
1499 Py_DECREF(res);
1500 goto done;
1501 }
1502
1503 /* sys.unraisablehook failed: log its error using default hook */
1504 obj = hook;
1505 err_msg_str = NULL;
1506
1507error:
1508 /* err_msg_str and obj have been updated and we have a new exception */
1509 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1510 err_msg_str : "Exception ignored in sys.unraisablehook"));
1511 Py_XDECREF(exc_type);
1512 Py_XDECREF(exc_value);
1513 Py_XDECREF(exc_tb);
1514 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1515
Victor Stinneref9d9b62019-05-22 11:28:22 +02001516default_hook:
1517 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001518 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1519 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001520
1521done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001522 Py_XDECREF(exc_type);
1523 Py_XDECREF(exc_value);
1524 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001525 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001526 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001527}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001528
Victor Stinner71c52e32019-05-27 08:57:14 +02001529
1530void
1531PyErr_WriteUnraisable(PyObject *obj)
1532{
1533 _PyErr_WriteUnraisableMsg(NULL, obj);
1534}
1535
1536
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{
Victor Stinner815506d2020-12-08 23:51:26 +01001700 if (filename == NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001701 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001702 }
Victor Stinner815506d2020-12-08 23:51:26 +01001703
1704 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
1705 if (filename_obj == NULL) {
1706 PyErr_Clear();
1707 return NULL;
1708 }
1709 PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno);
1710 Py_DECREF(filename_obj);
1711 return res;
Victor Stinner14e461d2013-08-26 22:28:21 +02001712}
1713
1714PyObject *
1715PyErr_ProgramTextObject(PyObject *filename, int lineno)
1716{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001717 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001718 return NULL;
1719 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001720
1721 PyThreadState *tstate = _PyThreadState_GET();
1722 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1723 if (fp == NULL) {
1724 _PyErr_Clear(tstate);
1725 return NULL;
1726 }
1727 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001728}
1729
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001730#ifdef __cplusplus
1731}
1732#endif