blob: d65707e7f97f5963b69d38f4f53c6cb61df0fb63 [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 Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pystate.h"
Victor Stinnerdf22c032019-05-23 01:00:58 +02008#include "pycore_traceback.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00009
Guido van Rossum53e8d441995-03-09 12:11:31 +000010#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +000011#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +000012extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +000013#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000014#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000015
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000016#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000017#include <windows.h>
18#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000019#endif
20
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000021#include <ctype.h>
22
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000023#ifdef __cplusplus
24extern "C" {
25#endif
26
Victor Stinnerbd303c12013-11-07 23:07:29 +010027_Py_IDENTIFIER(builtins);
28_Py_IDENTIFIER(stderr);
Victor Stinnera85a1d32019-05-28 16:01:17 +020029_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010030
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000031
Victor Stinner438a12d2019-05-24 17:01:38 +020032/* Forward declarations */
33static PyObject *
34_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
35 const char *format, va_list vargs);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020036
37
Victor Stinner438a12d2019-05-24 17:01:38 +020038void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020039_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
40 PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
45 /* XXX Should never happen -- fatal error instead? */
46 /* Well, it could be None. */
47 Py_DECREF(traceback);
48 traceback = NULL;
49 }
Guido van Rossuma027efa1997-05-05 20:56:21 +000050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 /* Save these in locals to safeguard against recursive
52 invocation through Py_XDECREF */
53 oldtype = tstate->curexc_type;
54 oldvalue = tstate->curexc_value;
55 oldtraceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 tstate->curexc_type = type;
58 tstate->curexc_value = value;
59 tstate->curexc_traceback = traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 Py_XDECREF(oldtype);
62 Py_XDECREF(oldvalue);
63 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064}
65
Victor Stinnerb4bdecd2019-05-24 13:44:24 +020066void
67PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
68{
69 PyThreadState *tstate = _PyThreadState_GET();
70 _PyErr_Restore(tstate, type, value, traceback);
71}
72
73
Mark Shannonae3087c2017-10-22 22:41:51 +010074_PyErr_StackItem *
75_PyErr_GetTopmostException(PyThreadState *tstate)
76{
77 _PyErr_StackItem *exc_info = tstate->exc_info;
78 while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
79 exc_info->previous_item != NULL)
80 {
81 exc_info = exc_info->previous_item;
82 }
83 return exc_info;
84}
85
Victor Stinner3a840972016-08-22 23:59:08 +020086static PyObject*
87_PyErr_CreateException(PyObject *exception, PyObject *value)
88{
89 if (value == NULL || value == Py_None) {
90 return _PyObject_CallNoArg(exception);
91 }
92 else if (PyTuple_Check(value)) {
93 return PyObject_Call(exception, value, NULL);
94 }
95 else {
Jeroen Demeyer196a5302019-07-04 12:31:34 +020096 return _PyObject_CallOneArg(exception, value);
Victor Stinner3a840972016-08-22 23:59:08 +020097 }
98}
99
Victor Stinner438a12d2019-05-24 17:01:38 +0200100void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200101_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 PyObject *exc_value;
104 PyObject *tb = NULL;
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 if (exception != NULL &&
107 !PyExceptionClass_Check(exception)) {
Victor Stinner438a12d2019-05-24 17:01:38 +0200108 _PyErr_Format(tstate, PyExc_SystemError,
109 "exception %R not a BaseException subclass",
110 exception);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 return;
112 }
Victor Stinner3a840972016-08-22 23:59:08 +0200113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 Py_XINCREF(value);
Mark Shannonae3087c2017-10-22 22:41:51 +0100115 exc_value = _PyErr_GetTopmostException(tstate)->exc_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 if (exc_value != NULL && exc_value != Py_None) {
117 /* Implicit exception chaining */
118 Py_INCREF(exc_value);
119 if (value == NULL || !PyExceptionInstance_Check(value)) {
120 /* We must normalize the value right now */
Victor Stinner3a840972016-08-22 23:59:08 +0200121 PyObject *fixed_value;
Victor Stinnerde821be2015-03-24 12:41:23 +0100122
Victor Stinner3a840972016-08-22 23:59:08 +0200123 /* Issue #23571: functions must not be called with an
Victor Stinnerde821be2015-03-24 12:41:23 +0100124 exception set */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200125 _PyErr_Clear(tstate);
Victor Stinnerde821be2015-03-24 12:41:23 +0100126
Victor Stinner3a840972016-08-22 23:59:08 +0200127 fixed_value = _PyErr_CreateException(exception, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_XDECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200129 if (fixed_value == NULL) {
Alexey Izbysheva2eefa62018-08-26 19:31:25 +0300130 Py_DECREF(exc_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 return;
Victor Stinner3a840972016-08-22 23:59:08 +0200132 }
133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 value = fixed_value;
135 }
Victor Stinner3a840972016-08-22 23:59:08 +0200136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 /* Avoid reference cycles through the context chain.
138 This is O(chain length) but context chains are
139 usually very short. Sensitive readers may try
140 to inline the call to PyException_GetContext. */
141 if (exc_value != value) {
142 PyObject *o = exc_value, *context;
143 while ((context = PyException_GetContext(o))) {
144 Py_DECREF(context);
145 if (context == value) {
146 PyException_SetContext(o, NULL);
147 break;
148 }
149 o = context;
150 }
151 PyException_SetContext(value, exc_value);
Victor Stinner3a840972016-08-22 23:59:08 +0200152 }
153 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 Py_DECREF(exc_value);
155 }
156 }
157 if (value != NULL && PyExceptionInstance_Check(value))
158 tb = PyException_GetTraceback(value);
159 Py_XINCREF(exception);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200160 _PyErr_Restore(tstate, exception, value, tb);
161}
162
163void
164PyErr_SetObject(PyObject *exception, PyObject *value)
165{
166 PyThreadState *tstate = _PyThreadState_GET();
167 _PyErr_SetObject(tstate, exception, value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168}
169
Raymond Hettinger69492da2013-09-02 15:59:26 -0700170/* Set a key error with the specified argument, wrapping it in a
171 * tuple automatically so that tuple keys are not unpacked as the
172 * exception arguments. */
173void
174_PyErr_SetKeyError(PyObject *arg)
175{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200176 PyThreadState *tstate = _PyThreadState_GET();
177 PyObject *tup = PyTuple_Pack(1, arg);
178 if (!tup) {
179 /* caller will expect error to be set anyway */
180 return;
181 }
182 _PyErr_SetObject(tstate, PyExc_KeyError, tup);
Raymond Hettinger69492da2013-09-02 15:59:26 -0700183 Py_DECREF(tup);
184}
185
Victor Stinner438a12d2019-05-24 17:01:38 +0200186void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200187_PyErr_SetNone(PyThreadState *tstate, PyObject *exception)
188{
189 _PyErr_SetObject(tstate, exception, (PyObject *)NULL);
190}
191
192
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000194PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200196 PyThreadState *tstate = _PyThreadState_GET();
197 _PyErr_SetNone(tstate, exception);
198}
199
200
Victor Stinner438a12d2019-05-24 17:01:38 +0200201void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200202_PyErr_SetString(PyThreadState *tstate, PyObject *exception,
203 const char *string)
204{
205 PyObject *value = PyUnicode_FromString(string);
206 _PyErr_SetObject(tstate, exception, value);
207 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
210void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200213 PyThreadState *tstate = _PyThreadState_GET();
214 _PyErr_SetString(tstate, exception, string);
215}
216
217
Victor Stinnerc6944e72016-11-11 02:13:35 +0100218PyObject* _Py_HOT_FUNCTION
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Victor Stinnerd12d0e72019-11-07 12:42:07 +0100221 /* The caller must hold the GIL. */
222 assert(PyGILState_Check());
223
Victor Stinner50b48572018-11-01 01:51:40 +0100224 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200225 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226}
227
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228
229int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (err == NULL || exc == NULL) {
233 /* maybe caused by "import exceptions" that failed early on */
234 return 0;
235 }
236 if (PyTuple_Check(exc)) {
237 Py_ssize_t i, n;
238 n = PyTuple_Size(exc);
239 for (i = 0; i < n; i++) {
240 /* Test recursively */
241 if (PyErr_GivenExceptionMatches(
242 err, PyTuple_GET_ITEM(exc, i)))
243 {
244 return 1;
245 }
246 }
247 return 0;
248 }
249 /* err might be an instance, so check its class. */
250 if (PyExceptionInstance_Check(err))
251 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200254 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000258}
Guido van Rossum743007d1999-04-21 15:27:31 +0000259
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000260
261int
Victor Stinner438a12d2019-05-24 17:01:38 +0200262_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
263{
264 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
265}
266
267
268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000270{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200271 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200272 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000273}
274
275
xdegaye56d1f5c2017-10-26 15:09:06 +0200276#ifndef Py_NORMALIZE_RECURSION_LIMIT
277#define Py_NORMALIZE_RECURSION_LIMIT 32
278#endif
279
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000280/* Used in many places to normalize a raised exception, including in
281 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000282
283 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000285*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200286void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200287_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
288 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000289{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200290 int recursion_depth = 0;
291 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000292
Serhiy Storchakacf296532017-11-05 11:27:48 +0200293 restart:
294 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 if (type == NULL) {
296 /* There was no exception, so nothing to do. */
297 return;
298 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000299
Serhiy Storchakacf296532017-11-05 11:27:48 +0200300 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 /* If PyErr_SetNone() was used, the value will have been actually
302 set to NULL.
303 */
304 if (!value) {
305 value = Py_None;
306 Py_INCREF(value);
307 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 /* Normalize the exception so that if the type is a class, the
310 value will be an instance.
311 */
312 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200313 PyObject *inclass = NULL;
314 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200315
Serhiy Storchakacf296532017-11-05 11:27:48 +0200316 if (PyExceptionInstance_Check(value)) {
317 inclass = PyExceptionInstance_Class(value);
318 is_subclass = PyObject_IsSubclass(inclass, type);
319 if (is_subclass < 0) {
320 goto error;
321 }
322 }
323
324 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 whose class is (or is derived from) type, then use the
326 value as an argument to instantiation of the type
327 class.
328 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200329 if (!is_subclass) {
330 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200331 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200332 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200335 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200337 /* If the class of the instance doesn't exactly match the
338 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 */
340 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200341 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 Py_DECREF(type);
343 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 }
345 }
346 *exc = type;
347 *val = value;
348 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200349
350 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 Py_DECREF(type);
352 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200353 recursion_depth++;
354 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200355 _PyErr_SetString(tstate, PyExc_RecursionError,
356 "maximum recursion depth exceeded "
357 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200358 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 /* If the new exception doesn't set a traceback and the old
360 exception had a traceback, use the old traceback for the
361 new exception. It's better than nothing.
362 */
363 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200364 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200365 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 if (initial_tb != NULL) {
367 if (*tb == NULL)
368 *tb = initial_tb;
369 else
370 Py_DECREF(initial_tb);
371 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200372 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
373 corresponding RecursionError could not be normalized, and the
374 MemoryError raised when normalize this RecursionError could not be
375 normalized. */
376 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200377 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
378 Py_FatalError("Cannot recover from MemoryErrors "
379 "while normalizing exceptions.");
380 }
381 else {
382 Py_FatalError("Cannot recover from the recursive normalization "
383 "of an exception.");
384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200386 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000387}
388
389
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200391PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Victor Stinner50b48572018-11-01 01:51:40 +0100393 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200394 _PyErr_NormalizeException(tstate, exc, val, tb);
395}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200397
Victor Stinner438a12d2019-05-24 17:01:38 +0200398void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200399_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
400 PyObject **p_traceback)
401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 *p_type = tstate->curexc_type;
403 *p_value = tstate->curexc_value;
404 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 tstate->curexc_type = NULL;
407 tstate->curexc_value = NULL;
408 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409}
410
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200411
412void
413PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
414{
415 PyThreadState *tstate = _PyThreadState_GET();
416 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
417}
418
419
Victor Stinner438a12d2019-05-24 17:01:38 +0200420void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200421_PyErr_Clear(PyThreadState *tstate)
422{
423 _PyErr_Restore(tstate, NULL, NULL, NULL);
424}
425
426
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200430 PyThreadState *tstate = _PyThreadState_GET();
431 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000433
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200434
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200435void
436PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
437{
Victor Stinner50b48572018-11-01 01:51:40 +0100438 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200439
Mark Shannonae3087c2017-10-22 22:41:51 +0100440 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
441 *p_type = exc_info->exc_type;
442 *p_value = exc_info->exc_value;
443 *p_traceback = exc_info->exc_traceback;
444
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200445
446 Py_XINCREF(*p_type);
447 Py_XINCREF(*p_value);
448 Py_XINCREF(*p_traceback);
449}
450
451void
452PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
453{
454 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100455 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200456
Mark Shannonae3087c2017-10-22 22:41:51 +0100457 oldtype = tstate->exc_info->exc_type;
458 oldvalue = tstate->exc_info->exc_value;
459 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200460
Mark Shannonae3087c2017-10-22 22:41:51 +0100461 tstate->exc_info->exc_type = p_type;
462 tstate->exc_info->exc_value = p_value;
463 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200464
465 Py_XDECREF(oldtype);
466 Py_XDECREF(oldvalue);
467 Py_XDECREF(oldtraceback);
468}
469
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300470/* Like PyErr_Restore(), but if an exception is already set,
471 set the context associated with it.
472 */
473void
474_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
475{
476 if (exc == NULL)
477 return;
478
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200479 PyThreadState *tstate = _PyThreadState_GET();
480 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300481 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200482 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
483 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300484 if (tb != NULL) {
485 PyException_SetTraceback(val, tb);
486 Py_DECREF(tb);
487 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300488 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200489 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300490 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200491 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300492 }
493 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200494 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300495 }
496}
497
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300498static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200499_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
500 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300501{
502 PyObject *exc, *val, *val2, *tb;
503
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200504 assert(_PyErr_Occurred(tstate));
505 _PyErr_Fetch(tstate, &exc, &val, &tb);
506 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300507 if (tb != NULL) {
508 PyException_SetTraceback(val, tb);
509 Py_DECREF(tb);
510 }
511 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200512 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300513
Victor Stinner438a12d2019-05-24 17:01:38 +0200514 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300515
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200516 _PyErr_Fetch(tstate, &exc, &val2, &tb);
517 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300518 Py_INCREF(val);
519 PyException_SetCause(val2, val);
520 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200521 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300522
523 return NULL;
524}
525
526PyObject *
Victor Stinner17269092019-11-05 01:22:12 +0100527_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
528 const char *format, ...)
529{
530 va_list vargs;
531#ifdef HAVE_STDARG_PROTOTYPES
532 va_start(vargs, format);
533#else
534 va_start(vargs);
535#endif
536 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
537 va_end(vargs);
538 return NULL;
539}
540
541PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300542_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
543{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200544 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300545 va_list vargs;
546#ifdef HAVE_STDARG_PROTOTYPES
547 va_start(vargs, format);
548#else
549 va_start(vargs);
550#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200551 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300552 va_end(vargs);
553 return NULL;
554}
555
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000556/* Convenience functions to set a type error exception and return 0 */
557
558int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000559PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000560{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200561 PyThreadState *tstate = _PyThreadState_GET();
562 _PyErr_SetString(tstate, PyExc_TypeError,
563 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000565}
566
Guido van Rossum373c8691997-04-29 18:22:47 +0000567PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200568_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000569{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200570 if (Py_TYPE(PyExc_MemoryError) == NULL) {
571 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
572 initialized by _PyExc_Init() */
573 Py_FatalError("Out of memory and PyExc_MemoryError is not "
574 "initialized yet");
575 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200576 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000578}
579
Guido van Rossum373c8691997-04-29 18:22:47 +0000580PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200581PyErr_NoMemory(void)
582{
583 PyThreadState *tstate = _PyThreadState_GET();
584 return _PyErr_NoMemory(tstate);
585}
586
587PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000588PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000589{
Larry Hastingsb0827312014-02-09 22:05:19 -0800590 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
591}
592
593PyObject *
594PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
595{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200596 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200598 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100600#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000602#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000603
Guido van Rossume9fbc091995-02-18 14:52:19 +0000604#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (i == EINTR && PyErr_CheckSignals())
606 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000607#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000608
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000609#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100610 if (i != 0) {
611 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100612 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100613 }
614 else {
615 /* Sometimes errno didn't get set */
616 message = PyUnicode_FromString("Error");
617 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000618#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (i == 0)
620 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
621 else
622 {
623 /* Note that the Win32 errors do not lineup with the
624 errno error. So if the error is in the MSVC error
625 table, we use it, otherwise we assume it really _is_
626 a Win32 error code
627 */
628 if (i > 0 && i < _sys_nerr) {
629 message = PyUnicode_FromString(_sys_errlist[i]);
630 }
631 else {
632 int len = FormatMessageW(
633 FORMAT_MESSAGE_ALLOCATE_BUFFER |
634 FORMAT_MESSAGE_FROM_SYSTEM |
635 FORMAT_MESSAGE_IGNORE_INSERTS,
636 NULL, /* no message source */
637 i,
638 MAKELANGID(LANG_NEUTRAL,
639 SUBLANG_DEFAULT),
640 /* Default language */
641 (LPWSTR) &s_buf,
642 0, /* size not used */
643 NULL); /* no args */
644 if (len==0) {
645 /* Only ever seen this in out-of-mem
646 situations */
647 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300648 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 } else {
650 /* remove trailing cr/lf and dots */
651 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
652 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200653 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 }
655 }
656 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000657#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 if (message == NULL)
660 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000661#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 return NULL;
665 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000666
Larry Hastingsb0827312014-02-09 22:05:19 -0800667 if (filenameObject != NULL) {
668 if (filenameObject2 != NULL)
669 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
670 else
671 args = Py_BuildValue("(iOO)", i, message, filenameObject);
672 } else {
673 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200674 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000677
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200678 if (args != NULL) {
679 v = PyObject_Call(exc, args, NULL);
680 Py_DECREF(args);
681 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200682 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200683 Py_DECREF(v);
684 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000686#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000690}
Guido van Rossum743007d1999-04-21 15:27:31 +0000691
Barry Warsaw97d95151998-07-23 16:05:56 +0000692PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000693PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800696 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 Py_XDECREF(name);
698 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000699}
700
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000701#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000702PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000703PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000704{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200705 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800706 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 Py_XDECREF(name);
708 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000709}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000710#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000711
712PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000713PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000714{
Larry Hastingsb0827312014-02-09 22:05:19 -0800715 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000716}
Guido van Rossum683a0721990-10-21 22:09:12 +0000717
Brett Cannonbf364092006-03-01 04:25:17 +0000718#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000719/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000720PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 PyObject *exc,
722 int ierr,
723 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000724{
Larry Hastingsb0827312014-02-09 22:05:19 -0800725 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
726 filenameObject, NULL);
727}
728
729PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
730 PyObject *exc,
731 int ierr,
732 PyObject *filenameObject,
733 PyObject *filenameObject2)
734{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200735 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 int len;
737 WCHAR *s_buf = NULL; /* Free via LocalFree */
738 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200739 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200742 if (err==0) {
743 err = GetLastError();
744 }
745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 len = FormatMessageW(
747 /* Error API error */
748 FORMAT_MESSAGE_ALLOCATE_BUFFER |
749 FORMAT_MESSAGE_FROM_SYSTEM |
750 FORMAT_MESSAGE_IGNORE_INSERTS,
751 NULL, /* no message source */
752 err,
753 MAKELANGID(LANG_NEUTRAL,
754 SUBLANG_DEFAULT), /* Default language */
755 (LPWSTR) &s_buf,
756 0, /* size not used */
757 NULL); /* no args */
758 if (len==0) {
759 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300760 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 s_buf = NULL;
762 } else {
763 /* remove trailing cr/lf and dots */
764 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
765 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200766 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (message == NULL)
770 {
771 LocalFree(s_buf);
772 return NULL;
773 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000774
Larry Hastingsb0827312014-02-09 22:05:19 -0800775 if (filenameObject == NULL) {
776 assert(filenameObject2 == NULL);
777 filenameObject = filenameObject2 = Py_None;
778 }
779 else if (filenameObject2 == NULL)
780 filenameObject2 = Py_None;
781 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200782 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800783 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000785
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200786 if (args != NULL) {
787 v = PyObject_Call(exc, args, NULL);
788 Py_DECREF(args);
789 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200790 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200791 Py_DECREF(v);
792 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 }
794 LocalFree(s_buf);
795 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000796}
797
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000798PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 PyObject *exc,
800 int ierr,
801 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000802{
Victor Stinner92be9392010-12-28 00:28:21 +0000803 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800804 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800806 name,
807 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 Py_XDECREF(name);
809 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000810}
811
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000812PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 PyObject *exc,
814 int ierr,
815 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000816{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200817 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800818 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800820 name,
821 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 Py_XDECREF(name);
823 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000824}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000825
Thomas Heller085358a2002-07-29 14:27:41 +0000826PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
827{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800828 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000829}
830
Guido van Rossum795e1892000-02-17 15:19:15 +0000831PyObject *PyErr_SetFromWindowsErr(int ierr)
832{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800833 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
834 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800835}
836
Thomas Heller085358a2002-07-29 14:27:41 +0000837PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 int ierr,
839 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000840{
Victor Stinner92be9392010-12-28 00:28:21 +0000841 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800842 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200843 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800844 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 Py_XDECREF(name);
846 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000847}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000848
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000849PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 int ierr,
851 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000852{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200853 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800854 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200855 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800856 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 Py_XDECREF(name);
858 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000859}
Guido van Rossum795e1892000-02-17 15:19:15 +0000860#endif /* MS_WINDOWS */
861
Brett Cannon79ec55e2012-04-12 20:24:54 -0400862PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700863PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
864 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400865{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200866 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700867 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200868 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500869
Eric Snow46f97b82016-09-07 16:56:15 -0700870 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
871 if (issubclass < 0) {
872 return NULL;
873 }
874 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200875 _PyErr_SetString(tstate, PyExc_TypeError,
876 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500877 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200878 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500879
Eric Snow46f97b82016-09-07 16:56:15 -0700880 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200881 _PyErr_SetString(tstate, PyExc_TypeError,
882 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500883 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400884 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500885
Brian Curtin94c001b2012-04-18 08:30:51 -0500886 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500887 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500888 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500889 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500890 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500891 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500892
Eric Snow46f97b82016-09-07 16:56:15 -0700893 kwargs = PyDict_New();
894 if (kwargs == NULL) {
895 return NULL;
896 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200897 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300898 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200899 }
900 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300901 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200902 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400903
Eric Snow46f97b82016-09-07 16:56:15 -0700904 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400905 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200906 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500907 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400908 }
909
Berker Peksagec766d32016-05-01 09:06:36 +0300910done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400911 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500912 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400913}
914
Eric Snow46f97b82016-09-07 16:56:15 -0700915PyObject *
916PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
917{
918 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
919}
920
Guido van Rossum683a0721990-10-21 22:09:12 +0000921void
Neal Norwitzb382b842007-08-24 20:00:37 +0000922_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000923{
Victor Stinner438a12d2019-05-24 17:01:38 +0200924 PyThreadState *tstate = _PyThreadState_GET();
925 _PyErr_Format(tstate, PyExc_SystemError,
926 "%s:%d: bad argument to internal function",
927 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000928}
929
930/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
931 export the entry point for existing object code: */
932#undef PyErr_BadInternalCall
933void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000934PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000935{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200936 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200937 PyThreadState *tstate = _PyThreadState_GET();
938 _PyErr_SetString(tstate, PyExc_SystemError,
939 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000940}
Fred Drake6d63adf2000-08-24 22:38:39 +0000941#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
942
Guido van Rossum1548bac1997-02-14 17:09:47 +0000943
Victor Stinner438a12d2019-05-24 17:01:38 +0200944static PyObject *
945_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
946 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000949
Victor Stinnerde821be2015-03-24 12:41:23 +0100950 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
951 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200952 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100955
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200956 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000959}
Guido van Rossum7617e051997-09-16 18:43:50 +0000960
961
Antoine Pitrou0676a402014-09-30 21:16:27 +0200962PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200963PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
964{
965 PyThreadState *tstate = _PyThreadState_GET();
966 return _PyErr_FormatV(tstate, exception, format, vargs);
967}
968
969
970PyObject *
971_PyErr_Format(PyThreadState *tstate, PyObject *exception,
972 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200973{
974 va_list vargs;
975#ifdef HAVE_STDARG_PROTOTYPES
976 va_start(vargs, format);
977#else
978 va_start(vargs);
979#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200980 _PyErr_FormatV(tstate, exception, format, vargs);
981 va_end(vargs);
982 return NULL;
983}
984
985
986PyObject *
987PyErr_Format(PyObject *exception, const char *format, ...)
988{
989 PyThreadState *tstate = _PyThreadState_GET();
990 va_list vargs;
991#ifdef HAVE_STDARG_PROTOTYPES
992 va_start(vargs, format);
993#else
994 va_start(vargs);
995#endif
996 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +0200997 va_end(vargs);
998 return NULL;
999}
1000
Thomas Wouters477c8d52006-05-27 19:21:47 +00001001
Guido van Rossum7617e051997-09-16 18:43:50 +00001002PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001003PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001004{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001005 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001006 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 PyObject *modulename = NULL;
1008 PyObject *classname = NULL;
1009 PyObject *mydict = NULL;
1010 PyObject *bases = NULL;
1011 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001012
1013 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001015 _PyErr_SetString(tstate, PyExc_SystemError,
1016 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 return NULL;
1018 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001019 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001021 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 if (dict == NULL) {
1023 dict = mydict = PyDict_New();
1024 if (dict == NULL)
1025 goto failure;
1026 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001027
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001028 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001029 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001030 goto failure;
1031 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 modulename = PyUnicode_FromStringAndSize(name,
1033 (Py_ssize_t)(dot-name));
1034 if (modulename == NULL)
1035 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001036 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 goto failure;
1038 }
1039 if (PyTuple_Check(base)) {
1040 bases = base;
1041 /* INCREF as we create a new ref in the else branch */
1042 Py_INCREF(bases);
1043 } else {
1044 bases = PyTuple_Pack(1, base);
1045 if (bases == NULL)
1046 goto failure;
1047 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001048 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001049 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001051 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 Py_XDECREF(bases);
1053 Py_XDECREF(mydict);
1054 Py_XDECREF(classname);
1055 Py_XDECREF(modulename);
1056 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001057}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001058
Georg Brandl1e28a272009-12-28 08:41:01 +00001059
1060/* Create an exception with docstring */
1061PyObject *
1062PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 int result;
1066 PyObject *ret = NULL;
1067 PyObject *mydict = NULL; /* points to the dict only if we create it */
1068 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 if (dict == NULL) {
1071 dict = mydict = PyDict_New();
1072 if (dict == NULL) {
1073 return NULL;
1074 }
1075 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 if (doc != NULL) {
1078 docobj = PyUnicode_FromString(doc);
1079 if (docobj == NULL)
1080 goto failure;
1081 result = PyDict_SetItemString(dict, "__doc__", docobj);
1082 Py_DECREF(docobj);
1083 if (result < 0)
1084 goto failure;
1085 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001088 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 Py_XDECREF(mydict);
1090 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001091}
1092
1093
Victor Stinneref9d9b62019-05-22 11:28:22 +02001094PyDoc_STRVAR(UnraisableHookArgs__doc__,
1095"UnraisableHookArgs\n\
1096\n\
1097Type used to pass arguments to sys.unraisablehook.");
1098
1099static PyTypeObject UnraisableHookArgsType;
1100
1101static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1102 {"exc_type", "Exception type"},
1103 {"exc_value", "Exception value"},
1104 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001105 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001106 {"object", "Object causing the exception"},
1107 {0}
1108};
1109
1110static PyStructSequence_Desc UnraisableHookArgs_desc = {
1111 .name = "UnraisableHookArgs",
1112 .doc = UnraisableHookArgs__doc__,
1113 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001114 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001115};
1116
1117
Victor Stinner331a6a52019-05-27 16:39:22 +02001118PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001119_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001120{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001121 if (UnraisableHookArgsType.tp_name == NULL) {
1122 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1123 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001124 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001125 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001126 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001127 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001128}
1129
1130
1131static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001132make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001133 PyObject *exc_value, PyObject *exc_tb,
1134 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001135{
1136 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1137 if (args == NULL) {
1138 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001140
Victor Stinneref9d9b62019-05-22 11:28:22 +02001141 Py_ssize_t pos = 0;
1142#define ADD_ITEM(exc_type) \
1143 do { \
1144 if (exc_type == NULL) { \
1145 exc_type = Py_None; \
1146 } \
1147 Py_INCREF(exc_type); \
1148 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1149 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001150
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001151
Victor Stinneref9d9b62019-05-22 11:28:22 +02001152 ADD_ITEM(exc_type);
1153 ADD_ITEM(exc_value);
1154 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001155 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001156 ADD_ITEM(obj);
1157#undef ADD_ITEM
1158
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001159 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001160 Py_DECREF(args);
1161 return NULL;
1162 }
1163 return args;
1164}
1165
1166
1167
1168/* Default implementation of sys.unraisablehook.
1169
1170 It can be called to log the exception of a custom sys.unraisablehook.
1171
1172 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1173static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001174write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1175 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001176 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001177{
1178 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001179 if (err_msg != NULL && err_msg != Py_None) {
1180 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1181 return -1;
1182 }
1183 if (PyFile_WriteString(": ", file) < 0) {
1184 return -1;
1185 }
1186 }
1187 else {
1188 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1189 return -1;
1190 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001191 }
1192
1193 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001194 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001195 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1196 return -1;
1197 }
1198 }
1199 if (PyFile_WriteString("\n", file) < 0) {
1200 return -1;
1201 }
1202 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001203 else if (err_msg != NULL && err_msg != Py_None) {
1204 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1205 return -1;
1206 }
1207 if (PyFile_WriteString(":\n", file) < 0) {
1208 return -1;
1209 }
1210 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001211
1212 if (exc_tb != NULL && exc_tb != Py_None) {
1213 if (PyTraceBack_Print(exc_tb, file) < 0) {
1214 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001215 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001216 }
1217 }
1218
Victor Stinnerdf22c032019-05-23 01:00:58 +02001219 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001220 return -1;
1221 }
1222
1223 assert(PyExceptionClass_Check(exc_type));
1224 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001225 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001226 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001227 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001228 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001229 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001230 }
1231
Victor Stinneref9d9b62019-05-22 11:28:22 +02001232 _Py_IDENTIFIER(__module__);
1233 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001234 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001235 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001236 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001237 if (PyFile_WriteString("<unknown>", file) < 0) {
1238 return -1;
1239 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001240 }
1241 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001242 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001243 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1244 Py_DECREF(moduleName);
1245 return -1;
1246 }
1247 Py_DECREF(moduleName);
1248 if (PyFile_WriteString(".", file) < 0) {
1249 return -1;
1250 }
1251 }
1252 else {
1253 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001254 }
1255 }
1256 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001257 if (PyFile_WriteString("<unknown>", file) < 0) {
1258 return -1;
1259 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001260 }
1261 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001262 if (PyFile_WriteString(className, file) < 0) {
1263 return -1;
1264 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001265 }
1266
Victor Stinneref9d9b62019-05-22 11:28:22 +02001267 if (exc_value && exc_value != Py_None) {
1268 if (PyFile_WriteString(": ", file) < 0) {
1269 return -1;
1270 }
1271 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001272 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001273 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1274 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001275 }
1276 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001277 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001278
Victor Stinneref9d9b62019-05-22 11:28:22 +02001279 if (PyFile_WriteString("\n", file) < 0) {
1280 return -1;
1281 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001282
1283 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001284 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001285 if (!res) {
1286 return -1;
1287 }
1288 Py_DECREF(res);
1289
Victor Stinneref9d9b62019-05-22 11:28:22 +02001290 return 0;
1291}
1292
1293
1294static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001295write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001296 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1297 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001298{
1299 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1300 if (file == NULL || file == Py_None) {
1301 return 0;
1302 }
1303
1304 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1305 while we use it */
1306 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001307 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001308 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001309 Py_DECREF(file);
1310
1311 return res;
1312}
1313
1314
1315PyObject*
1316_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1317{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001318 PyThreadState *tstate = _PyThreadState_GET();
1319
Victor Stinneref9d9b62019-05-22 11:28:22 +02001320 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001321 _PyErr_SetString(tstate, PyExc_TypeError,
1322 "sys.unraisablehook argument type "
1323 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001324 return NULL;
1325 }
1326
1327 /* Borrowed references */
1328 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1329 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1330 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001331 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1332 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001333
Victor Stinner71c52e32019-05-27 08:57:14 +02001334 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001335 return NULL;
1336 }
1337 Py_RETURN_NONE;
1338}
1339
1340
1341/* Call sys.unraisablehook().
1342
1343 This function can be used when an exception has occurred but there is no way
1344 for Python to handle it. For example, when a destructor raises an exception
1345 or during garbage collection (gc.collect()).
1346
Victor Stinner71c52e32019-05-27 08:57:14 +02001347 If err_msg_str is non-NULL, the error message is formatted as:
1348 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1349 error message.
1350
Victor Stinneref9d9b62019-05-22 11:28:22 +02001351 An exception must be set when calling this function. */
1352void
Victor Stinner71c52e32019-05-27 08:57:14 +02001353_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001354{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001355 PyThreadState *tstate = _PyThreadState_GET();
1356 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001357
Victor Stinner71c52e32019-05-27 08:57:14 +02001358 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001359 PyObject *exc_type, *exc_value, *exc_tb;
1360 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001361
1362 assert(exc_type != NULL);
1363
1364 if (exc_type == NULL) {
1365 /* sys.unraisablehook requires that at least exc_type is set */
1366 goto default_hook;
1367 }
1368
Victor Stinnerdf22c032019-05-23 01:00:58 +02001369 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001370 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001371 if (frame != NULL) {
1372 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1373 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001374 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001375 }
1376 }
1377 }
1378
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001379 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001380
1381 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1382 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001383 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001384 }
1385 }
1386
Victor Stinner71c52e32019-05-27 08:57:14 +02001387 if (err_msg_str != NULL) {
1388 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1389 if (err_msg == NULL) {
1390 PyErr_Clear();
1391 }
1392 }
1393
Steve Dowerbea33f52019-11-28 08:46:11 -08001394 PyObject *hook_args = make_unraisable_hook_args(
1395 tstate, exc_type, exc_value, exc_tb, err_msg, obj);
1396 if (hook_args == NULL) {
1397 err_msg_str = ("Exception ignored on building "
1398 "sys.unraisablehook arguments");
1399 goto error;
1400 }
1401
Victor Stinneref9d9b62019-05-22 11:28:22 +02001402 _Py_IDENTIFIER(unraisablehook);
1403 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
Steve Dowerbea33f52019-11-28 08:46:11 -08001404 if (hook == NULL) {
1405 Py_DECREF(hook_args);
1406 goto default_hook;
Victor Stinneref9d9b62019-05-22 11:28:22 +02001407 }
1408
Steve Dowerbea33f52019-11-28 08:46:11 -08001409 if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) {
1410 Py_DECREF(hook_args);
1411 err_msg_str = "Exception ignored in audit hook";
1412 obj = NULL;
1413 goto error;
1414 }
1415
1416 if (hook == Py_None) {
1417 Py_DECREF(hook_args);
1418 goto default_hook;
1419 }
1420
1421 PyObject *res = _PyObject_CallOneArg(hook, hook_args);
1422 Py_DECREF(hook_args);
1423 if (res != NULL) {
1424 Py_DECREF(res);
1425 goto done;
1426 }
1427
1428 /* sys.unraisablehook failed: log its error using default hook */
1429 obj = hook;
1430 err_msg_str = NULL;
1431
1432error:
1433 /* err_msg_str and obj have been updated and we have a new exception */
1434 Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ?
1435 err_msg_str : "Exception ignored in sys.unraisablehook"));
1436 Py_XDECREF(exc_type);
1437 Py_XDECREF(exc_value);
1438 Py_XDECREF(exc_tb);
1439 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
1440
Victor Stinneref9d9b62019-05-22 11:28:22 +02001441default_hook:
1442 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001443 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1444 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001445
1446done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001447 Py_XDECREF(exc_type);
1448 Py_XDECREF(exc_value);
1449 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001450 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001451 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001452}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001453
Victor Stinner71c52e32019-05-27 08:57:14 +02001454
1455void
1456PyErr_WriteUnraisable(PyObject *obj)
1457{
1458 _PyErr_WriteUnraisableMsg(NULL, obj);
1459}
1460
1461
Armin Rigo092381a2003-10-25 14:29:27 +00001462extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001463
Guido van Rossum2fd45652001-02-28 21:46:24 +00001464
Benjamin Peterson2c539712010-09-20 22:42:10 +00001465void
Victor Stinner14e461d2013-08-26 22:28:21 +02001466PyErr_SyntaxLocation(const char *filename, int lineno)
1467{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001468 PyErr_SyntaxLocationEx(filename, lineno, -1);
1469}
1470
1471
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001472/* Set file and line information for the current exception.
1473 If the exception is not a SyntaxError, also sets additional attributes
1474 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001475
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001476void
Victor Stinner14e461d2013-08-26 22:28:21 +02001477PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001480 _Py_IDENTIFIER(filename);
1481 _Py_IDENTIFIER(lineno);
1482 _Py_IDENTIFIER(msg);
1483 _Py_IDENTIFIER(offset);
1484 _Py_IDENTIFIER(print_file_and_line);
1485 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001486 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001489 _PyErr_Fetch(tstate, &exc, &v, &tb);
1490 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 /* XXX check that it is, indeed, a syntax error. It might not
1492 * be, though. */
1493 tmp = PyLong_FromLong(lineno);
1494 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001495 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001497 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1498 _PyErr_Clear(tstate);
1499 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 Py_DECREF(tmp);
1501 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001502 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001503 if (col_offset >= 0) {
1504 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001505 if (tmp == NULL) {
1506 _PyErr_Clear(tstate);
1507 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001508 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001509 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1510 _PyErr_Clear(tstate);
1511 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001512 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001514 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1515 _PyErr_Clear(tstate);
1516 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001517
Victor Stinner14e461d2013-08-26 22:28:21 +02001518 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001520 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1521 _PyErr_Clear(tstate);
1522 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 Py_DECREF(tmp);
1524 }
1525 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001527 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 tmp = PyObject_Str(v);
1529 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001530 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1531 _PyErr_Clear(tstate);
1532 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001534 }
1535 else {
1536 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 }
1538 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001539 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1540 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001541 Py_None)) {
1542 _PyErr_Clear(tstate);
1543 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 }
1545 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001546 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001547}
1548
Victor Stinner14e461d2013-08-26 22:28:21 +02001549void
1550PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1551{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001552 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001553 PyObject *fileobj;
1554 if (filename != NULL) {
1555 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001556 if (fileobj == NULL) {
1557 _PyErr_Clear(tstate);
1558 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001559 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001560 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001561 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001562 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001563 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1564 Py_XDECREF(fileobj);
1565}
1566
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001567/* Attempt to load the line of text that the exception refers to. If it
1568 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001569
1570 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001571 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001572
Antoine Pitrou409b5382013-10-12 22:41:17 +02001573static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001574err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 int i;
1577 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 if (fp == NULL)
1580 return NULL;
1581 for (i = 0; i < lineno; i++) {
1582 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1583 do {
1584 *pLastChar = '\0';
1585 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1586 fp, NULL) == NULL)
1587 break;
1588 /* fgets read *something*; if it didn't get as
1589 far as pLastChar, it must have found a newline
1590 or hit the end of the file; if pLastChar is \n,
1591 it obviously found a newline; else we haven't
1592 yet seen a newline, so must continue */
1593 } while (*pLastChar != '\0' && *pLastChar != '\n');
1594 }
1595 fclose(fp);
1596 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001598 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001600 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 return res;
1602 }
1603 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001604}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001605
Victor Stinner14e461d2013-08-26 22:28:21 +02001606PyObject *
1607PyErr_ProgramText(const char *filename, int lineno)
1608{
1609 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001610 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001611 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001612 }
1613 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001614 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001615 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001616}
1617
1618PyObject *
1619PyErr_ProgramTextObject(PyObject *filename, int lineno)
1620{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001621 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001622 return NULL;
1623 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001624
1625 PyThreadState *tstate = _PyThreadState_GET();
1626 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1627 if (fp == NULL) {
1628 _PyErr_Clear(tstate);
1629 return NULL;
1630 }
1631 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001632}
1633
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001634#ifdef __cplusplus
1635}
1636#endif