blob: 9944c3a6007c6d7df587fd94aa9de6886d410092 [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*
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070088_PyErr_CreateException(PyObject *exception_type, PyObject *value)
Victor Stinner3a840972016-08-22 23:59:08 +020089{
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070090 PyObject *exc;
91
Victor Stinner3a840972016-08-22 23:59:08 +020092 if (value == NULL || value == Py_None) {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070093 exc = _PyObject_CallNoArg(exception_type);
Victor Stinner3a840972016-08-22 23:59:08 +020094 }
95 else if (PyTuple_Check(value)) {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070096 exc = PyObject_Call(exception_type, value, NULL);
Victor Stinner3a840972016-08-22 23:59:08 +020097 }
98 else {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070099 exc = PyObject_CallOneArg(exception_type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200100 }
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -0700101
102 if (exc != NULL && !PyExceptionInstance_Check(exc)) {
103 PyErr_Format(PyExc_TypeError,
104 "calling %R should have returned an instance of "
105 "BaseException, not %s",
106 exception_type, Py_TYPE(exc)->tp_name);
107 Py_CLEAR(exc);
108 }
109
110 return exc;
Victor Stinner3a840972016-08-22 23:59:08 +0200111}
112
Victor Stinner438a12d2019-05-24 17:01:38 +0200113void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200114_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 PyObject *exc_value;
117 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 if (exception != NULL &&
120 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200121 _PyErr_Format(tstate, PyExc_SystemError,
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200122 "_PyErr_SetObject: "
123 "exception %R is not a BaseException subclass",
Victor Stinner438a12d2019-05-24 17:01:38 +0200124 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 return;
126 }
Victor Stinner3a840972016-08-22 23:59:08 +0200127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100129 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 if (exc_value != NULL && exc_value != Py_None) {
131 /* Implicit exception chaining */
132 Py_INCREF(exc_value);
133 if (value == NULL || !PyExceptionInstance_Check(value)) {
134 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200135 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100136
Victor Stinner3a840972016-08-22 23:59:08 +0200137 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100138 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200139 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100140
Victor Stinner3a840972016-08-22 23:59:08 +0200141 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200143 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300144 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200146 }
147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 value = fixed_value;
149 }
Victor Stinner3a840972016-08-22 23:59:08 +0200150
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700151 /* Avoid creating new reference cycles through the
152 context chain, while taking care not to hang on
153 pre-existing ones.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 This is O(chain length) but context chains are
155 usually very short. Sensitive readers may try
156 to inline the call to PyException_GetContext. */
157 if (exc_value != value) {
158 PyObject *o = exc_value, *context;
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700159 PyObject *slow_o = o; /* Floyd's cycle detection algo */
160 int slow_update_toggle = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 while ((context = PyException_GetContext(o))) {
162 Py_DECREF(context);
163 if (context == value) {
164 PyException_SetContext(o, NULL);
165 break;
166 }
167 o = context;
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700168 if (o == slow_o) {
169 /* pre-existing cycle - all exceptions on the
170 path were visited and checked. */
171 break;
172 }
173 if (slow_update_toggle) {
174 slow_o = PyException_GetContext(slow_o);
175 Py_DECREF(slow_o);
176 }
177 slow_update_toggle = !slow_update_toggle;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 }
179 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200180 }
181 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 Py_DECREF(exc_value);
183 }
184 }
185 if (value != NULL && PyExceptionInstance_Check(value))
186 tb = PyException_GetTraceback(value);
187 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200188 _PyErr_Restore(tstate, exception, value, tb);
189}
190
191void
192PyErr_SetObject(PyObject *exception, PyObject *value)
193{
194 PyThreadState *tstate = _PyThreadState_GET();
195 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
Raymond Hettinger69492da2013-09-02 15:59:26 -0700198/* Set a key error with the specified argument, wrapping it in a
199 * tuple automatically so that tuple keys are not unpacked as the
200 * exception arguments. */
201void
202_PyErr_SetKeyError(PyObject *arg)
203{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200204 PyThreadState *tstate = _PyThreadState_GET();
205 PyObject *tup = PyTuple_Pack(1, arg);
206 if (!tup) {
207 /* caller will expect error to be set anyway */
208 return;
209 }
210 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700211 Py_DECREF(tup);
212}
213
Victor Stinner438a12d2019-05-24 17:01:38 +0200214void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200215_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
216{
217 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
218}
219
220
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000222PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200224 PyThreadState *tstate = _PyThreadState_GET();
225 _PyErr_SetNone(tstate, exception);
226}
227
228
Victor Stinner438a12d2019-05-24 17:01:38 +0200229void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200230_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
231 const char *string)
232{
233 PyObject *value = PyUnicode_FromString(string);
234 _PyErr_SetObject(tstate, exception, value);
235 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236}
237
238void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000239PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200241 PyThreadState *tstate = _PyThreadState_GET();
242 _PyErr_SetString(tstate, exception, string);
243}
244
245
Victor Stinnerc6944e72016-11-11 02:13:35 +0100246PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000247PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100249 /* The caller must hold the GIL. */
250 assert(PyGILState_Check());
251
Victor Stinner50b48572018-11-01 01:51:40 +0100252 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200253 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000256
257int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 if (err == NULL || exc == NULL) {
261 /* maybe caused by "import exceptions" that failed early on */
262 return 0;
263 }
264 if (PyTuple_Check(exc)) {
265 Py_ssize_t i, n;
266 n = PyTuple_Size(exc);
267 for (i = 0; i < n; i++) {
268 /* Test recursively */
269 if (PyErr_GivenExceptionMatches(
270 err, PyTuple_GET_ITEM(exc, i)))
271 {
272 return 1;
273 }
274 }
275 return 0;
276 }
277 /* err might be an instance, so check its class. */
278 if (PyExceptionInstance_Check(err))
279 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200282 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000286}
Guido van Rossum743007d1999-04-21 15:27:31 +0000287
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000288
289int
Victor Stinner438a12d2019-05-24 17:01:38 +0200290_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
291{
292 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
293}
294
295
296int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000297PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000298{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200299 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200300 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000301}
302
303
xdegaye56d1f5c2017-10-26 15:09:06 +0200304#ifndef Py_NORMALIZE_RECURSION_LIMIT
305#define Py_NORMALIZE_RECURSION_LIMIT 32
306#endif
307
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000308/* Used in many places to normalize a raised exception, including in
309 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000310
311 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000313*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200314void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200315_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
316 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000317{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200318 int recursion_depth = 0;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000319 tstate->recursion_headroom++;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200320 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000321
Serhiy Storchakacf296532017-11-05 11:27:48 +0200322 restart:
323 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 if (type == NULL) {
325 /* There was no exception, so nothing to do. */
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000326 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 return;
328 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000329
Serhiy Storchakacf296532017-11-05 11:27:48 +0200330 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 /* If PyErr_SetNone() was used, the value will have been actually
332 set to NULL.
333 */
334 if (!value) {
335 value = Py_None;
336 Py_INCREF(value);
337 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 /* Normalize the exception so that if the type is a class, the
340 value will be an instance.
341 */
342 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200343 PyObject *inclass = NULL;
344 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200345
Serhiy Storchakacf296532017-11-05 11:27:48 +0200346 if (PyExceptionInstance_Check(value)) {
347 inclass = PyExceptionInstance_Class(value);
348 is_subclass = PyObject_IsSubclass(inclass, type);
349 if (is_subclass < 0) {
350 goto error;
351 }
352 }
353
354 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 whose class is (or is derived from) type, then use the
356 value as an argument to instantiation of the type
357 class.
358 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200359 if (!is_subclass) {
360 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200361 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200362 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200365 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200367 /* If the class of the instance doesn't exactly match the
368 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 */
370 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200371 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 Py_DECREF(type);
373 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 }
375 }
376 *exc = type;
377 *val = value;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000378 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200380
381 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 Py_DECREF(type);
383 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200384 recursion_depth++;
385 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200386 _PyErr_SetString(tstate, PyExc_RecursionError,
387 "maximum recursion depth exceeded "
388 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200389 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 /* If the new exception doesn't set a traceback and the old
391 exception had a traceback, use the old traceback for the
392 new exception. It's better than nothing.
393 */
394 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200395 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200396 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 if (initial_tb != NULL) {
398 if (*tb == NULL)
399 *tb = initial_tb;
400 else
401 Py_DECREF(initial_tb);
402 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200403 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
404 corresponding RecursionError could not be normalized, and the
405 MemoryError raised when normalize this RecursionError could not be
406 normalized. */
407 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200408 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
409 Py_FatalError("Cannot recover from MemoryErrors "
410 "while normalizing exceptions.");
411 }
412 else {
413 Py_FatalError("Cannot recover from the recursive normalization "
414 "of an exception.");
415 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200417 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000418}
419
420
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200422PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423{
Victor Stinner50b48572018-11-01 01:51:40 +0100424 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200425 _PyErr_NormalizeException(tstate, exc, val, tb);
426}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200428
Victor Stinner438a12d2019-05-24 17:01:38 +0200429void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200430_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
431 PyObject **p_traceback)
432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 *p_type = tstate->curexc_type;
434 *p_value = tstate->curexc_value;
435 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 tstate->curexc_type = NULL;
438 tstate->curexc_value = NULL;
439 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200442
443void
444PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
445{
446 PyThreadState *tstate = _PyThreadState_GET();
447 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
448}
449
450
Victor Stinner438a12d2019-05-24 17:01:38 +0200451void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200452_PyErr_Clear(PyThreadState *tstate)
453{
454 _PyErr_Restore(tstate, NULL, NULL, NULL);
455}
456
457
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000459PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200461 PyThreadState *tstate = _PyThreadState_GET();
462 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000464
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200465
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200466void
Julien Danjou3430c552020-01-13 17:30:14 +0100467_PyErr_GetExcInfo(PyThreadState *tstate,
468 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200469{
Mark Shannonae3087c2017-10-22 22:41:51 +0100470 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
471 *p_type = exc_info->exc_type;
472 *p_value = exc_info->exc_value;
473 *p_traceback = exc_info->exc_traceback;
474
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200475 Py_XINCREF(*p_type);
476 Py_XINCREF(*p_value);
477 Py_XINCREF(*p_traceback);
478}
479
Julien Danjou3430c552020-01-13 17:30:14 +0100480
481void
482PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
483{
484 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100485 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100486}
487
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200488void
489PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
490{
491 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100492 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200493
Mark Shannonae3087c2017-10-22 22:41:51 +0100494 oldtype = tstate->exc_info->exc_type;
495 oldvalue = tstate->exc_info->exc_value;
496 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200497
Mark Shannonae3087c2017-10-22 22:41:51 +0100498 tstate->exc_info->exc_type = p_type;
499 tstate->exc_info->exc_value = p_value;
500 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200501
502 Py_XDECREF(oldtype);
503 Py_XDECREF(oldvalue);
504 Py_XDECREF(oldtraceback);
505}
506
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300507/* Like PyErr_Restore(), but if an exception is already set,
508 set the context associated with it.
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700509
510 The caller is responsible for ensuring that this call won't create
511 any cycles in the exception context chain. */
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300512void
513_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
514{
515 if (exc == NULL)
516 return;
517
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200518 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200519
520 if (!PyExceptionClass_Check(exc)) {
521 _PyErr_Format(tstate, PyExc_SystemError,
522 "_PyErr_ChainExceptions: "
523 "exception %R is not a BaseException subclass",
524 exc);
525 return;
526 }
527
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200528 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300529 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200530 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
531 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300532 if (tb != NULL) {
533 PyException_SetTraceback(val, tb);
534 Py_DECREF(tb);
535 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300536 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200537 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300538 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200539 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300540 }
541 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200542 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300543 }
544}
545
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700546/* Set the currently set exception's context to the given exception.
547
548 If the provided exc_info is NULL, then the current Python thread state's
549 exc_info will be used for the context instead.
550
551 This function can only be called when _PyErr_Occurred() is true.
552 Also, this function won't create any cycles in the exception context
553 chain to the extent that _PyErr_SetObject ensures this. */
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700554void
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700555_PyErr_ChainStackItem(_PyErr_StackItem *exc_info)
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700556{
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700557 PyThreadState *tstate = _PyThreadState_GET();
558 assert(_PyErr_Occurred(tstate));
559
560 int exc_info_given;
561 if (exc_info == NULL) {
562 exc_info_given = 0;
563 exc_info = tstate->exc_info;
564 } else {
565 exc_info_given = 1;
566 }
567 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) {
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700568 return;
569 }
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700570
571 _PyErr_StackItem *saved_exc_info;
572 if (exc_info_given) {
573 /* Temporarily set the thread state's exc_info since this is what
574 _PyErr_SetObject uses for implicit exception chaining. */
575 saved_exc_info = tstate->exc_info;
576 tstate->exc_info = exc_info;
577 }
578
579 PyObject *exc, *val, *tb;
580 _PyErr_Fetch(tstate, &exc, &val, &tb);
581
582 PyObject *exc2, *val2, *tb2;
583 exc2 = exc_info->exc_type;
584 val2 = exc_info->exc_value;
585 tb2 = exc_info->exc_traceback;
586 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
587 if (tb2 != NULL) {
588 PyException_SetTraceback(val2, tb2);
589 }
590
591 /* _PyErr_SetObject sets the context from PyThreadState. */
592 _PyErr_SetObject(tstate, exc, val);
593 Py_DECREF(exc); // since _PyErr_Occurred was true
594 Py_XDECREF(val);
595 Py_XDECREF(tb);
596
597 if (exc_info_given) {
598 tstate->exc_info = saved_exc_info;
599 }
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700600}
601
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300602static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200603_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
604 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300605{
606 PyObject *exc, *val, *val2, *tb;
607
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200608 assert(_PyErr_Occurred(tstate));
609 _PyErr_Fetch(tstate, &exc, &val, &tb);
610 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300611 if (tb != NULL) {
612 PyException_SetTraceback(val, tb);
613 Py_DECREF(tb);
614 }
615 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200616 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300617
Victor Stinner438a12d2019-05-24 17:01:38 +0200618 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300619
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200620 _PyErr_Fetch(tstate, &exc, &val2, &tb);
621 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300622 Py_INCREF(val);
623 PyException_SetCause(val2, val);
624 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200625 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300626
627 return NULL;
628}
629
630PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100631_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
632 const char *format, ...)
633{
634 va_list vargs;
635#ifdef HAVE_STDARG_PROTOTYPES
636 va_start(vargs, format);
637#else
638 va_start(vargs);
639#endif
640 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
641 va_end(vargs);
642 return NULL;
643}
644
645PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300646_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
647{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200648 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300649 va_list vargs;
650#ifdef HAVE_STDARG_PROTOTYPES
651 va_start(vargs, format);
652#else
653 va_start(vargs);
654#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200655 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300656 va_end(vargs);
657 return NULL;
658}
659
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000660/* Convenience functions to set a type error exception and return 0 */
661
662int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000664{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200665 PyThreadState *tstate = _PyThreadState_GET();
666 _PyErr_SetString(tstate, PyExc_TypeError,
667 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000669}
670
Guido van Rossum373c8691997-04-29 18:22:47 +0000671PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200672_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000673{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600674 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200675 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
676 initialized by _PyExc_Init() */
677 Py_FatalError("Out of memory and PyExc_MemoryError is not "
678 "initialized yet");
679 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200680 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000682}
683
Guido van Rossum373c8691997-04-29 18:22:47 +0000684PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200685PyErr_NoMemory(void)
686{
687 PyThreadState *tstate = _PyThreadState_GET();
688 return _PyErr_NoMemory(tstate);
689}
690
691PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000692PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000693{
Larry Hastingsb0827312014-02-09 22:05:19 -0800694 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
695}
696
697PyObject *
698PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
699{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200700 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200702 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100704#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000706#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000707
Guido van Rossume9fbc091995-02-18 14:52:19 +0000708#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if (i == EINTR && PyErr_CheckSignals())
710 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000711#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000712
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000713#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100714 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600715 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100716 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100717 }
718 else {
719 /* Sometimes errno didn't get set */
720 message = PyUnicode_FromString("Error");
721 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (i == 0)
724 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
725 else
726 {
727 /* Note that the Win32 errors do not lineup with the
728 errno error. So if the error is in the MSVC error
729 table, we use it, otherwise we assume it really _is_
730 a Win32 error code
731 */
732 if (i > 0 && i < _sys_nerr) {
733 message = PyUnicode_FromString(_sys_errlist[i]);
734 }
735 else {
736 int len = FormatMessageW(
737 FORMAT_MESSAGE_ALLOCATE_BUFFER |
738 FORMAT_MESSAGE_FROM_SYSTEM |
739 FORMAT_MESSAGE_IGNORE_INSERTS,
740 NULL, /* no message source */
741 i,
742 MAKELANGID(LANG_NEUTRAL,
743 SUBLANG_DEFAULT),
744 /* Default language */
745 (LPWSTR) &s_buf,
746 0, /* size not used */
747 NULL); /* no args */
748 if (len==0) {
749 /* Only ever seen this in out-of-mem
750 situations */
751 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300752 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 } else {
754 /* remove trailing cr/lf and dots */
755 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
756 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200757 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 }
759 }
760 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000761#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 if (message == NULL)
764 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000765#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 return NULL;
769 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000770
Larry Hastingsb0827312014-02-09 22:05:19 -0800771 if (filenameObject != NULL) {
772 if (filenameObject2 != NULL)
773 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
774 else
775 args = Py_BuildValue("(iOO)", i, message, filenameObject);
776 } else {
777 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200778 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800779 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000781
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200782 if (args != NULL) {
783 v = PyObject_Call(exc, args, NULL);
784 Py_DECREF(args);
785 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200786 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200787 Py_DECREF(v);
788 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000790#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000794}
Guido van Rossum743007d1999-04-21 15:27:31 +0000795
Barry Warsaw97d95151998-07-23 16:05:56 +0000796PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000797PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800800 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 Py_XDECREF(name);
802 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000803}
804
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000805#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000806PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000807PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000808{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200809 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800810 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 Py_XDECREF(name);
812 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000813}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000814#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000815
816PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000817PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000818{
Larry Hastingsb0827312014-02-09 22:05:19 -0800819 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000820}
Guido van Rossum683a0721990-10-21 22:09:12 +0000821
Brett Cannonbf364092006-03-01 04:25:17 +0000822#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000823/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000824PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PyObject *exc,
826 int ierr,
827 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000828{
Larry Hastingsb0827312014-02-09 22:05:19 -0800829 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
830 filenameObject, NULL);
831}
832
833PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
834 PyObject *exc,
835 int ierr,
836 PyObject *filenameObject,
837 PyObject *filenameObject2)
838{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200839 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 int len;
841 WCHAR *s_buf = NULL; /* Free via LocalFree */
842 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200843 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200846 if (err==0) {
847 err = GetLastError();
848 }
849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 len = FormatMessageW(
851 /* Error API error */
852 FORMAT_MESSAGE_ALLOCATE_BUFFER |
853 FORMAT_MESSAGE_FROM_SYSTEM |
854 FORMAT_MESSAGE_IGNORE_INSERTS,
855 NULL, /* no message source */
856 err,
857 MAKELANGID(LANG_NEUTRAL,
858 SUBLANG_DEFAULT), /* Default language */
859 (LPWSTR) &s_buf,
860 0, /* size not used */
861 NULL); /* no args */
862 if (len==0) {
863 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300864 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 s_buf = NULL;
866 } else {
867 /* remove trailing cr/lf and dots */
868 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
869 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200870 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 if (message == NULL)
874 {
875 LocalFree(s_buf);
876 return NULL;
877 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000878
Larry Hastingsb0827312014-02-09 22:05:19 -0800879 if (filenameObject == NULL) {
880 assert(filenameObject2 == NULL);
881 filenameObject = filenameObject2 = Py_None;
882 }
883 else if (filenameObject2 == NULL)
884 filenameObject2 = Py_None;
885 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200886 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800887 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000889
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200890 if (args != NULL) {
891 v = PyObject_Call(exc, args, NULL);
892 Py_DECREF(args);
893 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200894 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200895 Py_DECREF(v);
896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 }
898 LocalFree(s_buf);
899 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000900}
901
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000902PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 PyObject *exc,
904 int ierr,
905 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000906{
Victor Stinner92be9392010-12-28 00:28:21 +0000907 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800908 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800910 name,
911 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 Py_XDECREF(name);
913 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000914}
915
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000916PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PyObject *exc,
918 int ierr,
919 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000920{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200921 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800922 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800924 name,
925 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 Py_XDECREF(name);
927 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000928}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000929
Thomas Heller085358a2002-07-29 14:27:41 +0000930PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
931{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800932 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000933}
934
Guido van Rossum795e1892000-02-17 15:19:15 +0000935PyObject *PyErr_SetFromWindowsErr(int ierr)
936{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800937 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
938 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800939}
940
Thomas Heller085358a2002-07-29 14:27:41 +0000941PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 int ierr,
943 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000944{
Victor Stinner92be9392010-12-28 00:28:21 +0000945 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800946 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200947 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800948 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 Py_XDECREF(name);
950 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000951}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000952
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000953PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 int ierr,
955 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000956{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200957 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800958 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200959 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800960 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 Py_XDECREF(name);
962 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000963}
Guido van Rossum795e1892000-02-17 15:19:15 +0000964#endif /* MS_WINDOWS */
965
Brett Cannon79ec55e2012-04-12 20:24:54 -0400966PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700967PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
968 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400969{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200970 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700971 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200972 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500973
Eric Snow46f97b82016-09-07 16:56:15 -0700974 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
975 if (issubclass < 0) {
976 return NULL;
977 }
978 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200979 _PyErr_SetString(tstate, PyExc_TypeError,
980 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500981 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200982 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500983
Eric Snow46f97b82016-09-07 16:56:15 -0700984 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200985 _PyErr_SetString(tstate, PyExc_TypeError,
986 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500987 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400988 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500989
Brian Curtin94c001b2012-04-18 08:30:51 -0500990 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500991 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500992 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500993 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500994 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500995 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500996
Eric Snow46f97b82016-09-07 16:56:15 -0700997 kwargs = PyDict_New();
998 if (kwargs == NULL) {
999 return NULL;
1000 }
Victor Stinnerf45a5612016-08-23 00:04:41 +02001001 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +03001002 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +02001003 }
1004 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +03001005 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +02001006 }
Brett Cannon79ec55e2012-04-12 20:24:54 -04001007
Petr Viktorinffd97532020-02-11 17:46:57 +01001008 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -04001009 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001010 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -05001011 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -04001012 }
1013
Berker Peksagec766d32016-05-01 09:06:36 +03001014done:
Brett Cannon79ec55e2012-04-12 20:24:54 -04001015 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -05001016 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -04001017}
1018
Eric Snow46f97b82016-09-07 16:56:15 -07001019PyObject *
1020PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
1021{
1022 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
1023}
1024
Guido van Rossum683a0721990-10-21 22:09:12 +00001025void
Neal Norwitzb382b842007-08-24 20:00:37 +00001026_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +00001027{
Victor Stinner438a12d2019-05-24 17:01:38 +02001028 PyThreadState *tstate = _PyThreadState_GET();
1029 _PyErr_Format(tstate, PyExc_SystemError,
1030 "%s:%d: bad argument to internal function",
1031 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +00001032}
1033
1034/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
1035 export the entry point for existing object code: */
1036#undef PyErr_BadInternalCall
1037void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001038PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +00001039{
Victor Stinnerfb3a6302013-07-12 00:37:30 +02001040 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +02001041 PyThreadState *tstate = _PyThreadState_GET();
1042 _PyErr_SetString(tstate, PyExc_SystemError,
1043 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +00001044}
Fred Drake6d63adf2000-08-24 22:38:39 +00001045#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
1046
Guido van Rossum1548bac1997-02-14 17:09:47 +00001047
Victor Stinner438a12d2019-05-24 17:01:38 +02001048static PyObject *
1049_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
1050 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +00001051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001053
Victor Stinnerde821be2015-03-24 12:41:23 +01001054 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
1055 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001056 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +02001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +01001059
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001060 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001063}
Guido van Rossum7617e051997-09-16 18:43:50 +00001064
1065
Antoine Pitrou0676a402014-09-30 21:16:27 +02001066PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02001067PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
1068{
1069 PyThreadState *tstate = _PyThreadState_GET();
1070 return _PyErr_FormatV(tstate, exception, format, vargs);
1071}
1072
1073
1074PyObject *
1075_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1076 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001077{
1078 va_list vargs;
1079#ifdef HAVE_STDARG_PROTOTYPES
1080 va_start(vargs, format);
1081#else
1082 va_start(vargs);
1083#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001084 _PyErr_FormatV(tstate, exception, format, vargs);
1085 va_end(vargs);
1086 return NULL;
1087}
1088
1089
1090PyObject *
1091PyErr_Format(PyObject *exception, const char *format, ...)
1092{
1093 PyThreadState *tstate = _PyThreadState_GET();
1094 va_list vargs;
1095#ifdef HAVE_STDARG_PROTOTYPES
1096 va_start(vargs, format);
1097#else
1098 va_start(vargs);
1099#endif
1100 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001101 va_end(vargs);
1102 return NULL;
1103}
1104
Thomas Wouters477c8d52006-05-27 19:21:47 +00001105
Guido van Rossum7617e051997-09-16 18:43:50 +00001106PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001107PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001108{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001109 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 PyObject *modulename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 PyObject *mydict = NULL;
1112 PyObject *bases = NULL;
1113 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001114
1115 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001117 _PyErr_SetString(tstate, PyExc_SystemError,
1118 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 return NULL;
1120 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001121 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001123 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 if (dict == NULL) {
1125 dict = mydict = PyDict_New();
1126 if (dict == NULL)
1127 goto failure;
1128 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001129
Serhiy Storchakab510e102020-10-26 12:47:57 +02001130 int r = _PyDict_ContainsId(dict, &PyId___module__);
1131 if (r < 0) {
1132 goto failure;
1133 }
1134 if (r == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 modulename = PyUnicode_FromStringAndSize(name,
1136 (Py_ssize_t)(dot-name));
1137 if (modulename == NULL)
1138 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001139 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 goto failure;
1141 }
1142 if (PyTuple_Check(base)) {
1143 bases = base;
1144 /* INCREF as we create a new ref in the else branch */
1145 Py_INCREF(bases);
1146 } else {
1147 bases = PyTuple_Pack(1, base);
1148 if (bases == NULL)
1149 goto failure;
1150 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001151 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001152 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001154 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 Py_XDECREF(bases);
1156 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 Py_XDECREF(modulename);
1158 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001159}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001160
Georg Brandl1e28a272009-12-28 08:41:01 +00001161
1162/* Create an exception with docstring */
1163PyObject *
1164PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 int result;
1168 PyObject *ret = NULL;
1169 PyObject *mydict = NULL; /* points to the dict only if we create it */
1170 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (dict == NULL) {
1173 dict = mydict = PyDict_New();
1174 if (dict == NULL) {
1175 return NULL;
1176 }
1177 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 if (doc != NULL) {
1180 docobj = PyUnicode_FromString(doc);
1181 if (docobj == NULL)
1182 goto failure;
1183 result = PyDict_SetItemString(dict, "__doc__", docobj);
1184 Py_DECREF(docobj);
1185 if (result < 0)
1186 goto failure;
1187 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001190 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 Py_XDECREF(mydict);
1192 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001193}
1194
1195
Victor Stinneref9d9b62019-05-22 11:28:22 +02001196PyDoc_STRVAR(UnraisableHookArgs__doc__,
1197"UnraisableHookArgs\n\
1198\n\
1199Type used to pass arguments to sys.unraisablehook.");
1200
1201static PyTypeObject UnraisableHookArgsType;
1202
1203static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1204 {"exc_type", "Exception type"},
1205 {"exc_value", "Exception value"},
1206 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001207 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001208 {"object", "Object causing the exception"},
1209 {0}
1210};
1211
1212static PyStructSequence_Desc UnraisableHookArgs_desc = {
1213 .name = "UnraisableHookArgs",
1214 .doc = UnraisableHookArgs__doc__,
1215 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001216 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001217};
1218
1219
Victor Stinner331a6a52019-05-27 16:39:22 +02001220PyStatus
Victor Stinner442ad742021-04-02 15:28:13 +02001221_PyErr_InitTypes(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001222{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001223 if (UnraisableHookArgsType.tp_name == NULL) {
1224 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1225 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001226 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001227 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001228 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001229 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001230}
1231
1232
1233static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001234make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001235 PyObject *exc_value, PyObject *exc_tb,
1236 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001237{
1238 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1239 if (args == NULL) {
1240 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001242
Victor Stinneref9d9b62019-05-22 11:28:22 +02001243 Py_ssize_t pos = 0;
1244#define ADD_ITEM(exc_type) \
1245 do { \
1246 if (exc_type == NULL) { \
1247 exc_type = Py_None; \
1248 } \
1249 Py_INCREF(exc_type); \
1250 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1251 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001252
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001253
Victor Stinneref9d9b62019-05-22 11:28:22 +02001254 ADD_ITEM(exc_type);
1255 ADD_ITEM(exc_value);
1256 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001257 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001258 ADD_ITEM(obj);
1259#undef ADD_ITEM
1260
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001261 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001262 Py_DECREF(args);
1263 return NULL;
1264 }
1265 return args;
1266}
1267
1268
1269
1270/* Default implementation of sys.unraisablehook.
1271
1272 It can be called to log the exception of a custom sys.unraisablehook.
1273
1274 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1275static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001276write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1277 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001278 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001279{
1280 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001281 if (err_msg != NULL && err_msg != Py_None) {
1282 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1283 return -1;
1284 }
1285 if (PyFile_WriteString(": ", file) < 0) {
1286 return -1;
1287 }
1288 }
1289 else {
1290 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1291 return -1;
1292 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001293 }
1294
1295 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001296 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001297 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1298 return -1;
1299 }
1300 }
1301 if (PyFile_WriteString("\n", file) < 0) {
1302 return -1;
1303 }
1304 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001305 else if (err_msg != NULL && err_msg != Py_None) {
1306 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1307 return -1;
1308 }
1309 if (PyFile_WriteString(":\n", file) < 0) {
1310 return -1;
1311 }
1312 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001313
1314 if (exc_tb != NULL && exc_tb != Py_None) {
1315 if (PyTraceBack_Print(exc_tb, file) < 0) {
1316 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001317 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001318 }
1319 }
1320
Victor Stinnerdf22c032019-05-23 01:00:58 +02001321 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001322 return -1;
1323 }
1324
1325 assert(PyExceptionClass_Check(exc_type));
1326 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001327 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001328 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001329 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001330 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001331 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001332 }
1333
Victor Stinneref9d9b62019-05-22 11:28:22 +02001334 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001335 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001336 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001337 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001338 if (PyFile_WriteString("<unknown>", file) < 0) {
1339 return -1;
1340 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001341 }
1342 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001343 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001344 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1345 Py_DECREF(moduleName);
1346 return -1;
1347 }
1348 Py_DECREF(moduleName);
1349 if (PyFile_WriteString(".", file) < 0) {
1350 return -1;
1351 }
1352 }
1353 else {
1354 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001355 }
1356 }
1357 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001358 if (PyFile_WriteString("<unknown>", file) < 0) {
1359 return -1;
1360 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001361 }
1362 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001363 if (PyFile_WriteString(className, file) < 0) {
1364 return -1;
1365 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001366 }
1367
Victor Stinneref9d9b62019-05-22 11:28:22 +02001368 if (exc_value && exc_value != Py_None) {
1369 if (PyFile_WriteString(": ", file) < 0) {
1370 return -1;
1371 }
1372 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001373 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001374 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1375 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001376 }
1377 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001378 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001379
Victor Stinneref9d9b62019-05-22 11:28:22 +02001380 if (PyFile_WriteString("\n", file) < 0) {
1381 return -1;
1382 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001383
1384 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001385 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001386 if (!res) {
1387 return -1;
1388 }
1389 Py_DECREF(res);
1390
Victor Stinneref9d9b62019-05-22 11:28:22 +02001391 return 0;
1392}
1393
1394
1395static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001396write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001397 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1398 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001399{
1400 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1401 if (file == NULL || file == Py_None) {
1402 return 0;
1403 }
1404
1405 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1406 while we use it */
1407 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001408 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001409 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001410 Py_DECREF(file);
1411
1412 return res;
1413}
1414
1415
1416PyObject*
1417_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1418{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001419 PyThreadState *tstate = _PyThreadState_GET();
1420
Andy Lester55728702020-03-06 16:53:17 -06001421 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001422 _PyErr_SetString(tstate, PyExc_TypeError,
1423 "sys.unraisablehook argument type "
1424 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001425 return NULL;
1426 }
1427
1428 /* Borrowed references */
1429 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1430 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1431 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001432 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1433 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001434
Victor Stinner71c52e32019-05-27 08:57:14 +02001435 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001436 return NULL;
1437 }
1438 Py_RETURN_NONE;
1439}
1440
1441
1442/* Call sys.unraisablehook().
1443
1444 This function can be used when an exception has occurred but there is no way
1445 for Python to handle it. For example, when a destructor raises an exception
1446 or during garbage collection (gc.collect()).
1447
Victor Stinner71c52e32019-05-27 08:57:14 +02001448 If err_msg_str is non-NULL, the error message is formatted as:
1449 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1450 error message.
1451
Victor Stinneref9d9b62019-05-22 11:28:22 +02001452 An exception must be set when calling this function. */
1453void
Victor Stinner71c52e32019-05-27 08:57:14 +02001454_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001455{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001456 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +02001457 _Py_EnsureTstateNotNULL(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001458
Victor Stinner71c52e32019-05-27 08:57:14 +02001459 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001460 PyObject *exc_type, *exc_value, *exc_tb;
1461 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001462
1463 assert(exc_type != NULL);
1464
1465 if (exc_type == NULL) {
1466 /* sys.unraisablehook requires that at least exc_type is set */
1467 goto default_hook;
1468 }
1469
Victor Stinnerdf22c032019-05-23 01:00:58 +02001470 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001471 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001472 if (frame != NULL) {
1473 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1474 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001475 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001476 }
1477 }
1478 }
1479
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001480 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001481
1482 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1483 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001484 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001485 }
1486 }
1487
Victor Stinner71c52e32019-05-27 08:57:14 +02001488 if (err_msg_str != NULL) {
1489 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1490 if (err_msg == NULL) {
1491 PyErr_Clear();
1492 }
1493 }
1494
Steve Dowerbea33f52019-11-28 08:46:11 -08001495 PyObject *hook_args = make_unraisable_hook_args(
1496 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1497 if (hook_args == NULL) {
1498 err_msg_str = ("Exception ignored on building "
1499 "sys.unraisablehook arguments");
1500 goto error;
1501 }
1502
Victor Stinneref9d9b62019-05-22 11:28:22 +02001503 _Py_IDENTIFIER(unraisablehook);
1504 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001505 if (hook == NULL) {
1506 Py_DECREF(hook_args);
1507 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001508 }
1509
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001510 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001511 Py_DECREF(hook_args);
1512 err_msg_str = "Exception ignored in audit hook";
1513 obj = NULL;
1514 goto error;
1515 }
1516
1517 if (hook == Py_None) {
1518 Py_DECREF(hook_args);
1519 goto default_hook;
1520 }
1521
Petr Viktorinffd97532020-02-11 17:46:57 +01001522 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001523 Py_DECREF(hook_args);
1524 if (res != NULL) {
1525 Py_DECREF(res);
1526 goto done;
1527 }
1528
1529 /* sys.unraisablehook failed: log its error using default hook */
1530 obj = hook;
1531 err_msg_str = NULL;
1532
1533error:
1534 /* err_msg_str and obj have been updated and we have a new exception */
1535 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1536 err_msg_str : "Exception ignored in sys.unraisablehook"));
1537 Py_XDECREF(exc_type);
1538 Py_XDECREF(exc_value);
1539 Py_XDECREF(exc_tb);
1540 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1541
Victor Stinneref9d9b62019-05-22 11:28:22 +02001542default_hook:
1543 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001544 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1545 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001546
1547done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001548 Py_XDECREF(exc_type);
1549 Py_XDECREF(exc_value);
1550 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001551 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001552 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001553}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001554
Victor Stinner71c52e32019-05-27 08:57:14 +02001555
1556void
1557PyErr_WriteUnraisable(PyObject *obj)
1558{
1559 _PyErr_WriteUnraisableMsg(NULL, obj);
1560}
1561
1562
Benjamin Peterson2c539712010-09-20 22:42:10 +00001563void
Victor Stinner14e461d2013-08-26 22:28:21 +02001564PyErr_SyntaxLocation(const char *filename, int lineno)
1565{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001566 PyErr_SyntaxLocationEx(filename, lineno, -1);
1567}
1568
1569
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001570/* Set file and line information for the current exception.
1571 If the exception is not a SyntaxError, also sets additional attributes
1572 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001573
Pablo Galindoa77aac42021-04-23 14:27:05 +01001574static void
1575PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset,
1576 int end_lineno, int end_col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001579 _Py_IDENTIFIER(filename);
1580 _Py_IDENTIFIER(lineno);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001581 _Py_IDENTIFIER(end_lineno);
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001582 _Py_IDENTIFIER(msg);
1583 _Py_IDENTIFIER(offset);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001584 _Py_IDENTIFIER(end_offset);
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001585 _Py_IDENTIFIER(print_file_and_line);
1586 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001587 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001590 _PyErr_Fetch(tstate, &exc, &v, &tb);
1591 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 /* XXX check that it is, indeed, a syntax error. It might not
1593 * be, though. */
1594 tmp = PyLong_FromLong(lineno);
1595 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001596 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001598 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1599 _PyErr_Clear(tstate);
1600 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 Py_DECREF(tmp);
1602 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001603 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001604 if (col_offset >= 0) {
1605 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001606 if (tmp == NULL) {
1607 _PyErr_Clear(tstate);
1608 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001609 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001610 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1611 _PyErr_Clear(tstate);
1612 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001613 Py_XDECREF(tmp);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001614
1615 tmp = NULL;
1616 if (end_lineno >= 0) {
1617 tmp = PyLong_FromLong(end_lineno);
1618 if (tmp == NULL) {
1619 _PyErr_Clear(tstate);
1620 }
1621 }
1622 if (_PyObject_SetAttrId(v, &PyId_end_lineno, tmp ? tmp : Py_None)) {
1623 _PyErr_Clear(tstate);
1624 }
1625 Py_XDECREF(tmp);
1626
1627 tmp = NULL;
1628 if (end_col_offset >= 0) {
1629 tmp = PyLong_FromLong(end_col_offset);
1630 if (tmp == NULL) {
1631 _PyErr_Clear(tstate);
1632 }
1633 }
1634 if (_PyObject_SetAttrId(v, &PyId_end_offset, tmp ? tmp : Py_None)) {
1635 _PyErr_Clear(tstate);
1636 }
1637 Py_XDECREF(tmp);
1638
1639 tmp = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001641 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1642 _PyErr_Clear(tstate);
1643 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001644
Victor Stinner14e461d2013-08-26 22:28:21 +02001645 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001647 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1648 _PyErr_Clear(tstate);
1649 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 Py_DECREF(tmp);
1651 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001652 else {
1653 _PyErr_Clear(tstate);
1654 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 if (exc != PyExc_SyntaxError) {
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001657 if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) {
1658 _PyErr_Clear(tstate);
1659 }
1660 else if (tmp) {
1661 Py_DECREF(tmp);
1662 }
1663 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 tmp = PyObject_Str(v);
1665 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001666 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1667 _PyErr_Clear(tstate);
1668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001670 }
1671 else {
1672 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 }
1674 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001675 if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) {
1676 _PyErr_Clear(tstate);
1677 }
1678 else if (tmp) {
1679 Py_DECREF(tmp);
1680 }
1681 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001682 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001683 Py_None)) {
1684 _PyErr_Clear(tstate);
1685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 }
1687 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001688 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001689}
1690
Victor Stinner14e461d2013-08-26 22:28:21 +02001691void
Pablo Galindoa77aac42021-04-23 14:27:05 +01001692PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) {
1693 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, lineno, -1);
1694}
1695
1696void
1697PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset,
1698 int end_lineno, int end_col_offset) {
1699 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, end_lineno, end_col_offset);
1700}
1701
1702void
Victor Stinner14e461d2013-08-26 22:28:21 +02001703PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1704{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001705 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001706 PyObject *fileobj;
1707 if (filename != NULL) {
1708 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001709 if (fileobj == NULL) {
1710 _PyErr_Clear(tstate);
1711 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001712 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001713 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001714 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001715 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001716 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1717 Py_XDECREF(fileobj);
1718}
1719
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001720/* Attempt to load the line of text that the exception refers to. If it
1721 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001722
1723 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001724 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001725
Antoine Pitrou409b5382013-10-12 22:41:17 +02001726static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001727err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 int i;
1730 char linebuf[1000];
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001731 if (fp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 return NULL;
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001733 }
1734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 for (i = 0; i < lineno; i++) {
1736 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1737 do {
1738 *pLastChar = '\0';
1739 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001740 fp, NULL) == NULL) {
1741 goto after_loop;
1742 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 /* fgets read *something*; if it didn't get as
1744 far as pLastChar, it must have found a newline
1745 or hit the end of the file; if pLastChar is \n,
1746 it obviously found a newline; else we haven't
1747 yet seen a newline, so must continue */
1748 } while (*pLastChar != '\0' && *pLastChar != '\n');
1749 }
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001750
1751after_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 fclose(fp);
1753 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001755 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001757 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 return res;
1759 }
1760 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001761}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001762
Victor Stinner14e461d2013-08-26 22:28:21 +02001763PyObject *
1764PyErr_ProgramText(const char *filename, int lineno)
1765{
Victor Stinner815506d2020-12-08 23:51:26 +01001766 if (filename == NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001767 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001768 }
Victor Stinner815506d2020-12-08 23:51:26 +01001769
1770 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
1771 if (filename_obj == NULL) {
1772 PyErr_Clear();
1773 return NULL;
1774 }
1775 PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno);
1776 Py_DECREF(filename_obj);
1777 return res;
Victor Stinner14e461d2013-08-26 22:28:21 +02001778}
1779
1780PyObject *
1781PyErr_ProgramTextObject(PyObject *filename, int lineno)
1782{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001783 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001784 return NULL;
1785 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001786
1787 PyThreadState *tstate = _PyThreadState_GET();
1788 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1789 if (fp == NULL) {
1790 _PyErr_Clear(tstate);
1791 return NULL;
1792 }
1793 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001794}
1795
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001796#ifdef __cplusplus
1797}
1798#endif