blob: 3b42c1120b8d0b63d5ba147710e9fde9dc1b0218 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum373c8691997-04-29 18:22:47 +00002/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossum373c8691997-04-29 18:22:47 +00004#include "Python.h"
Victor Stinner331a6a52019-05-27 16:39:22 +02005#include "pycore_initconfig.h"
Victor Stinner438a12d2019-05-24 17:01:38 +02006#include "pycore_pyerrors.h"
Victor Stinnere5014be2020-04-14 17:52:15 +02007#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +01008#include "pycore_sysmodule.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +02009#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +000010
Guido van Rossum53e8d441995-03-09 12:11:31 +000011#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000012#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000013extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000014#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000015#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000016
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000017#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000018#include <windows.h>
19#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000020#endif
21
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000022#include <ctype.h>
23
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024#ifdef __cplusplus
25extern "C" {
26#endif
27
Hai Shi46874c22020-01-30 17:20:25 -060028_Py_IDENTIFIER(__module__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010029_Py_IDENTIFIER(builtins);
30_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020031_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010032
Victor Stinner438a12d2019-05-24 17:01:38 +020033/* Forward declarations */
34static PyObject *
35_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
36 const char *format, va_list vargs);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020037
38
Victor Stinner438a12d2019-05-24 17:01:38 +020039void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020040_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
41 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
46 /* XXX Should never happen -- fatal error instead? */
47 /* Well, it could be None. */
48 Py_DECREF(traceback);
49 traceback = NULL;
50 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 /* Save these in locals to safeguard against recursive
53 invocation through Py_XDECREF */
54 oldtype = tstate->curexc_type;
55 oldvalue = tstate->curexc_value;
56 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 tstate->curexc_type = type;
59 tstate->curexc_value = value;
60 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 Py_XDECREF(oldtype);
63 Py_XDECREF(oldvalue);
64 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065}
66
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020067void
68PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
69{
70 PyThreadState *tstate = _PyThreadState_GET();
71 _PyErr_Restore(tstate, type, value, traceback);
72}
73
74
Mark Shannonae3087c2017-10-22 22:41:51 +010075_PyErr_StackItem *
76_PyErr_GetTopmostException(PyThreadState *tstate)
77{
78 _PyErr_StackItem *exc_info = tstate->exc_info;
79 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
80 exc_info->previous_item != NULL)
81 {
82 exc_info = exc_info->previous_item;
83 }
84 return exc_info;
85}
86
Victor Stinner3a840972016-08-22 23:59:08 +020087static PyObject*
88_PyErr_CreateException(PyObject *exception, PyObject *value)
89{
90 if (value == NULL || value == Py_None) {
91 return _PyObject_CallNoArg(exception);
92 }
93 else if (PyTuple_Check(value)) {
94 return PyObject_Call(exception, value, NULL);
95 }
96 else {
Petr Viktorinffd97532020-02-11 17:46:57 +010097 return PyObject_CallOneArg(exception, value);
Victor Stinner3a840972016-08-22 23:59:08 +020098 }
99}
100
Victor Stinner438a12d2019-05-24 17:01:38 +0200101void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200102_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PyObject *exc_value;
105 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (exception != NULL &&
108 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200109 _PyErr_Format(tstate, PyExc_SystemError,
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200110 "_PyErr_SetObject: "
111 "exception %R is not a BaseException subclass",
Victor Stinner438a12d2019-05-24 17:01:38 +0200112 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 return;
114 }
Victor Stinner3a840972016-08-22 23:59:08 +0200115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100117 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 if (exc_value != NULL && exc_value != Py_None) {
119 /* Implicit exception chaining */
120 Py_INCREF(exc_value);
121 if (value == NULL || !PyExceptionInstance_Check(value)) {
122 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200123 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100124
Victor Stinner3a840972016-08-22 23:59:08 +0200125 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100126 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200127 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100128
Victor Stinner3a840972016-08-22 23:59:08 +0200129 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200131 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300132 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200134 }
135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 value = fixed_value;
137 }
Victor Stinner3a840972016-08-22 23:59:08 +0200138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* Avoid reference cycles through the context chain.
140 This is O(chain length) but context chains are
141 usually very short. Sensitive readers may try
142 to inline the call to PyException_GetContext. */
143 if (exc_value != value) {
144 PyObject *o = exc_value, *context;
145 while ((context = PyException_GetContext(o))) {
146 Py_DECREF(context);
147 if (context == value) {
148 PyException_SetContext(o, NULL);
149 break;
150 }
151 o = context;
152 }
153 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200154 }
155 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 Py_DECREF(exc_value);
157 }
158 }
159 if (value != NULL && PyExceptionInstance_Check(value))
160 tb = PyException_GetTraceback(value);
161 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200162 _PyErr_Restore(tstate, exception, value, tb);
163}
164
165void
166PyErr_SetObject(PyObject *exception, PyObject *value)
167{
168 PyThreadState *tstate = _PyThreadState_GET();
169 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Raymond Hettinger69492da2013-09-02 15:59:26 -0700172/* Set a key error with the specified argument, wrapping it in a
173 * tuple automatically so that tuple keys are not unpacked as the
174 * exception arguments. */
175void
176_PyErr_SetKeyError(PyObject *arg)
177{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200178 PyThreadState *tstate = _PyThreadState_GET();
179 PyObject *tup = PyTuple_Pack(1, arg);
180 if (!tup) {
181 /* caller will expect error to be set anyway */
182 return;
183 }
184 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700185 Py_DECREF(tup);
186}
187
Victor Stinner438a12d2019-05-24 17:01:38 +0200188void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200189_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
190{
191 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
192}
193
194
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000196PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200198 PyThreadState *tstate = _PyThreadState_GET();
199 _PyErr_SetNone(tstate, exception);
200}
201
202
Victor Stinner438a12d2019-05-24 17:01:38 +0200203void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200204_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
205 const char *string)
206{
207 PyObject *value = PyUnicode_FromString(string);
208 _PyErr_SetObject(tstate, exception, value);
209 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210}
211
212void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000213PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200215 PyThreadState *tstate = _PyThreadState_GET();
216 _PyErr_SetString(tstate, exception, string);
217}
218
219
Victor Stinnerc6944e72016-11-11 02:13:35 +0100220PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100223 /* The caller must hold the GIL. */
224 assert(PyGILState_Check());
225
Victor Stinner50b48572018-11-01 01:51:40 +0100226 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200227 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228}
229
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000230
231int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000232PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (err == NULL || exc == NULL) {
235 /* maybe caused by "import exceptions" that failed early on */
236 return 0;
237 }
238 if (PyTuple_Check(exc)) {
239 Py_ssize_t i, n;
240 n = PyTuple_Size(exc);
241 for (i = 0; i < n; i++) {
242 /* Test recursively */
243 if (PyErr_GivenExceptionMatches(
244 err, PyTuple_GET_ITEM(exc, i)))
245 {
246 return 1;
247 }
248 }
249 return 0;
250 }
251 /* err might be an instance, so check its class. */
252 if (PyExceptionInstance_Check(err))
253 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200256 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260}
Guido van Rossum743007d1999-04-21 15:27:31 +0000261
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000262
263int
Victor Stinner438a12d2019-05-24 17:01:38 +0200264_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
265{
266 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
267}
268
269
270int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000272{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200273 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200274 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000275}
276
277
xdegaye56d1f5c2017-10-26 15:09:06 +0200278#ifndef Py_NORMALIZE_RECURSION_LIMIT
279#define Py_NORMALIZE_RECURSION_LIMIT 32
280#endif
281
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000282/* Used in many places to normalize a raised exception, including in
283 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000284
285 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000287*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200288void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200289_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
290 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000291{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200292 int recursion_depth = 0;
293 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000294
Serhiy Storchakacf296532017-11-05 11:27:48 +0200295 restart:
296 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 if (type == NULL) {
298 /* There was no exception, so nothing to do. */
299 return;
300 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000301
Serhiy Storchakacf296532017-11-05 11:27:48 +0200302 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 /* If PyErr_SetNone() was used, the value will have been actually
304 set to NULL.
305 */
306 if (!value) {
307 value = Py_None;
308 Py_INCREF(value);
309 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 /* Normalize the exception so that if the type is a class, the
312 value will be an instance.
313 */
314 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200315 PyObject *inclass = NULL;
316 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200317
Serhiy Storchakacf296532017-11-05 11:27:48 +0200318 if (PyExceptionInstance_Check(value)) {
319 inclass = PyExceptionInstance_Class(value);
320 is_subclass = PyObject_IsSubclass(inclass, type);
321 if (is_subclass < 0) {
322 goto error;
323 }
324 }
325
326 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 whose class is (or is derived from) type, then use the
328 value as an argument to instantiation of the type
329 class.
330 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200331 if (!is_subclass) {
332 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200333 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200334 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200337 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200339 /* If the class of the instance doesn't exactly match the
340 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 */
342 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200343 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 Py_DECREF(type);
345 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 }
347 }
348 *exc = type;
349 *val = value;
350 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200351
352 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 Py_DECREF(type);
354 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200355 recursion_depth++;
356 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200357 _PyErr_SetString(tstate, PyExc_RecursionError,
358 "maximum recursion depth exceeded "
359 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200360 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 /* If the new exception doesn't set a traceback and the old
362 exception had a traceback, use the old traceback for the
363 new exception. It's better than nothing.
364 */
365 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200366 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200367 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (initial_tb != NULL) {
369 if (*tb == NULL)
370 *tb = initial_tb;
371 else
372 Py_DECREF(initial_tb);
373 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200374 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
375 corresponding RecursionError could not be normalized, and the
376 MemoryError raised when normalize this RecursionError could not be
377 normalized. */
378 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200379 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
380 Py_FatalError("Cannot recover from MemoryErrors "
381 "while normalizing exceptions.");
382 }
383 else {
384 Py_FatalError("Cannot recover from the recursive normalization "
385 "of an exception.");
386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200388 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000389}
390
391
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200393PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394{
Victor Stinner50b48572018-11-01 01:51:40 +0100395 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200396 _PyErr_NormalizeException(tstate, exc, val, tb);
397}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000398
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200399
Victor Stinner438a12d2019-05-24 17:01:38 +0200400void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200401_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
402 PyObject **p_traceback)
403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 *p_type = tstate->curexc_type;
405 *p_value = tstate->curexc_value;
406 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 tstate->curexc_type = NULL;
409 tstate->curexc_value = NULL;
410 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411}
412
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200413
414void
415PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
416{
417 PyThreadState *tstate = _PyThreadState_GET();
418 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
419}
420
421
Victor Stinner438a12d2019-05-24 17:01:38 +0200422void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200423_PyErr_Clear(PyThreadState *tstate)
424{
425 _PyErr_Restore(tstate, NULL, NULL, NULL);
426}
427
428
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200432 PyThreadState *tstate = _PyThreadState_GET();
433 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000435
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200436
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200437void
Julien Danjou3430c552020-01-13 17:30:14 +0100438_PyErr_GetExcInfo(PyThreadState *tstate,
439 PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200440{
Mark Shannonae3087c2017-10-22 22:41:51 +0100441 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
442 *p_type = exc_info->exc_type;
443 *p_value = exc_info->exc_value;
444 *p_traceback = exc_info->exc_traceback;
445
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200446 Py_XINCREF(*p_type);
447 Py_XINCREF(*p_value);
448 Py_XINCREF(*p_traceback);
449}
450
Julien Danjou3430c552020-01-13 17:30:14 +0100451
452void
453PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
454{
455 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3f12ac12020-01-15 11:23:25 +0100456 _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
Julien Danjou3430c552020-01-13 17:30:14 +0100457}
458
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200459void
460PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
461{
462 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100463 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200464
Mark Shannonae3087c2017-10-22 22:41:51 +0100465 oldtype = tstate->exc_info->exc_type;
466 oldvalue = tstate->exc_info->exc_value;
467 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200468
Mark Shannonae3087c2017-10-22 22:41:51 +0100469 tstate->exc_info->exc_type = p_type;
470 tstate->exc_info->exc_value = p_value;
471 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200472
473 Py_XDECREF(oldtype);
474 Py_XDECREF(oldvalue);
475 Py_XDECREF(oldtraceback);
476}
477
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300478/* Like PyErr_Restore(), but if an exception is already set,
479 set the context associated with it.
480 */
481void
482_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
483{
484 if (exc == NULL)
485 return;
486
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200487 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200488
489 if (!PyExceptionClass_Check(exc)) {
490 _PyErr_Format(tstate, PyExc_SystemError,
491 "_PyErr_ChainExceptions: "
492 "exception %R is not a BaseException subclass",
493 exc);
494 return;
495 }
496
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200497 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300498 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200499 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
500 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300501 if (tb != NULL) {
502 PyException_SetTraceback(val, tb);
503 Py_DECREF(tb);
504 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300505 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200506 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300507 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200508 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300509 }
510 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200511 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300512 }
513}
514
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700515void
516_PyErr_ChainStackItem(_PyErr_StackItem *exc_state)
517{
518 if (exc_state->exc_type == NULL || exc_state->exc_type == Py_None) {
519 return;
520 }
521 Py_INCREF(exc_state->exc_type);
522 Py_XINCREF(exc_state->exc_value);
523 Py_XINCREF(exc_state->exc_traceback);
524 _PyErr_ChainExceptions(exc_state->exc_type,
525 exc_state->exc_value,
526 exc_state->exc_traceback);
527}
528
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300529static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200530_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
531 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300532{
533 PyObject *exc, *val, *val2, *tb;
534
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200535 assert(_PyErr_Occurred(tstate));
536 _PyErr_Fetch(tstate, &exc, &val, &tb);
537 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300538 if (tb != NULL) {
539 PyException_SetTraceback(val, tb);
540 Py_DECREF(tb);
541 }
542 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200543 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300544
Victor Stinner438a12d2019-05-24 17:01:38 +0200545 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300546
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200547 _PyErr_Fetch(tstate, &exc, &val2, &tb);
548 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300549 Py_INCREF(val);
550 PyException_SetCause(val2, val);
551 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200552 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300553
554 return NULL;
555}
556
557PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100558_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
559 const char *format, ...)
560{
561 va_list vargs;
562#ifdef HAVE_STDARG_PROTOTYPES
563 va_start(vargs, format);
564#else
565 va_start(vargs);
566#endif
567 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
568 va_end(vargs);
569 return NULL;
570}
571
572PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300573_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
574{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200575 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300576 va_list vargs;
577#ifdef HAVE_STDARG_PROTOTYPES
578 va_start(vargs, format);
579#else
580 va_start(vargs);
581#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200582 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300583 va_end(vargs);
584 return NULL;
585}
586
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000587/* Convenience functions to set a type error exception and return 0 */
588
589int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000591{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200592 PyThreadState *tstate = _PyThreadState_GET();
593 _PyErr_SetString(tstate, PyExc_TypeError,
594 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000596}
597
Guido van Rossum373c8691997-04-29 18:22:47 +0000598PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200599_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000600{
Andy Lesterdffe4c02020-03-04 07:15:20 -0600601 if (Py_IS_TYPE(PyExc_MemoryError, NULL)) {
Victor Stinnerf54a5742013-07-22 22:28:37 +0200602 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
603 initialized by _PyExc_Init() */
604 Py_FatalError("Out of memory and PyExc_MemoryError is not "
605 "initialized yet");
606 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200607 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000609}
610
Guido van Rossum373c8691997-04-29 18:22:47 +0000611PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200612PyErr_NoMemory(void)
613{
614 PyThreadState *tstate = _PyThreadState_GET();
615 return _PyErr_NoMemory(tstate);
616}
617
618PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000619PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000620{
Larry Hastingsb0827312014-02-09 22:05:19 -0800621 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
622}
623
624PyObject *
625PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
626{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200627 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200629 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100631#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000633#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000634
Guido van Rossume9fbc091995-02-18 14:52:19 +0000635#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 if (i == EINTR && PyErr_CheckSignals())
637 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000638#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000639
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000640#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100641 if (i != 0) {
Andy Lester7386a702020-02-13 22:42:56 -0600642 const char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100643 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100644 }
645 else {
646 /* Sometimes errno didn't get set */
647 message = PyUnicode_FromString("Error");
648 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000649#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 if (i == 0)
651 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
652 else
653 {
654 /* Note that the Win32 errors do not lineup with the
655 errno error. So if the error is in the MSVC error
656 table, we use it, otherwise we assume it really _is_
657 a Win32 error code
658 */
659 if (i > 0 && i < _sys_nerr) {
660 message = PyUnicode_FromString(_sys_errlist[i]);
661 }
662 else {
663 int len = FormatMessageW(
664 FORMAT_MESSAGE_ALLOCATE_BUFFER |
665 FORMAT_MESSAGE_FROM_SYSTEM |
666 FORMAT_MESSAGE_IGNORE_INSERTS,
667 NULL, /* no message source */
668 i,
669 MAKELANGID(LANG_NEUTRAL,
670 SUBLANG_DEFAULT),
671 /* Default language */
672 (LPWSTR) &s_buf,
673 0, /* size not used */
674 NULL); /* no args */
675 if (len==0) {
676 /* Only ever seen this in out-of-mem
677 situations */
678 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300679 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 } else {
681 /* remove trailing cr/lf and dots */
682 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
683 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200684 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 }
686 }
687 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000688#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 if (message == NULL)
691 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000692#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return NULL;
696 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000697
Larry Hastingsb0827312014-02-09 22:05:19 -0800698 if (filenameObject != NULL) {
699 if (filenameObject2 != NULL)
700 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
701 else
702 args = Py_BuildValue("(iOO)", i, message, filenameObject);
703 } else {
704 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200705 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800706 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000708
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200709 if (args != NULL) {
710 v = PyObject_Call(exc, args, NULL);
711 Py_DECREF(args);
712 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200713 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200714 Py_DECREF(v);
715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000717#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000721}
Guido van Rossum743007d1999-04-21 15:27:31 +0000722
Barry Warsaw97d95151998-07-23 16:05:56 +0000723PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000724PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800727 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 Py_XDECREF(name);
729 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000730}
731
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000732#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000733PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000734PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000735{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200736 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800737 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 Py_XDECREF(name);
739 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000740}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000741#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000742
743PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000744PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000745{
Larry Hastingsb0827312014-02-09 22:05:19 -0800746 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000747}
Guido van Rossum683a0721990-10-21 22:09:12 +0000748
Brett Cannonbf364092006-03-01 04:25:17 +0000749#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000750/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000751PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 PyObject *exc,
753 int ierr,
754 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000755{
Larry Hastingsb0827312014-02-09 22:05:19 -0800756 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
757 filenameObject, NULL);
758}
759
760PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
761 PyObject *exc,
762 int ierr,
763 PyObject *filenameObject,
764 PyObject *filenameObject2)
765{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200766 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 int len;
768 WCHAR *s_buf = NULL; /* Free via LocalFree */
769 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200770 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200773 if (err==0) {
774 err = GetLastError();
775 }
776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 len = FormatMessageW(
778 /* Error API error */
779 FORMAT_MESSAGE_ALLOCATE_BUFFER |
780 FORMAT_MESSAGE_FROM_SYSTEM |
781 FORMAT_MESSAGE_IGNORE_INSERTS,
782 NULL, /* no message source */
783 err,
784 MAKELANGID(LANG_NEUTRAL,
785 SUBLANG_DEFAULT), /* Default language */
786 (LPWSTR) &s_buf,
787 0, /* size not used */
788 NULL); /* no args */
789 if (len==0) {
790 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300791 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 s_buf = NULL;
793 } else {
794 /* remove trailing cr/lf and dots */
795 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
796 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200797 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 if (message == NULL)
801 {
802 LocalFree(s_buf);
803 return NULL;
804 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000805
Larry Hastingsb0827312014-02-09 22:05:19 -0800806 if (filenameObject == NULL) {
807 assert(filenameObject2 == NULL);
808 filenameObject = filenameObject2 = Py_None;
809 }
810 else if (filenameObject2 == NULL)
811 filenameObject2 = Py_None;
812 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200813 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800814 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000816
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200817 if (args != NULL) {
818 v = PyObject_Call(exc, args, NULL);
819 Py_DECREF(args);
820 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200821 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200822 Py_DECREF(v);
823 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 }
825 LocalFree(s_buf);
826 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000827}
828
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000829PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PyObject *exc,
831 int ierr,
832 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000833{
Victor Stinner92be9392010-12-28 00:28:21 +0000834 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800835 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800837 name,
838 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 Py_XDECREF(name);
840 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000841}
842
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000843PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *exc,
845 int ierr,
846 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000847{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200848 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800849 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800851 name,
852 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 Py_XDECREF(name);
854 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000855}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000856
Thomas Heller085358a2002-07-29 14:27:41 +0000857PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
858{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800859 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000860}
861
Guido van Rossum795e1892000-02-17 15:19:15 +0000862PyObject *PyErr_SetFromWindowsErr(int ierr)
863{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800864 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
865 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800866}
867
Thomas Heller085358a2002-07-29 14:27:41 +0000868PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 int ierr,
870 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000871{
Victor Stinner92be9392010-12-28 00:28:21 +0000872 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800873 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200874 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800875 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 Py_XDECREF(name);
877 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000878}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000879
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000880PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 int ierr,
882 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000883{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200884 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800885 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200886 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800887 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 Py_XDECREF(name);
889 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000890}
Guido van Rossum795e1892000-02-17 15:19:15 +0000891#endif /* MS_WINDOWS */
892
Brett Cannon79ec55e2012-04-12 20:24:54 -0400893PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700894PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
895 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400896{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200897 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700898 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200899 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500900
Eric Snow46f97b82016-09-07 16:56:15 -0700901 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
902 if (issubclass < 0) {
903 return NULL;
904 }
905 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200906 _PyErr_SetString(tstate, PyExc_TypeError,
907 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500908 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200909 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500910
Eric Snow46f97b82016-09-07 16:56:15 -0700911 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200912 _PyErr_SetString(tstate, PyExc_TypeError,
913 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500914 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400915 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500916
Brian Curtin94c001b2012-04-18 08:30:51 -0500917 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500918 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500919 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500920 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500921 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500922 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500923
Eric Snow46f97b82016-09-07 16:56:15 -0700924 kwargs = PyDict_New();
925 if (kwargs == NULL) {
926 return NULL;
927 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200928 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300929 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200930 }
931 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300932 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200933 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400934
Petr Viktorinffd97532020-02-11 17:46:57 +0100935 error = PyObject_VectorcallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400936 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200937 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500938 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400939 }
940
Berker Peksagec766d32016-05-01 09:06:36 +0300941done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400942 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500943 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400944}
945
Eric Snow46f97b82016-09-07 16:56:15 -0700946PyObject *
947PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
948{
949 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
950}
951
Guido van Rossum683a0721990-10-21 22:09:12 +0000952void
Neal Norwitzb382b842007-08-24 20:00:37 +0000953_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000954{
Victor Stinner438a12d2019-05-24 17:01:38 +0200955 PyThreadState *tstate = _PyThreadState_GET();
956 _PyErr_Format(tstate, PyExc_SystemError,
957 "%s:%d: bad argument to internal function",
958 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000959}
960
961/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
962 export the entry point for existing object code: */
963#undef PyErr_BadInternalCall
964void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000965PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000966{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200967 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200968 PyThreadState *tstate = _PyThreadState_GET();
969 _PyErr_SetString(tstate, PyExc_SystemError,
970 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000971}
Fred Drake6d63adf2000-08-24 22:38:39 +0000972#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
973
Guido van Rossum1548bac1997-02-14 17:09:47 +0000974
Victor Stinner438a12d2019-05-24 17:01:38 +0200975static PyObject *
976_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
977 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000980
Victor Stinnerde821be2015-03-24 12:41:23 +0100981 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
982 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200983 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100986
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200987 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000990}
Guido van Rossum7617e051997-09-16 18:43:50 +0000991
992
Antoine Pitrou0676a402014-09-30 21:16:27 +0200993PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200994PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
995{
996 PyThreadState *tstate = _PyThreadState_GET();
997 return _PyErr_FormatV(tstate, exception, format, vargs);
998}
999
1000
1001PyObject *
1002_PyErr_Format(PyThreadState *tstate, PyObject *exception,
1003 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +02001004{
1005 va_list vargs;
1006#ifdef HAVE_STDARG_PROTOTYPES
1007 va_start(vargs, format);
1008#else
1009 va_start(vargs);
1010#endif
Victor Stinner438a12d2019-05-24 17:01:38 +02001011 _PyErr_FormatV(tstate, exception, format, vargs);
1012 va_end(vargs);
1013 return NULL;
1014}
1015
1016
1017PyObject *
1018PyErr_Format(PyObject *exception, const char *format, ...)
1019{
1020 PyThreadState *tstate = _PyThreadState_GET();
1021 va_list vargs;
1022#ifdef HAVE_STDARG_PROTOTYPES
1023 va_start(vargs, format);
1024#else
1025 va_start(vargs);
1026#endif
1027 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +02001028 va_end(vargs);
1029 return NULL;
1030}
1031
Thomas Wouters477c8d52006-05-27 19:21:47 +00001032
Guido van Rossum7617e051997-09-16 18:43:50 +00001033PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001034PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001035{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001036 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 PyObject *modulename = NULL;
1038 PyObject *classname = NULL;
1039 PyObject *mydict = NULL;
1040 PyObject *bases = NULL;
1041 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001042
1043 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001045 _PyErr_SetString(tstate, PyExc_SystemError,
1046 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 return NULL;
1048 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001049 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001051 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 if (dict == NULL) {
1053 dict = mydict = PyDict_New();
1054 if (dict == NULL)
1055 goto failure;
1056 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001057
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001058 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001059 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001060 goto failure;
1061 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 modulename = PyUnicode_FromStringAndSize(name,
1063 (Py_ssize_t)(dot-name));
1064 if (modulename == NULL)
1065 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001066 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 goto failure;
1068 }
1069 if (PyTuple_Check(base)) {
1070 bases = base;
1071 /* INCREF as we create a new ref in the else branch */
1072 Py_INCREF(bases);
1073 } else {
1074 bases = PyTuple_Pack(1, base);
1075 if (bases == NULL)
1076 goto failure;
1077 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001078 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001079 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001081 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 Py_XDECREF(bases);
1083 Py_XDECREF(mydict);
1084 Py_XDECREF(classname);
1085 Py_XDECREF(modulename);
1086 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001087}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001088
Georg Brandl1e28a272009-12-28 08:41:01 +00001089
1090/* Create an exception with docstring */
1091PyObject *
1092PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 int result;
1096 PyObject *ret = NULL;
1097 PyObject *mydict = NULL; /* points to the dict only if we create it */
1098 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 if (dict == NULL) {
1101 dict = mydict = PyDict_New();
1102 if (dict == NULL) {
1103 return NULL;
1104 }
1105 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 if (doc != NULL) {
1108 docobj = PyUnicode_FromString(doc);
1109 if (docobj == NULL)
1110 goto failure;
1111 result = PyDict_SetItemString(dict, "__doc__", docobj);
1112 Py_DECREF(docobj);
1113 if (result < 0)
1114 goto failure;
1115 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001118 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 Py_XDECREF(mydict);
1120 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001121}
1122
1123
Victor Stinneref9d9b62019-05-22 11:28:22 +02001124PyDoc_STRVAR(UnraisableHookArgs__doc__,
1125"UnraisableHookArgs\n\
1126\n\
1127Type used to pass arguments to sys.unraisablehook.");
1128
1129static PyTypeObject UnraisableHookArgsType;
1130
1131static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1132 {"exc_type", "Exception type"},
1133 {"exc_value", "Exception value"},
1134 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001135 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001136 {"object", "Object causing the exception"},
1137 {0}
1138};
1139
1140static PyStructSequence_Desc UnraisableHookArgs_desc = {
1141 .name = "UnraisableHookArgs",
1142 .doc = UnraisableHookArgs__doc__,
1143 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001144 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001145};
1146
1147
Victor Stinner331a6a52019-05-27 16:39:22 +02001148PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001149_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001150{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001151 if (UnraisableHookArgsType.tp_name == NULL) {
1152 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1153 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001154 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001155 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001156 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001157 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001158}
1159
1160
1161static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001162make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001163 PyObject *exc_value, PyObject *exc_tb,
1164 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001165{
1166 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1167 if (args == NULL) {
1168 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001170
Victor Stinneref9d9b62019-05-22 11:28:22 +02001171 Py_ssize_t pos = 0;
1172#define ADD_ITEM(exc_type) \
1173 do { \
1174 if (exc_type == NULL) { \
1175 exc_type = Py_None; \
1176 } \
1177 Py_INCREF(exc_type); \
1178 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1179 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001180
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001181
Victor Stinneref9d9b62019-05-22 11:28:22 +02001182 ADD_ITEM(exc_type);
1183 ADD_ITEM(exc_value);
1184 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001185 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001186 ADD_ITEM(obj);
1187#undef ADD_ITEM
1188
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001189 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001190 Py_DECREF(args);
1191 return NULL;
1192 }
1193 return args;
1194}
1195
1196
1197
1198/* Default implementation of sys.unraisablehook.
1199
1200 It can be called to log the exception of a custom sys.unraisablehook.
1201
1202 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1203static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001204write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1205 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001206 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001207{
1208 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001209 if (err_msg != NULL && err_msg != Py_None) {
1210 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1211 return -1;
1212 }
1213 if (PyFile_WriteString(": ", file) < 0) {
1214 return -1;
1215 }
1216 }
1217 else {
1218 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1219 return -1;
1220 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001221 }
1222
1223 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001224 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001225 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1226 return -1;
1227 }
1228 }
1229 if (PyFile_WriteString("\n", file) < 0) {
1230 return -1;
1231 }
1232 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001233 else if (err_msg != NULL && err_msg != Py_None) {
1234 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1235 return -1;
1236 }
1237 if (PyFile_WriteString(":\n", file) < 0) {
1238 return -1;
1239 }
1240 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001241
1242 if (exc_tb != NULL && exc_tb != Py_None) {
1243 if (PyTraceBack_Print(exc_tb, file) < 0) {
1244 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001245 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001246 }
1247 }
1248
Victor Stinnerdf22c032019-05-23 01:00:58 +02001249 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001250 return -1;
1251 }
1252
1253 assert(PyExceptionClass_Check(exc_type));
1254 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001255 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001256 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001257 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001258 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001259 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001260 }
1261
Victor Stinneref9d9b62019-05-22 11:28:22 +02001262 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001263 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001264 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001265 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001266 if (PyFile_WriteString("<unknown>", file) < 0) {
1267 return -1;
1268 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001269 }
1270 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001271 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001272 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1273 Py_DECREF(moduleName);
1274 return -1;
1275 }
1276 Py_DECREF(moduleName);
1277 if (PyFile_WriteString(".", file) < 0) {
1278 return -1;
1279 }
1280 }
1281 else {
1282 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001283 }
1284 }
1285 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001286 if (PyFile_WriteString("<unknown>", file) < 0) {
1287 return -1;
1288 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001289 }
1290 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001291 if (PyFile_WriteString(className, file) < 0) {
1292 return -1;
1293 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001294 }
1295
Victor Stinneref9d9b62019-05-22 11:28:22 +02001296 if (exc_value && exc_value != Py_None) {
1297 if (PyFile_WriteString(": ", file) < 0) {
1298 return -1;
1299 }
1300 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001301 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001302 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1303 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001304 }
1305 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001306 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001307
Victor Stinneref9d9b62019-05-22 11:28:22 +02001308 if (PyFile_WriteString("\n", file) < 0) {
1309 return -1;
1310 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001311
1312 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001313 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001314 if (!res) {
1315 return -1;
1316 }
1317 Py_DECREF(res);
1318
Victor Stinneref9d9b62019-05-22 11:28:22 +02001319 return 0;
1320}
1321
1322
1323static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001324write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001325 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1326 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001327{
1328 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1329 if (file == NULL || file == Py_None) {
1330 return 0;
1331 }
1332
1333 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1334 while we use it */
1335 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001336 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001337 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001338 Py_DECREF(file);
1339
1340 return res;
1341}
1342
1343
1344PyObject*
1345_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1346{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001347 PyThreadState *tstate = _PyThreadState_GET();
1348
Andy Lester55728702020-03-06 16:53:17 -06001349 if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001350 _PyErr_SetString(tstate, PyExc_TypeError,
1351 "sys.unraisablehook argument type "
1352 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001353 return NULL;
1354 }
1355
1356 /* Borrowed references */
1357 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1358 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1359 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001360 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1361 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001362
Victor Stinner71c52e32019-05-27 08:57:14 +02001363 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001364 return NULL;
1365 }
1366 Py_RETURN_NONE;
1367}
1368
1369
1370/* Call sys.unraisablehook().
1371
1372 This function can be used when an exception has occurred but there is no way
1373 for Python to handle it. For example, when a destructor raises an exception
1374 or during garbage collection (gc.collect()).
1375
Victor Stinner71c52e32019-05-27 08:57:14 +02001376 If err_msg_str is non-NULL, the error message is formatted as:
1377 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1378 error message.
1379
Victor Stinneref9d9b62019-05-22 11:28:22 +02001380 An exception must be set when calling this function. */
1381void
Victor Stinner71c52e32019-05-27 08:57:14 +02001382_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001383{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001384 PyThreadState *tstate = _PyThreadState_GET();
1385 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001386
Victor Stinner71c52e32019-05-27 08:57:14 +02001387 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001388 PyObject *exc_type, *exc_value, *exc_tb;
1389 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001390
1391 assert(exc_type != NULL);
1392
1393 if (exc_type == NULL) {
1394 /* sys.unraisablehook requires that at least exc_type is set */
1395 goto default_hook;
1396 }
1397
Victor Stinnerdf22c032019-05-23 01:00:58 +02001398 if (exc_tb == NULL) {
Victor Stinner4386b902020-04-29 03:01:43 +02001399 PyFrameObject *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001400 if (frame != NULL) {
1401 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1402 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001403 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001404 }
1405 }
1406 }
1407
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001408 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001409
1410 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1411 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001412 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001413 }
1414 }
1415
Victor Stinner71c52e32019-05-27 08:57:14 +02001416 if (err_msg_str != NULL) {
1417 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1418 if (err_msg == NULL) {
1419 PyErr_Clear();
1420 }
1421 }
1422
Steve Dowerbea33f52019-11-28 08:46:11 -08001423 PyObject *hook_args = make_unraisable_hook_args(
1424 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1425 if (hook_args == NULL) {
1426 err_msg_str = ("Exception ignored on building "
1427 "sys.unraisablehook arguments");
1428 goto error;
1429 }
1430
Victor Stinneref9d9b62019-05-22 11:28:22 +02001431 _Py_IDENTIFIER(unraisablehook);
1432 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001433 if (hook == NULL) {
1434 Py_DECREF(hook_args);
1435 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001436 }
1437
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001438 if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -08001439 Py_DECREF(hook_args);
1440 err_msg_str = "Exception ignored in audit hook";
1441 obj = NULL;
1442 goto error;
1443 }
1444
1445 if (hook == Py_None) {
1446 Py_DECREF(hook_args);
1447 goto default_hook;
1448 }
1449
Petr Viktorinffd97532020-02-11 17:46:57 +01001450 PyObject *res = PyObject_CallOneArg(hook, hook_args);
Steve Dowerbea33f52019-11-28 08:46:11 -08001451 Py_DECREF(hook_args);
1452 if (res != NULL) {
1453 Py_DECREF(res);
1454 goto done;
1455 }
1456
1457 /* sys.unraisablehook failed: log its error using default hook */
1458 obj = hook;
1459 err_msg_str = NULL;
1460
1461error:
1462 /* err_msg_str and obj have been updated and we have a new exception */
1463 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1464 err_msg_str : "Exception ignored in sys.unraisablehook"));
1465 Py_XDECREF(exc_type);
1466 Py_XDECREF(exc_value);
1467 Py_XDECREF(exc_tb);
1468 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1469
Victor Stinneref9d9b62019-05-22 11:28:22 +02001470default_hook:
1471 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001472 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1473 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001474
1475done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001476 Py_XDECREF(exc_type);
1477 Py_XDECREF(exc_value);
1478 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001479 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001480 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001481}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001482
Victor Stinner71c52e32019-05-27 08:57:14 +02001483
1484void
1485PyErr_WriteUnraisable(PyObject *obj)
1486{
1487 _PyErr_WriteUnraisableMsg(NULL, obj);
1488}
1489
1490
Armin Rigo092381a2003-10-25 14:29:27 +00001491extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001492
Guido van Rossum2fd45652001-02-28 21:46:24 +00001493
Benjamin Peterson2c539712010-09-20 22:42:10 +00001494void
Victor Stinner14e461d2013-08-26 22:28:21 +02001495PyErr_SyntaxLocation(const char *filename, int lineno)
1496{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001497 PyErr_SyntaxLocationEx(filename, lineno, -1);
1498}
1499
1500
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001501/* Set file and line information for the current exception.
1502 If the exception is not a SyntaxError, also sets additional attributes
1503 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001504
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001505void
Victor Stinner14e461d2013-08-26 22:28:21 +02001506PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001509 _Py_IDENTIFIER(filename);
1510 _Py_IDENTIFIER(lineno);
1511 _Py_IDENTIFIER(msg);
1512 _Py_IDENTIFIER(offset);
1513 _Py_IDENTIFIER(print_file_and_line);
1514 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001515 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001518 _PyErr_Fetch(tstate, &exc, &v, &tb);
1519 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 /* XXX check that it is, indeed, a syntax error. It might not
1521 * be, though. */
1522 tmp = PyLong_FromLong(lineno);
1523 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001524 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001526 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1527 _PyErr_Clear(tstate);
1528 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 Py_DECREF(tmp);
1530 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001531 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001532 if (col_offset >= 0) {
1533 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001534 if (tmp == NULL) {
1535 _PyErr_Clear(tstate);
1536 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001537 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001538 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1539 _PyErr_Clear(tstate);
1540 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001541 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001543 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1544 _PyErr_Clear(tstate);
1545 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001546
Victor Stinner14e461d2013-08-26 22:28:21 +02001547 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001549 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1550 _PyErr_Clear(tstate);
1551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 Py_DECREF(tmp);
1553 }
1554 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001556 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 tmp = PyObject_Str(v);
1558 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001559 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1560 _PyErr_Clear(tstate);
1561 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001563 }
1564 else {
1565 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 }
1567 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001568 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1569 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001570 Py_None)) {
1571 _PyErr_Clear(tstate);
1572 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 }
1574 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001575 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001576}
1577
Victor Stinner14e461d2013-08-26 22:28:21 +02001578void
1579PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1580{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001581 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001582 PyObject *fileobj;
1583 if (filename != NULL) {
1584 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001585 if (fileobj == NULL) {
1586 _PyErr_Clear(tstate);
1587 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001588 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001589 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001590 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001591 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001592 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1593 Py_XDECREF(fileobj);
1594}
1595
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001596/* Attempt to load the line of text that the exception refers to. If it
1597 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001598
1599 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001600 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001601
Antoine Pitrou409b5382013-10-12 22:41:17 +02001602static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001603err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 int i;
1606 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 if (fp == NULL)
1609 return NULL;
1610 for (i = 0; i < lineno; i++) {
1611 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1612 do {
1613 *pLastChar = '\0';
1614 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1615 fp, NULL) == NULL)
1616 break;
1617 /* fgets read *something*; if it didn't get as
1618 far as pLastChar, it must have found a newline
1619 or hit the end of the file; if pLastChar is \n,
1620 it obviously found a newline; else we haven't
1621 yet seen a newline, so must continue */
1622 } while (*pLastChar != '\0' && *pLastChar != '\n');
1623 }
1624 fclose(fp);
1625 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001627 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001629 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 return res;
1631 }
1632 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001633}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001634
Victor Stinner14e461d2013-08-26 22:28:21 +02001635PyObject *
1636PyErr_ProgramText(const char *filename, int lineno)
1637{
1638 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001639 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001640 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001641 }
1642 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001643 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001644 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001645}
1646
1647PyObject *
1648PyErr_ProgramTextObject(PyObject *filename, int lineno)
1649{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001650 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001651 return NULL;
1652 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001653
1654 PyThreadState *tstate = _PyThreadState_GET();
1655 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1656 if (fp == NULL) {
1657 _PyErr_Clear(tstate);
1658 return NULL;
1659 }
1660 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001661}
1662
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001663#ifdef __cplusplus
1664}
1665#endif