blob: d4b9db1aba34ee822c78f60eab3fe462306af6bd [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 /* Avoid reference cycles through the context chain.
152 This is O(chain length) but context chains are
153 usually very short. Sensitive readers may try
154 to inline the call to PyException_GetContext. */
155 if (exc_value != value) {
156 PyObject *o = exc_value, *context;
157 while ((context = PyException_GetContext(o))) {
158 Py_DECREF(context);
159 if (context == value) {
160 PyException_SetContext(o, NULL);
161 break;
162 }
163 o = context;
164 }
165 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200166 }
167 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 Py_DECREF(exc_value);
169 }
170 }
171 if (value != NULL && PyExceptionInstance_Check(value))
172 tb = PyException_GetTraceback(value);
173 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200174 _PyErr_Restore(tstate, exception, value, tb);
175}
176
177void
178PyErr_SetObject(PyObject *exception, PyObject *value)
179{
180 PyThreadState *tstate = _PyThreadState_GET();
181 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Raymond Hettinger69492da2013-09-02 15:59:26 -0700184/* Set a key error with the specified argument, wrapping it in a
185 * tuple automatically so that tuple keys are not unpacked as the
186 * exception arguments. */
187void
188_PyErr_SetKeyError(PyObject *arg)
189{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200190 PyThreadState *tstate = _PyThreadState_GET();
191 PyObject *tup = PyTuple_Pack(1, arg);
192 if (!tup) {
193 /* caller will expect error to be set anyway */
194 return;
195 }
196 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700197 Py_DECREF(tup);
198}
199
Victor Stinner438a12d2019-05-24 17:01:38 +0200200void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200201_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
202{
203 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
204}
205
206
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000208PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200210 PyThreadState *tstate = _PyThreadState_GET();
211 _PyErr_SetNone(tstate, exception);
212}
213
214
Victor Stinner438a12d2019-05-24 17:01:38 +0200215void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200216_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
217 const char *string)
218{
219 PyObject *value = PyUnicode_FromString(string);
220 _PyErr_SetObject(tstate, exception, value);
221 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222}
223
224void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000225PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200227 PyThreadState *tstate = _PyThreadState_GET();
228 _PyErr_SetString(tstate, exception, string);
229}
230
231
Victor Stinnerc6944e72016-11-11 02:13:35 +0100232PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100235 /* The caller must hold the GIL. */
236 assert(PyGILState_Check());
237
Victor Stinner50b48572018-11-01 01:51:40 +0100238 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200239 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240}
241
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000242
243int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000244PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 if (err == NULL || exc == NULL) {
247 /* maybe caused by "import exceptions" that failed early on */
248 return 0;
249 }
250 if (PyTuple_Check(exc)) {
251 Py_ssize_t i, n;
252 n = PyTuple_Size(exc);
253 for (i = 0; i < n; i++) {
254 /* Test recursively */
255 if (PyErr_GivenExceptionMatches(
256 err, PyTuple_GET_ITEM(exc, i)))
257 {
258 return 1;
259 }
260 }
261 return 0;
262 }
263 /* err might be an instance, so check its class. */
264 if (PyExceptionInstance_Check(err))
265 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200268 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000272}
Guido van Rossum743007d1999-04-21 15:27:31 +0000273
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000274
275int
Victor Stinner438a12d2019-05-24 17:01:38 +0200276_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
277{
278 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
279}
280
281
282int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000283PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000284{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200285 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200286 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000287}
288
289
xdegaye56d1f5c2017-10-26 15:09:06 +0200290#ifndef Py_NORMALIZE_RECURSION_LIMIT
291#define Py_NORMALIZE_RECURSION_LIMIT 32
292#endif
293
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000294/* Used in many places to normalize a raised exception, including in
295 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000296
297 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000299*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200300void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200301_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
302 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000303{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200304 int recursion_depth = 0;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000305 tstate->recursion_headroom++;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200306 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000307
Serhiy Storchakacf296532017-11-05 11:27:48 +0200308 restart:
309 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 if (type == NULL) {
311 /* There was no exception, so nothing to do. */
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000312 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 return;
314 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000315
Serhiy Storchakacf296532017-11-05 11:27:48 +0200316 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 /* If PyErr_SetNone() was used, the value will have been actually
318 set to NULL.
319 */
320 if (!value) {
321 value = Py_None;
322 Py_INCREF(value);
323 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 /* Normalize the exception so that if the type is a class, the
326 value will be an instance.
327 */
328 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200329 PyObject *inclass = NULL;
330 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200331
Serhiy Storchakacf296532017-11-05 11:27:48 +0200332 if (PyExceptionInstance_Check(value)) {
333 inclass = PyExceptionInstance_Class(value);
334 is_subclass = PyObject_IsSubclass(inclass, type);
335 if (is_subclass < 0) {
336 goto error;
337 }
338 }
339
340 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 whose class is (or is derived from) type, then use the
342 value as an argument to instantiation of the type
343 class.
344 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200345 if (!is_subclass) {
346 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200347 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200348 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200351 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200353 /* If the class of the instance doesn't exactly match the
354 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 */
356 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200357 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 Py_DECREF(type);
359 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 }
361 }
362 *exc = type;
363 *val = value;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000364 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200366
367 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 Py_DECREF(type);
369 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200370 recursion_depth++;
371 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200372 _PyErr_SetString(tstate, PyExc_RecursionError,
373 "maximum recursion depth exceeded "
374 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 /* If the new exception doesn't set a traceback and the old
377 exception had a traceback, use the old traceback for the
378 new exception. It's better than nothing.
379 */
380 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200381 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200382 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (initial_tb != NULL) {
384 if (*tb == NULL)
385 *tb = initial_tb;
386 else
387 Py_DECREF(initial_tb);
388 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200389 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
390 corresponding RecursionError could not be normalized, and the
391 MemoryError raised when normalize this RecursionError could not be
392 normalized. */
393 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200394 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
395 Py_FatalError("Cannot recover from MemoryErrors "
396 "while normalizing exceptions.");
397 }
398 else {
399 Py_FatalError("Cannot recover from the recursive normalization "
400 "of an exception.");
401 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200403 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000404}
405
406
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200408PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409{
Victor Stinner50b48572018-11-01 01:51:40 +0100410 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200411 _PyErr_NormalizeException(tstate, exc, val, tb);
412}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200414
Victor Stinner438a12d2019-05-24 17:01:38 +0200415void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200416_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
417 PyObject **p_traceback)
418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 *p_type = tstate->curexc_type;
420 *p_value = tstate->curexc_value;
421 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 tstate->curexc_type = NULL;
424 tstate->curexc_value = NULL;
425 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}
427
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200428
429void
430PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
431{
432 PyThreadState *tstate = _PyThreadState_GET();
433 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
434}
435
436
Victor Stinner438a12d2019-05-24 17:01:38 +0200437void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200438_PyErr_Clear(PyThreadState *tstate)
439{
440 _PyErr_Restore(tstate, NULL, NULL, NULL);
441}
442
443
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000445PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200447 PyThreadState *tstate = _PyThreadState_GET();
448 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000450
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200451
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200452void
Julien Danjou3430c552020-01-13 17:30:14 +0100453_PyErr_GetExcInfo(PyThreadState *tstate,
454 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200455{
Mark Shannonae3087c2017-10-22 22:41:51 +0100456 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
457 *p_type = exc_info->exc_type;
458 *p_value = exc_info->exc_value;
459 *p_traceback = exc_info->exc_traceback;
460
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200461 Py_XINCREF(*p_type);
462 Py_XINCREF(*p_value);
463 Py_XINCREF(*p_traceback);
464}
465
Julien Danjou3430c552020-01-13 17:30:14 +0100466
467void
468PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
469{
470 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100471 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100472}
473
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200474void
475PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
476{
477 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100478 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200479
Mark Shannonae3087c2017-10-22 22:41:51 +0100480 oldtype = tstate->exc_info->exc_type;
481 oldvalue = tstate->exc_info->exc_value;
482 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200483
Mark Shannonae3087c2017-10-22 22:41:51 +0100484 tstate->exc_info->exc_type = p_type;
485 tstate->exc_info->exc_value = p_value;
486 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200487
488 Py_XDECREF(oldtype);
489 Py_XDECREF(oldvalue);
490 Py_XDECREF(oldtraceback);
491}
492
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300493/* Like PyErr_Restore(), but if an exception is already set,
494 set the context associated with it.
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700495
496 The caller is responsible for ensuring that this call won't create
497 any cycles in the exception context chain. */
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300498void
499_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
500{
501 if (exc == NULL)
502 return;
503
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200504 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200505
506 if (!PyExceptionClass_Check(exc)) {
507 _PyErr_Format(tstate, PyExc_SystemError,
508 "_PyErr_ChainExceptions: "
509 "exception %R is not a BaseException subclass",
510 exc);
511 return;
512 }
513
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200514 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300515 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200516 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
517 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300518 if (tb != NULL) {
519 PyException_SetTraceback(val, tb);
520 Py_DECREF(tb);
521 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300522 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200523 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300524 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200525 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300526 }
527 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200528 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300529 }
530}
531
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700532/* Set the currently set exception's context to the given exception.
533
534 If the provided exc_info is NULL, then the current Python thread state's
535 exc_info will be used for the context instead.
536
537 This function can only be called when _PyErr_Occurred() is true.
538 Also, this function won't create any cycles in the exception context
539 chain to the extent that _PyErr_SetObject ensures this. */
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700540void
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700541_PyErr_ChainStackItem(_PyErr_StackItem *exc_info)
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700542{
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700543 PyThreadState *tstate = _PyThreadState_GET();
544 assert(_PyErr_Occurred(tstate));
545
546 int exc_info_given;
547 if (exc_info == NULL) {
548 exc_info_given = 0;
549 exc_info = tstate->exc_info;
550 } else {
551 exc_info_given = 1;
552 }
553 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) {
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700554 return;
555 }
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700556
557 _PyErr_StackItem *saved_exc_info;
558 if (exc_info_given) {
559 /* Temporarily set the thread state's exc_info since this is what
560 _PyErr_SetObject uses for implicit exception chaining. */
561 saved_exc_info = tstate->exc_info;
562 tstate->exc_info = exc_info;
563 }
564
565 PyObject *exc, *val, *tb;
566 _PyErr_Fetch(tstate, &exc, &val, &tb);
567
568 PyObject *exc2, *val2, *tb2;
569 exc2 = exc_info->exc_type;
570 val2 = exc_info->exc_value;
571 tb2 = exc_info->exc_traceback;
572 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
573 if (tb2 != NULL) {
574 PyException_SetTraceback(val2, tb2);
575 }
576
577 /* _PyErr_SetObject sets the context from PyThreadState. */
578 _PyErr_SetObject(tstate, exc, val);
579 Py_DECREF(exc); // since _PyErr_Occurred was true
580 Py_XDECREF(val);
581 Py_XDECREF(tb);
582
583 if (exc_info_given) {
584 tstate->exc_info = saved_exc_info;
585 }
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700586}
587
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300588static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200589_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
590 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300591{
592 PyObject *exc, *val, *val2, *tb;
593
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200594 assert(_PyErr_Occurred(tstate));
595 _PyErr_Fetch(tstate, &exc, &val, &tb);
596 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300597 if (tb != NULL) {
598 PyException_SetTraceback(val, tb);
599 Py_DECREF(tb);
600 }
601 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200602 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300603
Victor Stinner438a12d2019-05-24 17:01:38 +0200604 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300605
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200606 _PyErr_Fetch(tstate, &exc, &val2, &tb);
607 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300608 Py_INCREF(val);
609 PyException_SetCause(val2, val);
610 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200611 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300612
613 return NULL;
614}
615
616PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100617_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
618 const char *format, ...)
619{
620 va_list vargs;
621#ifdef HAVE_STDARG_PROTOTYPES
622 va_start(vargs, format);
623#else
624 va_start(vargs);
625#endif
626 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
627 va_end(vargs);
628 return NULL;
629}
630
631PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300632_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
633{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200634 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300635 va_list vargs;
636#ifdef HAVE_STDARG_PROTOTYPES
637 va_start(vargs, format);
638#else
639 va_start(vargs);
640#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200641 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300642 va_end(vargs);
643 return NULL;
644}
645
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000646/* Convenience functions to set a type error exception and return 0 */
647
648int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000649PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000650{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200651 PyThreadState *tstate = _PyThreadState_GET();
652 _PyErr_SetString(tstate, PyExc_TypeError,
653 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000655}
656
Guido van Rossum373c8691997-04-29 18:22:47 +0000657PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200658_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000659{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600660 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200661 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
662 initialized by _PyExc_Init() */
663 Py_FatalError("Out of memory and PyExc_MemoryError is not "
664 "initialized yet");
665 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200666 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000668}
669
Guido van Rossum373c8691997-04-29 18:22:47 +0000670PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200671PyErr_NoMemory(void)
672{
673 PyThreadState *tstate = _PyThreadState_GET();
674 return _PyErr_NoMemory(tstate);
675}
676
677PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000678PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000679{
Larry Hastingsb0827312014-02-09 22:05:19 -0800680 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
681}
682
683PyObject *
684PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
685{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200686 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200688 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100690#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000692#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000693
Guido van Rossume9fbc091995-02-18 14:52:19 +0000694#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 if (i == EINTR && PyErr_CheckSignals())
696 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000697#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000698
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000699#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100700 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600701 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100702 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100703 }
704 else {
705 /* Sometimes errno didn't get set */
706 message = PyUnicode_FromString("Error");
707 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000708#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if (i == 0)
710 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
711 else
712 {
713 /* Note that the Win32 errors do not lineup with the
714 errno error. So if the error is in the MSVC error
715 table, we use it, otherwise we assume it really _is_
716 a Win32 error code
717 */
718 if (i > 0 && i < _sys_nerr) {
719 message = PyUnicode_FromString(_sys_errlist[i]);
720 }
721 else {
722 int len = FormatMessageW(
723 FORMAT_MESSAGE_ALLOCATE_BUFFER |
724 FORMAT_MESSAGE_FROM_SYSTEM |
725 FORMAT_MESSAGE_IGNORE_INSERTS,
726 NULL, /* no message source */
727 i,
728 MAKELANGID(LANG_NEUTRAL,
729 SUBLANG_DEFAULT),
730 /* Default language */
731 (LPWSTR) &s_buf,
732 0, /* size not used */
733 NULL); /* no args */
734 if (len==0) {
735 /* Only ever seen this in out-of-mem
736 situations */
737 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300738 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 } else {
740 /* remove trailing cr/lf and dots */
741 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
742 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200743 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 }
745 }
746 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000747#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 if (message == NULL)
750 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000751#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 return NULL;
755 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000756
Larry Hastingsb0827312014-02-09 22:05:19 -0800757 if (filenameObject != NULL) {
758 if (filenameObject2 != NULL)
759 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
760 else
761 args = Py_BuildValue("(iOO)", i, message, filenameObject);
762 } else {
763 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200764 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000767
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200768 if (args != NULL) {
769 v = PyObject_Call(exc, args, NULL);
770 Py_DECREF(args);
771 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200772 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200773 Py_DECREF(v);
774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000776#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000780}
Guido van Rossum743007d1999-04-21 15:27:31 +0000781
Barry Warsaw97d95151998-07-23 16:05:56 +0000782PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000783PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800786 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 Py_XDECREF(name);
788 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000789}
790
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000791#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000792PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000793PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000794{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200795 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800796 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 Py_XDECREF(name);
798 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000799}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000800#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000801
802PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000804{
Larry Hastingsb0827312014-02-09 22:05:19 -0800805 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000806}
Guido van Rossum683a0721990-10-21 22:09:12 +0000807
Brett Cannonbf364092006-03-01 04:25:17 +0000808#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000809/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000810PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 PyObject *exc,
812 int ierr,
813 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000814{
Larry Hastingsb0827312014-02-09 22:05:19 -0800815 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
816 filenameObject, NULL);
817}
818
819PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
820 PyObject *exc,
821 int ierr,
822 PyObject *filenameObject,
823 PyObject *filenameObject2)
824{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200825 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 int len;
827 WCHAR *s_buf = NULL; /* Free via LocalFree */
828 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200829 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200832 if (err==0) {
833 err = GetLastError();
834 }
835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 len = FormatMessageW(
837 /* Error API error */
838 FORMAT_MESSAGE_ALLOCATE_BUFFER |
839 FORMAT_MESSAGE_FROM_SYSTEM |
840 FORMAT_MESSAGE_IGNORE_INSERTS,
841 NULL, /* no message source */
842 err,
843 MAKELANGID(LANG_NEUTRAL,
844 SUBLANG_DEFAULT), /* Default language */
845 (LPWSTR) &s_buf,
846 0, /* size not used */
847 NULL); /* no args */
848 if (len==0) {
849 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300850 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 s_buf = NULL;
852 } else {
853 /* remove trailing cr/lf and dots */
854 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
855 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200856 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 if (message == NULL)
860 {
861 LocalFree(s_buf);
862 return NULL;
863 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000864
Larry Hastingsb0827312014-02-09 22:05:19 -0800865 if (filenameObject == NULL) {
866 assert(filenameObject2 == NULL);
867 filenameObject = filenameObject2 = Py_None;
868 }
869 else if (filenameObject2 == NULL)
870 filenameObject2 = Py_None;
871 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200872 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800873 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000875
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200876 if (args != NULL) {
877 v = PyObject_Call(exc, args, NULL);
878 Py_DECREF(args);
879 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200880 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200881 Py_DECREF(v);
882 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 }
884 LocalFree(s_buf);
885 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000886}
887
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000888PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 PyObject *exc,
890 int ierr,
891 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000892{
Victor Stinner92be9392010-12-28 00:28:21 +0000893 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800894 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800896 name,
897 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 Py_XDECREF(name);
899 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000900}
901
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000902PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 PyObject *exc,
904 int ierr,
905 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000906{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200907 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : 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}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000915
Thomas Heller085358a2002-07-29 14:27:41 +0000916PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
917{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800918 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000919}
920
Guido van Rossum795e1892000-02-17 15:19:15 +0000921PyObject *PyErr_SetFromWindowsErr(int ierr)
922{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800923 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
924 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800925}
926
Thomas Heller085358a2002-07-29 14:27:41 +0000927PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 int ierr,
929 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000930{
Victor Stinner92be9392010-12-28 00:28:21 +0000931 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : 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;
Guido van Rossum795e1892000-02-17 15:19:15 +0000937}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000938
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000939PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 int ierr,
941 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000942{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200943 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800944 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200945 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800946 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 Py_XDECREF(name);
948 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000949}
Guido van Rossum795e1892000-02-17 15:19:15 +0000950#endif /* MS_WINDOWS */
951
Brett Cannon79ec55e2012-04-12 20:24:54 -0400952PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700953PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
954 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400955{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200956 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700957 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200958 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500959
Eric Snow46f97b82016-09-07 16:56:15 -0700960 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
961 if (issubclass < 0) {
962 return NULL;
963 }
964 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200965 _PyErr_SetString(tstate, PyExc_TypeError,
966 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500967 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200968 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500969
Eric Snow46f97b82016-09-07 16:56:15 -0700970 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200971 _PyErr_SetString(tstate, PyExc_TypeError,
972 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500973 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400974 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500975
Brian Curtin94c001b2012-04-18 08:30:51 -0500976 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500977 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500978 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500979 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500980 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500981 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500982
Eric Snow46f97b82016-09-07 16:56:15 -0700983 kwargs = PyDict_New();
984 if (kwargs == NULL) {
985 return NULL;
986 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200987 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300988 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200989 }
990 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300991 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200992 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400993
Petr Viktorinffd97532020-02-11 17:46:57 +0100994 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400995 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200996 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500997 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400998 }
999
Berker Peksagec766d32016-05-01 09:06:36 +03001000done:
Brett Cannon79ec55e2012-04-12 20:24:54 -04001001 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -05001002 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -04001003}
1004
Eric Snow46f97b82016-09-07 16:56:15 -07001005PyObject *
1006PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
1007{
1008 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
1009}
1010
Guido van Rossum683a0721990-10-21 22:09:12 +00001011void
Neal Norwitzb382b842007-08-24 20:00:37 +00001012_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +00001013{
Victor Stinner438a12d2019-05-24 17:01:38 +02001014 PyThreadState *tstate = _PyThreadState_GET();
1015 _PyErr_Format(tstate, PyExc_SystemError,
1016 "%s:%d: bad argument to internal function",
1017 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +00001018}
1019
1020/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
1021 export the entry point for existing object code: */
1022#undef PyErr_BadInternalCall
1023void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001024PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +00001025{
Victor Stinnerfb3a6302013-07-12 00:37:30 +02001026 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +02001027 PyThreadState *tstate = _PyThreadState_GET();
1028 _PyErr_SetString(tstate, PyExc_SystemError,
1029 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +00001030}
Fred Drake6d63adf2000-08-24 22:38:39 +00001031#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
1032
Guido van Rossum1548bac1997-02-14 17:09:47 +00001033
Victor Stinner438a12d2019-05-24 17:01:38 +02001034static PyObject *
1035_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
1036 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +00001037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001039
Victor Stinnerde821be2015-03-24 12:41:23 +01001040 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
1041 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001042 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +02001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +01001045
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001046 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001049}
Guido van Rossum7617e051997-09-16 18:43:50 +00001050
1051
Antoine Pitrou0676a402014-09-30 21:16:27 +02001052PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02001053PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
1054{
1055 PyThreadState *tstate = _PyThreadState_GET();
1056 return _PyErr_FormatV(tstate, exception, format, vargs);
1057}
1058
1059
1060PyObject *
1061_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1062 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001063{
1064 va_list vargs;
1065#ifdef HAVE_STDARG_PROTOTYPES
1066 va_start(vargs, format);
1067#else
1068 va_start(vargs);
1069#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001070 _PyErr_FormatV(tstate, exception, format, vargs);
1071 va_end(vargs);
1072 return NULL;
1073}
1074
1075
1076PyObject *
1077PyErr_Format(PyObject *exception, const char *format, ...)
1078{
1079 PyThreadState *tstate = _PyThreadState_GET();
1080 va_list vargs;
1081#ifdef HAVE_STDARG_PROTOTYPES
1082 va_start(vargs, format);
1083#else
1084 va_start(vargs);
1085#endif
1086 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001087 va_end(vargs);
1088 return NULL;
1089}
1090
Thomas Wouters477c8d52006-05-27 19:21:47 +00001091
Guido van Rossum7617e051997-09-16 18:43:50 +00001092PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001093PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001094{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001095 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 PyObject *modulename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 PyObject *mydict = NULL;
1098 PyObject *bases = NULL;
1099 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001100
1101 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001103 _PyErr_SetString(tstate, PyExc_SystemError,
1104 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 return NULL;
1106 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001107 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001109 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 if (dict == NULL) {
1111 dict = mydict = PyDict_New();
1112 if (dict == NULL)
1113 goto failure;
1114 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001115
Serhiy Storchakab510e102020-10-26 12:47:57 +02001116 int r = _PyDict_ContainsId(dict, &PyId___module__);
1117 if (r < 0) {
1118 goto failure;
1119 }
1120 if (r == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 modulename = PyUnicode_FromStringAndSize(name,
1122 (Py_ssize_t)(dot-name));
1123 if (modulename == NULL)
1124 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001125 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 goto failure;
1127 }
1128 if (PyTuple_Check(base)) {
1129 bases = base;
1130 /* INCREF as we create a new ref in the else branch */
1131 Py_INCREF(bases);
1132 } else {
1133 bases = PyTuple_Pack(1, base);
1134 if (bases == NULL)
1135 goto failure;
1136 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001137 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001138 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001140 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 Py_XDECREF(bases);
1142 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 Py_XDECREF(modulename);
1144 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001145}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001146
Georg Brandl1e28a272009-12-28 08:41:01 +00001147
1148/* Create an exception with docstring */
1149PyObject *
1150PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 int result;
1154 PyObject *ret = NULL;
1155 PyObject *mydict = NULL; /* points to the dict only if we create it */
1156 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (dict == NULL) {
1159 dict = mydict = PyDict_New();
1160 if (dict == NULL) {
1161 return NULL;
1162 }
1163 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 if (doc != NULL) {
1166 docobj = PyUnicode_FromString(doc);
1167 if (docobj == NULL)
1168 goto failure;
1169 result = PyDict_SetItemString(dict, "__doc__", docobj);
1170 Py_DECREF(docobj);
1171 if (result < 0)
1172 goto failure;
1173 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001176 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 Py_XDECREF(mydict);
1178 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001179}
1180
1181
Victor Stinneref9d9b62019-05-22 11:28:22 +02001182PyDoc_STRVAR(UnraisableHookArgs__doc__,
1183"UnraisableHookArgs\n\
1184\n\
1185Type used to pass arguments to sys.unraisablehook.");
1186
1187static PyTypeObject UnraisableHookArgsType;
1188
1189static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1190 {"exc_type", "Exception type"},
1191 {"exc_value", "Exception value"},
1192 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001193 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001194 {"object", "Object causing the exception"},
1195 {0}
1196};
1197
1198static PyStructSequence_Desc UnraisableHookArgs_desc = {
1199 .name = "UnraisableHookArgs",
1200 .doc = UnraisableHookArgs__doc__,
1201 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001202 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001203};
1204
1205
Victor Stinner331a6a52019-05-27 16:39:22 +02001206PyStatus
Victor Stinner442ad742021-04-02 15:28:13 +02001207_PyErr_InitTypes(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001208{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001209 if (UnraisableHookArgsType.tp_name == NULL) {
1210 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1211 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001212 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001213 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001214 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001215 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001216}
1217
1218
1219static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001220make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001221 PyObject *exc_value, PyObject *exc_tb,
1222 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001223{
1224 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1225 if (args == NULL) {
1226 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001228
Victor Stinneref9d9b62019-05-22 11:28:22 +02001229 Py_ssize_t pos = 0;
1230#define ADD_ITEM(exc_type) \
1231 do { \
1232 if (exc_type == NULL) { \
1233 exc_type = Py_None; \
1234 } \
1235 Py_INCREF(exc_type); \
1236 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1237 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001238
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001239
Victor Stinneref9d9b62019-05-22 11:28:22 +02001240 ADD_ITEM(exc_type);
1241 ADD_ITEM(exc_value);
1242 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001243 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001244 ADD_ITEM(obj);
1245#undef ADD_ITEM
1246
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001247 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001248 Py_DECREF(args);
1249 return NULL;
1250 }
1251 return args;
1252}
1253
1254
1255
1256/* Default implementation of sys.unraisablehook.
1257
1258 It can be called to log the exception of a custom sys.unraisablehook.
1259
1260 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1261static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001262write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1263 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001264 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001265{
1266 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001267 if (err_msg != NULL && err_msg != Py_None) {
1268 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1269 return -1;
1270 }
1271 if (PyFile_WriteString(": ", file) < 0) {
1272 return -1;
1273 }
1274 }
1275 else {
1276 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1277 return -1;
1278 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001279 }
1280
1281 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001282 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001283 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1284 return -1;
1285 }
1286 }
1287 if (PyFile_WriteString("\n", file) < 0) {
1288 return -1;
1289 }
1290 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001291 else if (err_msg != NULL && err_msg != Py_None) {
1292 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1293 return -1;
1294 }
1295 if (PyFile_WriteString(":\n", file) < 0) {
1296 return -1;
1297 }
1298 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001299
1300 if (exc_tb != NULL && exc_tb != Py_None) {
1301 if (PyTraceBack_Print(exc_tb, file) < 0) {
1302 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001303 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001304 }
1305 }
1306
Victor Stinnerdf22c032019-05-23 01:00:58 +02001307 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001308 return -1;
1309 }
1310
1311 assert(PyExceptionClass_Check(exc_type));
1312 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001313 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001314 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001315 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001316 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001317 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001318 }
1319
Victor Stinneref9d9b62019-05-22 11:28:22 +02001320 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001321 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001322 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001323 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001324 if (PyFile_WriteString("<unknown>", file) < 0) {
1325 return -1;
1326 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001327 }
1328 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001329 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001330 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1331 Py_DECREF(moduleName);
1332 return -1;
1333 }
1334 Py_DECREF(moduleName);
1335 if (PyFile_WriteString(".", file) < 0) {
1336 return -1;
1337 }
1338 }
1339 else {
1340 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001341 }
1342 }
1343 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001344 if (PyFile_WriteString("<unknown>", file) < 0) {
1345 return -1;
1346 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001347 }
1348 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001349 if (PyFile_WriteString(className, file) < 0) {
1350 return -1;
1351 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001352 }
1353
Victor Stinneref9d9b62019-05-22 11:28:22 +02001354 if (exc_value && exc_value != Py_None) {
1355 if (PyFile_WriteString(": ", file) < 0) {
1356 return -1;
1357 }
1358 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001359 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001360 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1361 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001362 }
1363 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001364 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001365
Victor Stinneref9d9b62019-05-22 11:28:22 +02001366 if (PyFile_WriteString("\n", file) < 0) {
1367 return -1;
1368 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001369
1370 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001371 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001372 if (!res) {
1373 return -1;
1374 }
1375 Py_DECREF(res);
1376
Victor Stinneref9d9b62019-05-22 11:28:22 +02001377 return 0;
1378}
1379
1380
1381static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001382write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001383 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1384 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001385{
1386 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1387 if (file == NULL || file == Py_None) {
1388 return 0;
1389 }
1390
1391 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1392 while we use it */
1393 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001394 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001395 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001396 Py_DECREF(file);
1397
1398 return res;
1399}
1400
1401
1402PyObject*
1403_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1404{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001405 PyThreadState *tstate = _PyThreadState_GET();
1406
Andy Lester55728702020-03-06 16:53:17 -06001407 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001408 _PyErr_SetString(tstate, PyExc_TypeError,
1409 "sys.unraisablehook argument type "
1410 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001411 return NULL;
1412 }
1413
1414 /* Borrowed references */
1415 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1416 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1417 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001418 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1419 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001420
Victor Stinner71c52e32019-05-27 08:57:14 +02001421 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001422 return NULL;
1423 }
1424 Py_RETURN_NONE;
1425}
1426
1427
1428/* Call sys.unraisablehook().
1429
1430 This function can be used when an exception has occurred but there is no way
1431 for Python to handle it. For example, when a destructor raises an exception
1432 or during garbage collection (gc.collect()).
1433
Victor Stinner71c52e32019-05-27 08:57:14 +02001434 If err_msg_str is non-NULL, the error message is formatted as:
1435 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1436 error message.
1437
Victor Stinneref9d9b62019-05-22 11:28:22 +02001438 An exception must be set when calling this function. */
1439void
Victor Stinner71c52e32019-05-27 08:57:14 +02001440_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001441{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001442 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +02001443 _Py_EnsureTstateNotNULL(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001444
Victor Stinner71c52e32019-05-27 08:57:14 +02001445 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001446 PyObject *exc_type, *exc_value, *exc_tb;
1447 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001448
1449 assert(exc_type != NULL);
1450
1451 if (exc_type == NULL) {
1452 /* sys.unraisablehook requires that at least exc_type is set */
1453 goto default_hook;
1454 }
1455
Victor Stinnerdf22c032019-05-23 01:00:58 +02001456 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001457 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001458 if (frame != NULL) {
1459 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1460 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001461 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001462 }
1463 }
1464 }
1465
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001466 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001467
1468 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1469 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001470 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001471 }
1472 }
1473
Victor Stinner71c52e32019-05-27 08:57:14 +02001474 if (err_msg_str != NULL) {
1475 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1476 if (err_msg == NULL) {
1477 PyErr_Clear();
1478 }
1479 }
1480
Steve Dowerbea33f52019-11-28 08:46:11 -08001481 PyObject *hook_args = make_unraisable_hook_args(
1482 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1483 if (hook_args == NULL) {
1484 err_msg_str = ("Exception ignored on building "
1485 "sys.unraisablehook arguments");
1486 goto error;
1487 }
1488
Victor Stinneref9d9b62019-05-22 11:28:22 +02001489 _Py_IDENTIFIER(unraisablehook);
1490 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001491 if (hook == NULL) {
1492 Py_DECREF(hook_args);
1493 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001494 }
1495
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001496 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001497 Py_DECREF(hook_args);
1498 err_msg_str = "Exception ignored in audit hook";
1499 obj = NULL;
1500 goto error;
1501 }
1502
1503 if (hook == Py_None) {
1504 Py_DECREF(hook_args);
1505 goto default_hook;
1506 }
1507
Petr Viktorinffd97532020-02-11 17:46:57 +01001508 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001509 Py_DECREF(hook_args);
1510 if (res != NULL) {
1511 Py_DECREF(res);
1512 goto done;
1513 }
1514
1515 /* sys.unraisablehook failed: log its error using default hook */
1516 obj = hook;
1517 err_msg_str = NULL;
1518
1519error:
1520 /* err_msg_str and obj have been updated and we have a new exception */
1521 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1522 err_msg_str : "Exception ignored in sys.unraisablehook"));
1523 Py_XDECREF(exc_type);
1524 Py_XDECREF(exc_value);
1525 Py_XDECREF(exc_tb);
1526 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1527
Victor Stinneref9d9b62019-05-22 11:28:22 +02001528default_hook:
1529 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001530 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1531 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001532
1533done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001534 Py_XDECREF(exc_type);
1535 Py_XDECREF(exc_value);
1536 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001537 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001538 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001539}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001540
Victor Stinner71c52e32019-05-27 08:57:14 +02001541
1542void
1543PyErr_WriteUnraisable(PyObject *obj)
1544{
1545 _PyErr_WriteUnraisableMsg(NULL, obj);
1546}
1547
1548
Benjamin Peterson2c539712010-09-20 22:42:10 +00001549void
Victor Stinner14e461d2013-08-26 22:28:21 +02001550PyErr_SyntaxLocation(const char *filename, int lineno)
1551{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001552 PyErr_SyntaxLocationEx(filename, lineno, -1);
1553}
1554
1555
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001556/* Set file and line information for the current exception.
1557 If the exception is not a SyntaxError, also sets additional attributes
1558 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001559
Pablo Galindoa77aac42021-04-23 14:27:05 +01001560static void
1561PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset,
1562 int end_lineno, int end_col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001565 _Py_IDENTIFIER(filename);
1566 _Py_IDENTIFIER(lineno);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001567 _Py_IDENTIFIER(end_lineno);
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001568 _Py_IDENTIFIER(msg);
1569 _Py_IDENTIFIER(offset);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001570 _Py_IDENTIFIER(end_offset);
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001571 _Py_IDENTIFIER(print_file_and_line);
1572 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001573 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001576 _PyErr_Fetch(tstate, &exc, &v, &tb);
1577 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 /* XXX check that it is, indeed, a syntax error. It might not
1579 * be, though. */
1580 tmp = PyLong_FromLong(lineno);
1581 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001582 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001584 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1585 _PyErr_Clear(tstate);
1586 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 Py_DECREF(tmp);
1588 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001589 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001590 if (col_offset >= 0) {
1591 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001592 if (tmp == NULL) {
1593 _PyErr_Clear(tstate);
1594 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001595 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001596 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1597 _PyErr_Clear(tstate);
1598 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001599 Py_XDECREF(tmp);
Pablo Galindoa77aac42021-04-23 14:27:05 +01001600
1601 tmp = NULL;
1602 if (end_lineno >= 0) {
1603 tmp = PyLong_FromLong(end_lineno);
1604 if (tmp == NULL) {
1605 _PyErr_Clear(tstate);
1606 }
1607 }
1608 if (_PyObject_SetAttrId(v, &PyId_end_lineno, tmp ? tmp : Py_None)) {
1609 _PyErr_Clear(tstate);
1610 }
1611 Py_XDECREF(tmp);
1612
1613 tmp = NULL;
1614 if (end_col_offset >= 0) {
1615 tmp = PyLong_FromLong(end_col_offset);
1616 if (tmp == NULL) {
1617 _PyErr_Clear(tstate);
1618 }
1619 }
1620 if (_PyObject_SetAttrId(v, &PyId_end_offset, tmp ? tmp : Py_None)) {
1621 _PyErr_Clear(tstate);
1622 }
1623 Py_XDECREF(tmp);
1624
1625 tmp = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001627 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1628 _PyErr_Clear(tstate);
1629 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001630
Victor Stinner14e461d2013-08-26 22:28:21 +02001631 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001633 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1634 _PyErr_Clear(tstate);
1635 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 Py_DECREF(tmp);
1637 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001638 else {
1639 _PyErr_Clear(tstate);
1640 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (exc != PyExc_SyntaxError) {
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001643 if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) {
1644 _PyErr_Clear(tstate);
1645 }
1646 else if (tmp) {
1647 Py_DECREF(tmp);
1648 }
1649 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 tmp = PyObject_Str(v);
1651 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001652 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1653 _PyErr_Clear(tstate);
1654 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001656 }
1657 else {
1658 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 }
1660 }
Serhiy Storchaka98c44332020-10-10 22:23:42 +03001661 if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) {
1662 _PyErr_Clear(tstate);
1663 }
1664 else if (tmp) {
1665 Py_DECREF(tmp);
1666 }
1667 else {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001668 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001669 Py_None)) {
1670 _PyErr_Clear(tstate);
1671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 }
1673 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001674 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001675}
1676
Victor Stinner14e461d2013-08-26 22:28:21 +02001677void
Pablo Galindoa77aac42021-04-23 14:27:05 +01001678PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) {
1679 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, lineno, -1);
1680}
1681
1682void
1683PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset,
1684 int end_lineno, int end_col_offset) {
1685 PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, end_lineno, end_col_offset);
1686}
1687
1688void
Victor Stinner14e461d2013-08-26 22:28:21 +02001689PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1690{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001691 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001692 PyObject *fileobj;
1693 if (filename != NULL) {
1694 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001695 if (fileobj == NULL) {
1696 _PyErr_Clear(tstate);
1697 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001698 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001699 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001700 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001701 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001702 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1703 Py_XDECREF(fileobj);
1704}
1705
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001706/* Attempt to load the line of text that the exception refers to. If it
1707 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001708
1709 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001710 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001711
Antoine Pitrou409b5382013-10-12 22:41:17 +02001712static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001713err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 int i;
1716 char linebuf[1000];
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001717 if (fp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 return NULL;
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001719 }
1720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 for (i = 0; i < lineno; i++) {
1722 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1723 do {
1724 *pLastChar = '\0';
1725 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001726 fp, NULL) == NULL) {
1727 goto after_loop;
1728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 /* fgets read *something*; if it didn't get as
1730 far as pLastChar, it must have found a newline
1731 or hit the end of the file; if pLastChar is \n,
1732 it obviously found a newline; else we haven't
1733 yet seen a newline, so must continue */
1734 } while (*pLastChar != '\0' && *pLastChar != '\n');
1735 }
Lysandros Nikolaou113e2b02020-06-16 03:27:33 +03001736
1737after_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 fclose(fp);
1739 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001741 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001743 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 return res;
1745 }
1746 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001747}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001748
Victor Stinner14e461d2013-08-26 22:28:21 +02001749PyObject *
1750PyErr_ProgramText(const char *filename, int lineno)
1751{
Victor Stinner815506d2020-12-08 23:51:26 +01001752 if (filename == NULL) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001753 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001754 }
Victor Stinner815506d2020-12-08 23:51:26 +01001755
1756 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
1757 if (filename_obj == NULL) {
1758 PyErr_Clear();
1759 return NULL;
1760 }
1761 PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno);
1762 Py_DECREF(filename_obj);
1763 return res;
Victor Stinner14e461d2013-08-26 22:28:21 +02001764}
1765
1766PyObject *
1767PyErr_ProgramTextObject(PyObject *filename, int lineno)
1768{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001769 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001770 return NULL;
1771 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001772
1773 PyThreadState *tstate = _PyThreadState_GET();
1774 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1775 if (fp == NULL) {
1776 _PyErr_Clear(tstate);
1777 return NULL;
1778 }
1779 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001780}
1781
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782#ifdef __cplusplus
1783}
1784#endif