blob: 600300e263d09cef230985265044b414a3069fd4 [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"
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07006#include "pycore_object.h" // _PyType_GetQualName
Victor Stinner438a12d2019-05-24 17:01:38 +02007#include "pycore_pyerrors.h"
Victor Stinnere5014be2020-04-14 17:52:15 +02008#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +01009#include "pycore_sysmodule.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +020010#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000011
Guido van Rossum53e8d441995-03-09 12:11:31 +000012#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000013#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000014extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000015#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000016#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000017
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000018#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000019#include <windows.h>
20#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000021#endif
22
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000023#include <ctype.h>
24
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000025#ifdef __cplusplus
26extern "C" {
27#endif
28
Hai Shi46874c22020-01-30 17:20:25 -060029_Py_IDENTIFIER(__module__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010030_Py_IDENTIFIER(builtins);
31_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020032_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010033
Victor Stinner438a12d2019-05-24 17:01:38 +020034/* Forward declarations */
35static PyObject *
36_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
37 const char *format, va_list vargs);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020038
39
Victor Stinner438a12d2019-05-24 17:01:38 +020040void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020041_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
42 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
47 /* XXX Should never happen -- fatal error instead? */
48 /* Well, it could be None. */
49 Py_DECREF(traceback);
50 traceback = NULL;
51 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 /* Save these in locals to safeguard against recursive
54 invocation through Py_XDECREF */
55 oldtype = tstate->curexc_type;
56 oldvalue = tstate->curexc_value;
57 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 tstate->curexc_type = type;
60 tstate->curexc_value = value;
61 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_XDECREF(oldtype);
64 Py_XDECREF(oldvalue);
65 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066}
67
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020068void
69PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
70{
71 PyThreadState *tstate = _PyThreadState_GET();
72 _PyErr_Restore(tstate, type, value, traceback);
73}
74
75
Mark Shannonae3087c2017-10-22 22:41:51 +010076_PyErr_StackItem *
77_PyErr_GetTopmostException(PyThreadState *tstate)
78{
79 _PyErr_StackItem *exc_info = tstate->exc_info;
80 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
81 exc_info->previous_item != NULL)
82 {
83 exc_info = exc_info->previous_item;
84 }
85 return exc_info;
86}
87
Victor Stinner3a840972016-08-22 23:59:08 +020088static PyObject*
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070089_PyErr_CreateException(PyObject *exception_type, PyObject *value)
Victor Stinner3a840972016-08-22 23:59:08 +020090{
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070091 PyObject *exc;
92
Victor Stinner3a840972016-08-22 23:59:08 +020093 if (value == NULL || value == Py_None) {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070094 exc = _PyObject_CallNoArg(exception_type);
Victor Stinner3a840972016-08-22 23:59:08 +020095 }
96 else if (PyTuple_Check(value)) {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -070097 exc = PyObject_Call(exception_type, value, NULL);
Victor Stinner3a840972016-08-22 23:59:08 +020098 }
99 else {
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -0700100 exc = PyObject_CallOneArg(exception_type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200101 }
Miss Islington (bot)8ce7f2f2021-08-03 03:10:38 -0700102
103 if (exc != NULL && !PyExceptionInstance_Check(exc)) {
104 PyErr_Format(PyExc_TypeError,
105 "calling %R should have returned an instance of "
106 "BaseException, not %s",
107 exception_type, Py_TYPE(exc)->tp_name);
108 Py_CLEAR(exc);
109 }
110
111 return exc;
Victor Stinner3a840972016-08-22 23:59:08 +0200112}
113
Victor Stinner438a12d2019-05-24 17:01:38 +0200114void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200115_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 PyObject *exc_value;
118 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 if (exception != NULL &&
121 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200122 _PyErr_Format(tstate, PyExc_SystemError,
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200123 "_PyErr_SetObject: "
124 "exception %R is not a BaseException subclass",
Victor Stinner438a12d2019-05-24 17:01:38 +0200125 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 return;
127 }
Victor Stinner3a840972016-08-22 23:59:08 +0200128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100130 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 if (exc_value != NULL && exc_value != Py_None) {
132 /* Implicit exception chaining */
133 Py_INCREF(exc_value);
134 if (value == NULL || !PyExceptionInstance_Check(value)) {
135 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200136 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100137
Victor Stinner3a840972016-08-22 23:59:08 +0200138 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100139 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200140 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100141
Victor Stinner3a840972016-08-22 23:59:08 +0200142 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200144 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300145 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200147 }
148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 value = fixed_value;
150 }
Victor Stinner3a840972016-08-22 23:59:08 +0200151
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700152 /* Avoid creating new reference cycles through the
153 context chain, while taking care not to hang on
154 pre-existing ones.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 This is O(chain length) but context chains are
156 usually very short. Sensitive readers may try
157 to inline the call to PyException_GetContext. */
158 if (exc_value != value) {
159 PyObject *o = exc_value, *context;
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700160 PyObject *slow_o = o; /* Floyd's cycle detection algo */
161 int slow_update_toggle = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 while ((context = PyException_GetContext(o))) {
163 Py_DECREF(context);
164 if (context == value) {
165 PyException_SetContext(o, NULL);
166 break;
167 }
168 o = context;
Miss Islington (bot)d86bbe32021-08-10 06:47:23 -0700169 if (o == slow_o) {
170 /* pre-existing cycle - all exceptions on the
171 path were visited and checked. */
172 break;
173 }
174 if (slow_update_toggle) {
175 slow_o = PyException_GetContext(slow_o);
176 Py_DECREF(slow_o);
177 }
178 slow_update_toggle = !slow_update_toggle;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 }
180 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200181 }
182 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 Py_DECREF(exc_value);
184 }
185 }
186 if (value != NULL && PyExceptionInstance_Check(value))
187 tb = PyException_GetTraceback(value);
188 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200189 _PyErr_Restore(tstate, exception, value, tb);
190}
191
192void
193PyErr_SetObject(PyObject *exception, PyObject *value)
194{
195 PyThreadState *tstate = _PyThreadState_GET();
196 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
Raymond Hettinger69492da2013-09-02 15:59:26 -0700199/* Set a key error with the specified argument, wrapping it in a
200 * tuple automatically so that tuple keys are not unpacked as the
201 * exception arguments. */
202void
203_PyErr_SetKeyError(PyObject *arg)
204{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200205 PyThreadState *tstate = _PyThreadState_GET();
206 PyObject *tup = PyTuple_Pack(1, arg);
207 if (!tup) {
208 /* caller will expect error to be set anyway */
209 return;
210 }
211 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700212 Py_DECREF(tup);
213}
214
Victor Stinner438a12d2019-05-24 17:01:38 +0200215void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200216_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
217{
218 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
219}
220
221
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000223PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200225 PyThreadState *tstate = _PyThreadState_GET();
226 _PyErr_SetNone(tstate, exception);
227}
228
229
Victor Stinner438a12d2019-05-24 17:01:38 +0200230void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200231_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
232 const char *string)
233{
234 PyObject *value = PyUnicode_FromString(string);
235 _PyErr_SetObject(tstate, exception, value);
236 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
239void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000240PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200242 PyThreadState *tstate = _PyThreadState_GET();
243 _PyErr_SetString(tstate, exception, string);
244}
245
246
Victor Stinnerc6944e72016-11-11 02:13:35 +0100247PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000248PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100250 /* The caller must hold the GIL. */
251 assert(PyGILState_Check());
252
Victor Stinner50b48572018-11-01 01:51:40 +0100253 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200254 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255}
256
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000257
258int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000259PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 if (err == NULL || exc == NULL) {
262 /* maybe caused by "import exceptions" that failed early on */
263 return 0;
264 }
265 if (PyTuple_Check(exc)) {
266 Py_ssize_t i, n;
267 n = PyTuple_Size(exc);
268 for (i = 0; i < n; i++) {
269 /* Test recursively */
270 if (PyErr_GivenExceptionMatches(
271 err, PyTuple_GET_ITEM(exc, i)))
272 {
273 return 1;
274 }
275 }
276 return 0;
277 }
278 /* err might be an instance, so check its class. */
279 if (PyExceptionInstance_Check(err))
280 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200283 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000287}
Guido van Rossum743007d1999-04-21 15:27:31 +0000288
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000289
290int
Victor Stinner438a12d2019-05-24 17:01:38 +0200291_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
292{
293 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
294}
295
296
297int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000298PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000299{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200300 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200301 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000302}
303
304
xdegaye56d1f5c2017-10-26 15:09:06 +0200305#ifndef Py_NORMALIZE_RECURSION_LIMIT
306#define Py_NORMALIZE_RECURSION_LIMIT 32
307#endif
308
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000309/* Used in many places to normalize a raised exception, including in
310 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000311
312 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000314*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200315void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200316_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
317 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000318{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200319 int recursion_depth = 0;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000320 tstate->recursion_headroom++;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200321 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000322
Serhiy Storchakacf296532017-11-05 11:27:48 +0200323 restart:
324 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 if (type == NULL) {
326 /* There was no exception, so nothing to do. */
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000327 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 return;
329 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000330
Serhiy Storchakacf296532017-11-05 11:27:48 +0200331 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 /* If PyErr_SetNone() was used, the value will have been actually
333 set to NULL.
334 */
335 if (!value) {
336 value = Py_None;
337 Py_INCREF(value);
338 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 /* Normalize the exception so that if the type is a class, the
341 value will be an instance.
342 */
343 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200344 PyObject *inclass = NULL;
345 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200346
Serhiy Storchakacf296532017-11-05 11:27:48 +0200347 if (PyExceptionInstance_Check(value)) {
348 inclass = PyExceptionInstance_Class(value);
349 is_subclass = PyObject_IsSubclass(inclass, type);
350 if (is_subclass < 0) {
351 goto error;
352 }
353 }
354
355 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 whose class is (or is derived from) type, then use the
357 value as an argument to instantiation of the type
358 class.
359 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200360 if (!is_subclass) {
361 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200362 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200363 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200366 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200368 /* If the class of the instance doesn't exactly match the
369 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 */
371 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200372 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 Py_DECREF(type);
374 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 }
376 }
377 *exc = type;
378 *val = value;
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000379 tstate->recursion_headroom--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200381
382 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 Py_DECREF(type);
384 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200385 recursion_depth++;
386 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200387 _PyErr_SetString(tstate, PyExc_RecursionError,
388 "maximum recursion depth exceeded "
389 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200390 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 /* If the new exception doesn't set a traceback and the old
392 exception had a traceback, use the old traceback for the
393 new exception. It's better than nothing.
394 */
395 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200396 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200397 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (initial_tb != NULL) {
399 if (*tb == NULL)
400 *tb = initial_tb;
401 else
402 Py_DECREF(initial_tb);
403 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200404 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
405 corresponding RecursionError could not be normalized, and the
406 MemoryError raised when normalize this RecursionError could not be
407 normalized. */
408 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200409 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
410 Py_FatalError("Cannot recover from MemoryErrors "
411 "while normalizing exceptions.");
412 }
413 else {
414 Py_FatalError("Cannot recover from the recursive normalization "
415 "of an exception.");
416 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200418 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000419}
420
421
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200423PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424{
Victor Stinner50b48572018-11-01 01:51:40 +0100425 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200426 _PyErr_NormalizeException(tstate, exc, val, tb);
427}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000428
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200429
Victor Stinner438a12d2019-05-24 17:01:38 +0200430void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200431_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
432 PyObject **p_traceback)
433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 *p_type = tstate->curexc_type;
435 *p_value = tstate->curexc_value;
436 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 tstate->curexc_type = NULL;
439 tstate->curexc_value = NULL;
440 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441}
442
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200443
444void
445PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
446{
447 PyThreadState *tstate = _PyThreadState_GET();
448 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
449}
450
451
Victor Stinner438a12d2019-05-24 17:01:38 +0200452void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200453_PyErr_Clear(PyThreadState *tstate)
454{
455 _PyErr_Restore(tstate, NULL, NULL, NULL);
456}
457
458
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000460PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200462 PyThreadState *tstate = _PyThreadState_GET();
463 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000465
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200466
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200467void
Julien Danjou3430c552020-01-13 17:30:14 +0100468_PyErr_GetExcInfo(PyThreadState *tstate,
469 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200470{
Mark Shannonae3087c2017-10-22 22:41:51 +0100471 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
472 *p_type = exc_info->exc_type;
473 *p_value = exc_info->exc_value;
474 *p_traceback = exc_info->exc_traceback;
475
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200476 Py_XINCREF(*p_type);
477 Py_XINCREF(*p_value);
478 Py_XINCREF(*p_traceback);
479}
480
Julien Danjou3430c552020-01-13 17:30:14 +0100481
482void
483PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
484{
485 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100486 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100487}
488
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200489void
490PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
491{
492 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100493 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200494
Mark Shannonae3087c2017-10-22 22:41:51 +0100495 oldtype = tstate->exc_info->exc_type;
496 oldvalue = tstate->exc_info->exc_value;
497 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200498
Mark Shannonae3087c2017-10-22 22:41:51 +0100499 tstate->exc_info->exc_type = p_type;
500 tstate->exc_info->exc_value = p_value;
501 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200502
503 Py_XDECREF(oldtype);
504 Py_XDECREF(oldvalue);
505 Py_XDECREF(oldtraceback);
506}
507
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300508/* Like PyErr_Restore(), but if an exception is already set,
509 set the context associated with it.
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700510
511 The caller is responsible for ensuring that this call won't create
512 any cycles in the exception context chain. */
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300513void
514_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
515{
516 if (exc == NULL)
517 return;
518
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200519 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200520
521 if (!PyExceptionClass_Check(exc)) {
522 _PyErr_Format(tstate, PyExc_SystemError,
523 "_PyErr_ChainExceptions: "
524 "exception %R is not a BaseException subclass",
525 exc);
526 return;
527 }
528
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200529 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300530 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200531 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
532 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300533 if (tb != NULL) {
534 PyException_SetTraceback(val, tb);
535 Py_DECREF(tb);
536 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300537 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200538 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300539 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200540 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300541 }
542 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200543 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300544 }
545}
546
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700547/* Set the currently set exception's context to the given exception.
548
549 If the provided exc_info is NULL, then the current Python thread state's
550 exc_info will be used for the context instead.
551
552 This function can only be called when _PyErr_Occurred() is true.
553 Also, this function won't create any cycles in the exception context
554 chain to the extent that _PyErr_SetObject ensures this. */
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700555void
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700556_PyErr_ChainStackItem(_PyErr_StackItem *exc_info)
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700557{
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700558 PyThreadState *tstate = _PyThreadState_GET();
559 assert(_PyErr_Occurred(tstate));
560
561 int exc_info_given;
562 if (exc_info == NULL) {
563 exc_info_given = 0;
564 exc_info = tstate->exc_info;
565 } else {
566 exc_info_given = 1;
567 }
568 if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) {
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700569 return;
570 }
Chris Jerdonek7c30d122020-05-22 13:33:27 -0700571
572 _PyErr_StackItem *saved_exc_info;
573 if (exc_info_given) {
574 /* Temporarily set the thread state's exc_info since this is what
575 _PyErr_SetObject uses for implicit exception chaining. */
576 saved_exc_info = tstate->exc_info;
577 tstate->exc_info = exc_info;
578 }
579
580 PyObject *exc, *val, *tb;
581 _PyErr_Fetch(tstate, &exc, &val, &tb);
582
583 PyObject *exc2, *val2, *tb2;
584 exc2 = exc_info->exc_type;
585 val2 = exc_info->exc_value;
586 tb2 = exc_info->exc_traceback;
587 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
588 if (tb2 != NULL) {
589 PyException_SetTraceback(val2, tb2);
590 }
591
592 /* _PyErr_SetObject sets the context from PyThreadState. */
593 _PyErr_SetObject(tstate, exc, val);
594 Py_DECREF(exc); // since _PyErr_Occurred was true
595 Py_XDECREF(val);
596 Py_XDECREF(tb);
597
598 if (exc_info_given) {
599 tstate->exc_info = saved_exc_info;
600 }
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700601}
602
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300603static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200604_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
605 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300606{
607 PyObject *exc, *val, *val2, *tb;
608
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200609 assert(_PyErr_Occurred(tstate));
610 _PyErr_Fetch(tstate, &exc, &val, &tb);
611 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300612 if (tb != NULL) {
613 PyException_SetTraceback(val, tb);
614 Py_DECREF(tb);
615 }
616 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200617 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300618
Victor Stinner438a12d2019-05-24 17:01:38 +0200619 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300620
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200621 _PyErr_Fetch(tstate, &exc, &val2, &tb);
622 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300623 Py_INCREF(val);
624 PyException_SetCause(val2, val);
625 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200626 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300627
628 return NULL;
629}
630
631PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100632_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
633 const char *format, ...)
634{
635 va_list vargs;
636#ifdef HAVE_STDARG_PROTOTYPES
637 va_start(vargs, format);
638#else
639 va_start(vargs);
640#endif
641 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
642 va_end(vargs);
643 return NULL;
644}
645
646PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300647_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
648{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200649 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300650 va_list vargs;
651#ifdef HAVE_STDARG_PROTOTYPES
652 va_start(vargs, format);
653#else
654 va_start(vargs);
655#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200656 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300657 va_end(vargs);
658 return NULL;
659}
660
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000661/* Convenience functions to set a type error exception and return 0 */
662
663int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000665{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200666 PyThreadState *tstate = _PyThreadState_GET();
667 _PyErr_SetString(tstate, PyExc_TypeError,
668 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000670}
671
Guido van Rossum373c8691997-04-29 18:22:47 +0000672PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200673_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000674{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600675 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200676 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
677 initialized by _PyExc_Init() */
678 Py_FatalError("Out of memory and PyExc_MemoryError is not "
679 "initialized yet");
680 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200681 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000683}
684
Guido van Rossum373c8691997-04-29 18:22:47 +0000685PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200686PyErr_NoMemory(void)
687{
688 PyThreadState *tstate = _PyThreadState_GET();
689 return _PyErr_NoMemory(tstate);
690}
691
692PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000693PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000694{
Larry Hastingsb0827312014-02-09 22:05:19 -0800695 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
696}
697
698PyObject *
699PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
700{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200701 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200703 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100705#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000707#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000708
Guido van Rossume9fbc091995-02-18 14:52:19 +0000709#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (i == EINTR && PyErr_CheckSignals())
711 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000712#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000713
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000714#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100715 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600716 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100717 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100718 }
719 else {
720 /* Sometimes errno didn't get set */
721 message = PyUnicode_FromString("Error");
722 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000723#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 if (i == 0)
725 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
726 else
727 {
728 /* Note that the Win32 errors do not lineup with the
729 errno error. So if the error is in the MSVC error
730 table, we use it, otherwise we assume it really _is_
731 a Win32 error code
732 */
733 if (i > 0 && i < _sys_nerr) {
734 message = PyUnicode_FromString(_sys_errlist[i]);
735 }
736 else {
737 int len = FormatMessageW(
738 FORMAT_MESSAGE_ALLOCATE_BUFFER |
739 FORMAT_MESSAGE_FROM_SYSTEM |
740 FORMAT_MESSAGE_IGNORE_INSERTS,
741 NULL, /* no message source */
742 i,
743 MAKELANGID(LANG_NEUTRAL,
744 SUBLANG_DEFAULT),
745 /* Default language */
746 (LPWSTR) &s_buf,
747 0, /* size not used */
748 NULL); /* no args */
749 if (len==0) {
750 /* Only ever seen this in out-of-mem
751 situations */
752 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300753 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 } else {
755 /* remove trailing cr/lf and dots */
756 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
757 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200758 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 }
760 }
761 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000762#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 if (message == NULL)
765 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000766#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 return NULL;
770 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000771
Larry Hastingsb0827312014-02-09 22:05:19 -0800772 if (filenameObject != NULL) {
773 if (filenameObject2 != NULL)
774 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
775 else
776 args = Py_BuildValue("(iOO)", i, message, filenameObject);
777 } else {
778 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200779 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800780 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000782
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200783 if (args != NULL) {
784 v = PyObject_Call(exc, args, NULL);
785 Py_DECREF(args);
786 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200787 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200788 Py_DECREF(v);
789 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000791#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000795}
Guido van Rossum743007d1999-04-21 15:27:31 +0000796
Barry Warsaw97d95151998-07-23 16:05:56 +0000797PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000798PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800801 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 Py_XDECREF(name);
803 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000804}
805
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000806#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000807PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000808PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000809{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200810 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800811 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 Py_XDECREF(name);
813 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000814}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000815#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000816
817PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000818PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000819{
Larry Hastingsb0827312014-02-09 22:05:19 -0800820 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000821}
Guido van Rossum683a0721990-10-21 22:09:12 +0000822
Brett Cannonbf364092006-03-01 04:25:17 +0000823#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000824/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000825PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 PyObject *exc,
827 int ierr,
828 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000829{
Larry Hastingsb0827312014-02-09 22:05:19 -0800830 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
831 filenameObject, NULL);
832}
833
834PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
835 PyObject *exc,
836 int ierr,
837 PyObject *filenameObject,
838 PyObject *filenameObject2)
839{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200840 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 int len;
842 WCHAR *s_buf = NULL; /* Free via LocalFree */
843 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200844 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200847 if (err==0) {
848 err = GetLastError();
849 }
850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 len = FormatMessageW(
852 /* Error API error */
853 FORMAT_MESSAGE_ALLOCATE_BUFFER |
854 FORMAT_MESSAGE_FROM_SYSTEM |
855 FORMAT_MESSAGE_IGNORE_INSERTS,
856 NULL, /* no message source */
857 err,
858 MAKELANGID(LANG_NEUTRAL,
859 SUBLANG_DEFAULT), /* Default language */
860 (LPWSTR) &s_buf,
861 0, /* size not used */
862 NULL); /* no args */
863 if (len==0) {
864 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300865 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 s_buf = NULL;
867 } else {
868 /* remove trailing cr/lf and dots */
869 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
870 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200871 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 if (message == NULL)
875 {
876 LocalFree(s_buf);
877 return NULL;
878 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000879
Larry Hastingsb0827312014-02-09 22:05:19 -0800880 if (filenameObject == NULL) {
881 assert(filenameObject2 == NULL);
882 filenameObject = filenameObject2 = Py_None;
883 }
884 else if (filenameObject2 == NULL)
885 filenameObject2 = Py_None;
886 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200887 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800888 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000890
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200891 if (args != NULL) {
892 v = PyObject_Call(exc, args, NULL);
893 Py_DECREF(args);
894 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200895 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200896 Py_DECREF(v);
897 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 }
899 LocalFree(s_buf);
900 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000901}
902
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000903PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 PyObject *exc,
905 int ierr,
906 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000907{
Victor Stinner92be9392010-12-28 00:28:21 +0000908 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800909 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800911 name,
912 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 Py_XDECREF(name);
914 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000915}
916
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000917PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 PyObject *exc,
919 int ierr,
920 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000921{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200922 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800923 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800925 name,
926 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 Py_XDECREF(name);
928 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000929}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000930
Thomas Heller085358a2002-07-29 14:27:41 +0000931PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
932{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800933 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000934}
935
Guido van Rossum795e1892000-02-17 15:19:15 +0000936PyObject *PyErr_SetFromWindowsErr(int ierr)
937{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800938 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
939 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800940}
941
Thomas Heller085358a2002-07-29 14:27:41 +0000942PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 int ierr,
944 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000945{
Victor Stinner92be9392010-12-28 00:28:21 +0000946 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800947 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200948 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800949 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 Py_XDECREF(name);
951 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000952}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000953
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000954PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 int ierr,
956 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000957{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200958 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800959 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200960 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800961 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 Py_XDECREF(name);
963 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000964}
Guido van Rossum795e1892000-02-17 15:19:15 +0000965#endif /* MS_WINDOWS */
966
Brett Cannon79ec55e2012-04-12 20:24:54 -0400967PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700968PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
969 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400970{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200971 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700972 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200973 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500974
Eric Snow46f97b82016-09-07 16:56:15 -0700975 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
976 if (issubclass < 0) {
977 return NULL;
978 }
979 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200980 _PyErr_SetString(tstate, PyExc_TypeError,
981 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500982 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200983 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500984
Eric Snow46f97b82016-09-07 16:56:15 -0700985 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200986 _PyErr_SetString(tstate, PyExc_TypeError,
987 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500988 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400989 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500990
Brian Curtin94c001b2012-04-18 08:30:51 -0500991 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500992 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500993 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500994 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500995 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500996 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500997
Eric Snow46f97b82016-09-07 16:56:15 -0700998 kwargs = PyDict_New();
999 if (kwargs == NULL) {
1000 return NULL;
1001 }
Victor Stinnerf45a5612016-08-23 00:04:41 +02001002 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +03001003 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +02001004 }
1005 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +03001006 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +02001007 }
Brett Cannon79ec55e2012-04-12 20:24:54 -04001008
Petr Viktorinffd97532020-02-11 17:46:57 +01001009 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -04001010 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001011 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -05001012 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -04001013 }
1014
Berker Peksagec766d32016-05-01 09:06:36 +03001015done:
Brett Cannon79ec55e2012-04-12 20:24:54 -04001016 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -05001017 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -04001018}
1019
Eric Snow46f97b82016-09-07 16:56:15 -07001020PyObject *
1021PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
1022{
1023 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
1024}
1025
Guido van Rossum683a0721990-10-21 22:09:12 +00001026void
Neal Norwitzb382b842007-08-24 20:00:37 +00001027_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +00001028{
Victor Stinner438a12d2019-05-24 17:01:38 +02001029 PyThreadState *tstate = _PyThreadState_GET();
1030 _PyErr_Format(tstate, PyExc_SystemError,
1031 "%s:%d: bad argument to internal function",
1032 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +00001033}
1034
1035/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
1036 export the entry point for existing object code: */
1037#undef PyErr_BadInternalCall
1038void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001039PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +00001040{
Victor Stinnerfb3a6302013-07-12 00:37:30 +02001041 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +02001042 PyThreadState *tstate = _PyThreadState_GET();
1043 _PyErr_SetString(tstate, PyExc_SystemError,
1044 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +00001045}
Fred Drake6d63adf2000-08-24 22:38:39 +00001046#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
1047
Guido van Rossum1548bac1997-02-14 17:09:47 +00001048
Victor Stinner438a12d2019-05-24 17:01:38 +02001049static PyObject *
1050_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
1051 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +00001052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001054
Victor Stinnerde821be2015-03-24 12:41:23 +01001055 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
1056 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001057 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +02001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +01001060
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001061 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +00001064}
Guido van Rossum7617e051997-09-16 18:43:50 +00001065
1066
Antoine Pitrou0676a402014-09-30 21:16:27 +02001067PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02001068PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
1069{
1070 PyThreadState *tstate = _PyThreadState_GET();
1071 return _PyErr_FormatV(tstate, exception, format, vargs);
1072}
1073
1074
1075PyObject *
1076_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1077 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001078{
1079 va_list vargs;
1080#ifdef HAVE_STDARG_PROTOTYPES
1081 va_start(vargs, format);
1082#else
1083 va_start(vargs);
1084#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001085 _PyErr_FormatV(tstate, exception, format, vargs);
1086 va_end(vargs);
1087 return NULL;
1088}
1089
1090
1091PyObject *
1092PyErr_Format(PyObject *exception, const char *format, ...)
1093{
1094 PyThreadState *tstate = _PyThreadState_GET();
1095 va_list vargs;
1096#ifdef HAVE_STDARG_PROTOTYPES
1097 va_start(vargs, format);
1098#else
1099 va_start(vargs);
1100#endif
1101 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001102 va_end(vargs);
1103 return NULL;
1104}
1105
Thomas Wouters477c8d52006-05-27 19:21:47 +00001106
Guido van Rossum7617e051997-09-16 18:43:50 +00001107PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001108PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001109{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001110 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 PyObject *modulename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 PyObject *mydict = NULL;
1113 PyObject *bases = NULL;
1114 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001115
1116 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001118 _PyErr_SetString(tstate, PyExc_SystemError,
1119 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 return NULL;
1121 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001122 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001124 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 if (dict == NULL) {
1126 dict = mydict = PyDict_New();
1127 if (dict == NULL)
1128 goto failure;
1129 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001130
Serhiy Storchakab510e102020-10-26 12:47:57 +02001131 int r = _PyDict_ContainsId(dict, &PyId___module__);
1132 if (r < 0) {
1133 goto failure;
1134 }
1135 if (r == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 modulename = PyUnicode_FromStringAndSize(name,
1137 (Py_ssize_t)(dot-name));
1138 if (modulename == NULL)
1139 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001140 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 goto failure;
1142 }
1143 if (PyTuple_Check(base)) {
1144 bases = base;
1145 /* INCREF as we create a new ref in the else branch */
1146 Py_INCREF(bases);
1147 } else {
1148 bases = PyTuple_Pack(1, base);
1149 if (bases == NULL)
1150 goto failure;
1151 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001152 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001153 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001155 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 Py_XDECREF(bases);
1157 Py_XDECREF(mydict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 Py_XDECREF(modulename);
1159 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001160}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001161
Georg Brandl1e28a272009-12-28 08:41:01 +00001162
1163/* Create an exception with docstring */
1164PyObject *
1165PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 int result;
1169 PyObject *ret = NULL;
1170 PyObject *mydict = NULL; /* points to the dict only if we create it */
1171 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 if (dict == NULL) {
1174 dict = mydict = PyDict_New();
1175 if (dict == NULL) {
1176 return NULL;
1177 }
1178 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 if (doc != NULL) {
1181 docobj = PyUnicode_FromString(doc);
1182 if (docobj == NULL)
1183 goto failure;
1184 result = PyDict_SetItemString(dict, "__doc__", docobj);
1185 Py_DECREF(docobj);
1186 if (result < 0)
1187 goto failure;
1188 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001191 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 Py_XDECREF(mydict);
1193 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001194}
1195
1196
Victor Stinneref9d9b62019-05-22 11:28:22 +02001197PyDoc_STRVAR(UnraisableHookArgs__doc__,
1198"UnraisableHookArgs\n\
1199\n\
1200Type used to pass arguments to sys.unraisablehook.");
1201
1202static PyTypeObject UnraisableHookArgsType;
1203
1204static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1205 {"exc_type", "Exception type"},
1206 {"exc_value", "Exception value"},
1207 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001208 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001209 {"object", "Object causing the exception"},
1210 {0}
1211};
1212
1213static PyStructSequence_Desc UnraisableHookArgs_desc = {
1214 .name = "UnraisableHookArgs",
1215 .doc = UnraisableHookArgs__doc__,
1216 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001217 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001218};
1219
1220
Victor Stinner331a6a52019-05-27 16:39:22 +02001221PyStatus
Victor Stinner442ad742021-04-02 15:28:13 +02001222_PyErr_InitTypes(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001223{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001224 if (UnraisableHookArgsType.tp_name == NULL) {
1225 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1226 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001227 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001228 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001229 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001230 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001231}
1232
1233
1234static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001235make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001236 PyObject *exc_value, PyObject *exc_tb,
1237 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001238{
1239 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1240 if (args == NULL) {
1241 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001243
Victor Stinneref9d9b62019-05-22 11:28:22 +02001244 Py_ssize_t pos = 0;
1245#define ADD_ITEM(exc_type) \
1246 do { \
1247 if (exc_type == NULL) { \
1248 exc_type = Py_None; \
1249 } \
1250 Py_INCREF(exc_type); \
1251 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1252 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001253
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001254
Victor Stinneref9d9b62019-05-22 11:28:22 +02001255 ADD_ITEM(exc_type);
1256 ADD_ITEM(exc_value);
1257 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001258 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001259 ADD_ITEM(obj);
1260#undef ADD_ITEM
1261
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001262 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001263 Py_DECREF(args);
1264 return NULL;
1265 }
1266 return args;
1267}
1268
1269
1270
1271/* Default implementation of sys.unraisablehook.
1272
1273 It can be called to log the exception of a custom sys.unraisablehook.
1274
1275 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1276static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001277write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1278 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001279 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001280{
1281 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001282 if (err_msg != NULL && err_msg != Py_None) {
1283 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1284 return -1;
1285 }
1286 if (PyFile_WriteString(": ", file) < 0) {
1287 return -1;
1288 }
1289 }
1290 else {
1291 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1292 return -1;
1293 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001294 }
1295
1296 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001297 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001298 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1299 return -1;
1300 }
1301 }
1302 if (PyFile_WriteString("\n", file) < 0) {
1303 return -1;
1304 }
1305 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001306 else if (err_msg != NULL && err_msg != Py_None) {
1307 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1308 return -1;
1309 }
1310 if (PyFile_WriteString(":\n", file) < 0) {
1311 return -1;
1312 }
1313 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001314
1315 if (exc_tb != NULL && exc_tb != Py_None) {
1316 if (PyTraceBack_Print(exc_tb, file) < 0) {
1317 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001318 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001319 }
1320 }
1321
Victor Stinnerdf22c032019-05-23 01:00:58 +02001322 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001323 return -1;
1324 }
1325
1326 assert(PyExceptionClass_Check(exc_type));
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001327
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001328 PyObject *modulename = _PyObject_GetAttrId(exc_type, &PyId___module__);
1329 if (modulename == NULL || !PyUnicode_Check(modulename)) {
1330 Py_XDECREF(modulename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001331 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001332 if (PyFile_WriteString("<unknown>", file) < 0) {
1333 return -1;
1334 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001335 }
1336 else {
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001337 if (!_PyUnicode_EqualToASCIIId(modulename, &PyId_builtins)) {
1338 if (PyFile_WriteObject(modulename, file, Py_PRINT_RAW) < 0) {
1339 Py_DECREF(modulename);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001340 return -1;
1341 }
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001342 Py_DECREF(modulename);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001343 if (PyFile_WriteString(".", file) < 0) {
1344 return -1;
1345 }
1346 }
1347 else {
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001348 Py_DECREF(modulename);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001349 }
1350 }
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001351
1352 PyObject *qualname = _PyType_GetQualName((PyTypeObject *)exc_type);
1353 if (qualname == NULL || !PyUnicode_Check(qualname)) {
1354 Py_XDECREF(qualname);
1355 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001356 if (PyFile_WriteString("<unknown>", file) < 0) {
1357 return -1;
1358 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001359 }
1360 else {
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001361 if (PyFile_WriteObject(qualname, file, Py_PRINT_RAW) < 0) {
1362 Py_DECREF(qualname);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001363 return -1;
1364 }
Miss Islington (bot)6b996d62021-09-08 09:32:19 -07001365 Py_DECREF(qualname);
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