blob: a7d40c132d7bfa2c13d3c7231b5e2da2d081998f [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 Stinner50b48572018-11-01 01:51:40 +0100221 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200222 return _PyErr_Occurred(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223}
224
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000225
226int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (err == NULL || exc == NULL) {
230 /* maybe caused by "import exceptions" that failed early on */
231 return 0;
232 }
233 if (PyTuple_Check(exc)) {
234 Py_ssize_t i, n;
235 n = PyTuple_Size(exc);
236 for (i = 0; i < n; i++) {
237 /* Test recursively */
238 if (PyErr_GivenExceptionMatches(
239 err, PyTuple_GET_ITEM(exc, i)))
240 {
241 return 1;
242 }
243 }
244 return 0;
245 }
246 /* err might be an instance, so check its class. */
247 if (PyExceptionInstance_Check(err))
248 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
scodere4c06bc2017-07-31 22:27:46 +0200251 return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 return err == exc;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000255}
Guido van Rossum743007d1999-04-21 15:27:31 +0000256
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000257
258int
Victor Stinner438a12d2019-05-24 17:01:38 +0200259_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc)
260{
261 return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc);
262}
263
264
265int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000267{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200268 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner438a12d2019-05-24 17:01:38 +0200269 return _PyErr_ExceptionMatches(tstate, exc);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000270}
271
272
xdegaye56d1f5c2017-10-26 15:09:06 +0200273#ifndef Py_NORMALIZE_RECURSION_LIMIT
274#define Py_NORMALIZE_RECURSION_LIMIT 32
275#endif
276
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000277/* Used in many places to normalize a raised exception, including in
278 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000279
280 XXX: should PyErr_NormalizeException() also call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000282*/
Victor Stinner438a12d2019-05-24 17:01:38 +0200283void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200284_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc,
285 PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000286{
Serhiy Storchakacf296532017-11-05 11:27:48 +0200287 int recursion_depth = 0;
288 PyObject *type, *value, *initial_tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000289
Serhiy Storchakacf296532017-11-05 11:27:48 +0200290 restart:
291 type = *exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 if (type == NULL) {
293 /* There was no exception, so nothing to do. */
294 return;
295 }
Guido van Rossumed473a42000-08-07 19:18:27 +0000296
Serhiy Storchakacf296532017-11-05 11:27:48 +0200297 value = *val;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 /* If PyErr_SetNone() was used, the value will have been actually
299 set to NULL.
300 */
301 if (!value) {
302 value = Py_None;
303 Py_INCREF(value);
304 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 /* Normalize the exception so that if the type is a class, the
307 value will be an instance.
308 */
309 if (PyExceptionClass_Check(type)) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200310 PyObject *inclass = NULL;
311 int is_subclass = 0;
Victor Stinner74a7fa62013-07-17 00:44:53 +0200312
Serhiy Storchakacf296532017-11-05 11:27:48 +0200313 if (PyExceptionInstance_Check(value)) {
314 inclass = PyExceptionInstance_Class(value);
315 is_subclass = PyObject_IsSubclass(inclass, type);
316 if (is_subclass < 0) {
317 goto error;
318 }
319 }
320
321 /* If the value was not an instance, or is not an instance
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 whose class is (or is derived from) type, then use the
323 value as an argument to instantiation of the type
324 class.
325 */
Serhiy Storchakacf296532017-11-05 11:27:48 +0200326 if (!is_subclass) {
327 PyObject *fixed_value = _PyErr_CreateException(type, value);
Victor Stinner3a840972016-08-22 23:59:08 +0200328 if (fixed_value == NULL) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200329 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 Py_DECREF(value);
Victor Stinner3a840972016-08-22 23:59:08 +0200332 value = fixed_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200334 /* If the class of the instance doesn't exactly match the
335 class of the type, believe the instance.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 */
337 else if (inclass != type) {
Serhiy Storchakacf296532017-11-05 11:27:48 +0200338 Py_INCREF(inclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 Py_DECREF(type);
340 type = inclass;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 }
342 }
343 *exc = type;
344 *val = value;
345 return;
Serhiy Storchakacf296532017-11-05 11:27:48 +0200346
347 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 Py_DECREF(type);
349 Py_DECREF(value);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200350 recursion_depth++;
351 if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200352 _PyErr_SetString(tstate, PyExc_RecursionError,
353 "maximum recursion depth exceeded "
354 "while normalizing an exception");
xdegaye56d1f5c2017-10-26 15:09:06 +0200355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 /* If the new exception doesn't set a traceback and the old
357 exception had a traceback, use the old traceback for the
358 new exception. It's better than nothing.
359 */
360 initial_tb = *tb;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200361 _PyErr_Fetch(tstate, exc, val, tb);
Serhiy Storchakacf296532017-11-05 11:27:48 +0200362 assert(*exc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 if (initial_tb != NULL) {
364 if (*tb == NULL)
365 *tb = initial_tb;
366 else
367 Py_DECREF(initial_tb);
368 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200369 /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the
370 corresponding RecursionError could not be normalized, and the
371 MemoryError raised when normalize this RecursionError could not be
372 normalized. */
373 if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) {
xdegaye56d1f5c2017-10-26 15:09:06 +0200374 if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) {
375 Py_FatalError("Cannot recover from MemoryErrors "
376 "while normalizing exceptions.");
377 }
378 else {
379 Py_FatalError("Cannot recover from the recursive normalization "
380 "of an exception.");
381 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 }
Serhiy Storchakacf296532017-11-05 11:27:48 +0200383 goto restart;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000384}
385
386
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200388PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389{
Victor Stinner50b48572018-11-01 01:51:40 +0100390 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200391 _PyErr_NormalizeException(tstate, exc, val, tb);
392}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000393
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200394
Victor Stinner438a12d2019-05-24 17:01:38 +0200395void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200396_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
397 PyObject **p_traceback)
398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 *p_type = tstate->curexc_type;
400 *p_value = tstate->curexc_value;
401 *p_traceback = tstate->curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 tstate->curexc_type = NULL;
404 tstate->curexc_value = NULL;
405 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406}
407
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200408
409void
410PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
411{
412 PyThreadState *tstate = _PyThreadState_GET();
413 _PyErr_Fetch(tstate, p_type, p_value, p_traceback);
414}
415
416
Victor Stinner438a12d2019-05-24 17:01:38 +0200417void
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200418_PyErr_Clear(PyThreadState *tstate)
419{
420 _PyErr_Restore(tstate, NULL, NULL, NULL);
421}
422
423
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000425PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200427 PyThreadState *tstate = _PyThreadState_GET();
428 _PyErr_Clear(tstate);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000430
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200431
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200432void
433PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
434{
Victor Stinner50b48572018-11-01 01:51:40 +0100435 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200436
Mark Shannonae3087c2017-10-22 22:41:51 +0100437 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
438 *p_type = exc_info->exc_type;
439 *p_value = exc_info->exc_value;
440 *p_traceback = exc_info->exc_traceback;
441
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200442
443 Py_XINCREF(*p_type);
444 Py_XINCREF(*p_value);
445 Py_XINCREF(*p_traceback);
446}
447
448void
449PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
450{
451 PyObject *oldtype, *oldvalue, *oldtraceback;
Victor Stinner50b48572018-11-01 01:51:40 +0100452 PyThreadState *tstate = _PyThreadState_GET();
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200453
Mark Shannonae3087c2017-10-22 22:41:51 +0100454 oldtype = tstate->exc_info->exc_type;
455 oldvalue = tstate->exc_info->exc_value;
456 oldtraceback = tstate->exc_info->exc_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200457
Mark Shannonae3087c2017-10-22 22:41:51 +0100458 tstate->exc_info->exc_type = p_type;
459 tstate->exc_info->exc_value = p_value;
460 tstate->exc_info->exc_traceback = p_traceback;
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +0200461
462 Py_XDECREF(oldtype);
463 Py_XDECREF(oldvalue);
464 Py_XDECREF(oldtraceback);
465}
466
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300467/* Like PyErr_Restore(), but if an exception is already set,
468 set the context associated with it.
469 */
470void
471_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
472{
473 if (exc == NULL)
474 return;
475
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200476 PyThreadState *tstate = _PyThreadState_GET();
477 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300478 PyObject *exc2, *val2, *tb2;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200479 _PyErr_Fetch(tstate, &exc2, &val2, &tb2);
480 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka9e373be2016-10-21 16:19:59 +0300481 if (tb != NULL) {
482 PyException_SetTraceback(val, tb);
483 Py_DECREF(tb);
484 }
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300485 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200486 _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300487 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200488 _PyErr_Restore(tstate, exc2, val2, tb2);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300489 }
490 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200491 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakae2bd2a72014-10-08 22:31:52 +0300492 }
493}
494
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300495static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200496_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception,
497 const char *format, va_list vargs)
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300498{
499 PyObject *exc, *val, *val2, *tb;
500
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200501 assert(_PyErr_Occurred(tstate));
502 _PyErr_Fetch(tstate, &exc, &val, &tb);
503 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300504 if (tb != NULL) {
505 PyException_SetTraceback(val, tb);
506 Py_DECREF(tb);
507 }
508 Py_DECREF(exc);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200509 assert(!_PyErr_Occurred(tstate));
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300510
Victor Stinner438a12d2019-05-24 17:01:38 +0200511 _PyErr_FormatV(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300512
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200513 _PyErr_Fetch(tstate, &exc, &val2, &tb);
514 _PyErr_NormalizeException(tstate, &exc, &val2, &tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300515 Py_INCREF(val);
516 PyException_SetCause(val2, val);
517 PyException_SetContext(val2, val);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200518 _PyErr_Restore(tstate, exc, val2, tb);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300519
520 return NULL;
521}
522
523PyObject *
524_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
525{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200526 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300527 va_list vargs;
528#ifdef HAVE_STDARG_PROTOTYPES
529 va_start(vargs, format);
530#else
531 va_start(vargs);
532#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200533 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300534 va_end(vargs);
535 return NULL;
536}
537
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000538/* Convenience functions to set a type error exception and return 0 */
539
540int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000542{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200543 PyThreadState *tstate = _PyThreadState_GET();
544 _PyErr_SetString(tstate, PyExc_TypeError,
545 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000547}
548
Guido van Rossum373c8691997-04-29 18:22:47 +0000549PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200550_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000551{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200552 if (Py_TYPE(PyExc_MemoryError) == NULL) {
553 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
554 initialized by _PyExc_Init() */
555 Py_FatalError("Out of memory and PyExc_MemoryError is not "
556 "initialized yet");
557 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200558 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000560}
561
Guido van Rossum373c8691997-04-29 18:22:47 +0000562PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200563PyErr_NoMemory(void)
564{
565 PyThreadState *tstate = _PyThreadState_GET();
566 return _PyErr_NoMemory(tstate);
567}
568
569PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000570PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000571{
Larry Hastingsb0827312014-02-09 22:05:19 -0800572 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
573}
574
575PyObject *
576PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
577{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200578 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200580 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100582#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000584#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000585
Guido van Rossume9fbc091995-02-18 14:52:19 +0000586#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (i == EINTR && PyErr_CheckSignals())
588 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000589#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000590
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000591#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100592 if (i != 0) {
593 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100594 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100595 }
596 else {
597 /* Sometimes errno didn't get set */
598 message = PyUnicode_FromString("Error");
599 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000600#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 if (i == 0)
602 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
603 else
604 {
605 /* Note that the Win32 errors do not lineup with the
606 errno error. So if the error is in the MSVC error
607 table, we use it, otherwise we assume it really _is_
608 a Win32 error code
609 */
610 if (i > 0 && i < _sys_nerr) {
611 message = PyUnicode_FromString(_sys_errlist[i]);
612 }
613 else {
614 int len = FormatMessageW(
615 FORMAT_MESSAGE_ALLOCATE_BUFFER |
616 FORMAT_MESSAGE_FROM_SYSTEM |
617 FORMAT_MESSAGE_IGNORE_INSERTS,
618 NULL, /* no message source */
619 i,
620 MAKELANGID(LANG_NEUTRAL,
621 SUBLANG_DEFAULT),
622 /* Default language */
623 (LPWSTR) &s_buf,
624 0, /* size not used */
625 NULL); /* no args */
626 if (len==0) {
627 /* Only ever seen this in out-of-mem
628 situations */
629 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300630 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 } else {
632 /* remove trailing cr/lf and dots */
633 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
634 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200635 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 }
637 }
638 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000639#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (message == NULL)
642 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000643#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 return NULL;
647 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000648
Larry Hastingsb0827312014-02-09 22:05:19 -0800649 if (filenameObject != NULL) {
650 if (filenameObject2 != NULL)
651 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
652 else
653 args = Py_BuildValue("(iOO)", i, message, filenameObject);
654 } else {
655 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200656 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800657 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000659
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200660 if (args != NULL) {
661 v = PyObject_Call(exc, args, NULL);
662 Py_DECREF(args);
663 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200664 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200665 Py_DECREF(v);
666 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000668#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000672}
Guido van Rossum743007d1999-04-21 15:27:31 +0000673
Barry Warsaw97d95151998-07-23 16:05:56 +0000674PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000675PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800678 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 Py_XDECREF(name);
680 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000681}
682
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000683#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000684PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000685PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000686{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200687 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800688 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 Py_XDECREF(name);
690 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000691}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000692#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000693
694PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000696{
Larry Hastingsb0827312014-02-09 22:05:19 -0800697 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000698}
Guido van Rossum683a0721990-10-21 22:09:12 +0000699
Brett Cannonbf364092006-03-01 04:25:17 +0000700#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000701/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000702PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 PyObject *exc,
704 int ierr,
705 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000706{
Larry Hastingsb0827312014-02-09 22:05:19 -0800707 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
708 filenameObject, NULL);
709}
710
711PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
712 PyObject *exc,
713 int ierr,
714 PyObject *filenameObject,
715 PyObject *filenameObject2)
716{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200717 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 int len;
719 WCHAR *s_buf = NULL; /* Free via LocalFree */
720 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200721 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200724 if (err==0) {
725 err = GetLastError();
726 }
727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 len = FormatMessageW(
729 /* Error API error */
730 FORMAT_MESSAGE_ALLOCATE_BUFFER |
731 FORMAT_MESSAGE_FROM_SYSTEM |
732 FORMAT_MESSAGE_IGNORE_INSERTS,
733 NULL, /* no message source */
734 err,
735 MAKELANGID(LANG_NEUTRAL,
736 SUBLANG_DEFAULT), /* Default language */
737 (LPWSTR) &s_buf,
738 0, /* size not used */
739 NULL); /* no args */
740 if (len==0) {
741 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300742 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 s_buf = NULL;
744 } else {
745 /* remove trailing cr/lf and dots */
746 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
747 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200748 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 if (message == NULL)
752 {
753 LocalFree(s_buf);
754 return NULL;
755 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000756
Larry Hastingsb0827312014-02-09 22:05:19 -0800757 if (filenameObject == NULL) {
758 assert(filenameObject2 == NULL);
759 filenameObject = filenameObject2 = Py_None;
760 }
761 else if (filenameObject2 == NULL)
762 filenameObject2 = Py_None;
763 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200764 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800765 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000767
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200768 if (args != NULL) {
769 v = PyObject_Call(exc, args, NULL);
770 Py_DECREF(args);
771 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200772 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200773 Py_DECREF(v);
774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 }
776 LocalFree(s_buf);
777 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000778}
779
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000780PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 PyObject *exc,
782 int ierr,
783 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000784{
Victor Stinner92be9392010-12-28 00:28:21 +0000785 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800786 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800788 name,
789 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 Py_XDECREF(name);
791 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000792}
793
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000794PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 PyObject *exc,
796 int ierr,
797 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000798{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200799 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800800 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800802 name,
803 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 Py_XDECREF(name);
805 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000806}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000807
Thomas Heller085358a2002-07-29 14:27:41 +0000808PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
809{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800810 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000811}
812
Guido van Rossum795e1892000-02-17 15:19:15 +0000813PyObject *PyErr_SetFromWindowsErr(int ierr)
814{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800815 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
816 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800817}
818
Thomas Heller085358a2002-07-29 14:27:41 +0000819PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 int ierr,
821 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000822{
Victor Stinner92be9392010-12-28 00:28:21 +0000823 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800824 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200825 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800826 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 Py_XDECREF(name);
828 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000829}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000830
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000831PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 int ierr,
833 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000834{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200835 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800836 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200837 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800838 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 Py_XDECREF(name);
840 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000841}
Guido van Rossum795e1892000-02-17 15:19:15 +0000842#endif /* MS_WINDOWS */
843
Brett Cannon79ec55e2012-04-12 20:24:54 -0400844PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700845PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
846 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400847{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200848 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700849 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200850 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500851
Eric Snow46f97b82016-09-07 16:56:15 -0700852 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
853 if (issubclass < 0) {
854 return NULL;
855 }
856 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200857 _PyErr_SetString(tstate, PyExc_TypeError,
858 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500859 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200860 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500861
Eric Snow46f97b82016-09-07 16:56:15 -0700862 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200863 _PyErr_SetString(tstate, PyExc_TypeError,
864 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500865 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400866 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500867
Brian Curtin94c001b2012-04-18 08:30:51 -0500868 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500869 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500870 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500871 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500872 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500873 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500874
Eric Snow46f97b82016-09-07 16:56:15 -0700875 kwargs = PyDict_New();
876 if (kwargs == NULL) {
877 return NULL;
878 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200879 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300880 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200881 }
882 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300883 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200884 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400885
Eric Snow46f97b82016-09-07 16:56:15 -0700886 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400887 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200888 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500889 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400890 }
891
Berker Peksagec766d32016-05-01 09:06:36 +0300892done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400893 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500894 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400895}
896
Eric Snow46f97b82016-09-07 16:56:15 -0700897PyObject *
898PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
899{
900 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
901}
902
Guido van Rossum683a0721990-10-21 22:09:12 +0000903void
Neal Norwitzb382b842007-08-24 20:00:37 +0000904_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000905{
Victor Stinner438a12d2019-05-24 17:01:38 +0200906 PyThreadState *tstate = _PyThreadState_GET();
907 _PyErr_Format(tstate, PyExc_SystemError,
908 "%s:%d: bad argument to internal function",
909 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000910}
911
912/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
913 export the entry point for existing object code: */
914#undef PyErr_BadInternalCall
915void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000916PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000917{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200918 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200919 PyThreadState *tstate = _PyThreadState_GET();
920 _PyErr_SetString(tstate, PyExc_SystemError,
921 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000922}
Fred Drake6d63adf2000-08-24 22:38:39 +0000923#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
924
Guido van Rossum1548bac1997-02-14 17:09:47 +0000925
Victor Stinner438a12d2019-05-24 17:01:38 +0200926static PyObject *
927_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
928 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000931
Victor Stinnerde821be2015-03-24 12:41:23 +0100932 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
933 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200934 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100937
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200938 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000941}
Guido van Rossum7617e051997-09-16 18:43:50 +0000942
943
Antoine Pitrou0676a402014-09-30 21:16:27 +0200944PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200945PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
946{
947 PyThreadState *tstate = _PyThreadState_GET();
948 return _PyErr_FormatV(tstate, exception, format, vargs);
949}
950
951
952PyObject *
953_PyErr_Format(PyThreadState *tstate, PyObject *exception,
954 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200955{
956 va_list vargs;
957#ifdef HAVE_STDARG_PROTOTYPES
958 va_start(vargs, format);
959#else
960 va_start(vargs);
961#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200962 _PyErr_FormatV(tstate, exception, format, vargs);
963 va_end(vargs);
964 return NULL;
965}
966
967
968PyObject *
969PyErr_Format(PyObject *exception, const char *format, ...)
970{
971 PyThreadState *tstate = _PyThreadState_GET();
972 va_list vargs;
973#ifdef HAVE_STDARG_PROTOTYPES
974 va_start(vargs, format);
975#else
976 va_start(vargs);
977#endif
978 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +0200979 va_end(vargs);
980 return NULL;
981}
982
Thomas Wouters477c8d52006-05-27 19:21:47 +0000983
Guido van Rossum7617e051997-09-16 18:43:50 +0000984PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000985PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000986{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200987 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200988 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 PyObject *modulename = NULL;
990 PyObject *classname = NULL;
991 PyObject *mydict = NULL;
992 PyObject *bases = NULL;
993 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200994
995 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200997 _PyErr_SetString(tstate, PyExc_SystemError,
998 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 return NULL;
1000 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001001 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001003 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 if (dict == NULL) {
1005 dict = mydict = PyDict_New();
1006 if (dict == NULL)
1007 goto failure;
1008 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001009
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001010 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001011 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001012 goto failure;
1013 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 modulename = PyUnicode_FromStringAndSize(name,
1015 (Py_ssize_t)(dot-name));
1016 if (modulename == NULL)
1017 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001018 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 goto failure;
1020 }
1021 if (PyTuple_Check(base)) {
1022 bases = base;
1023 /* INCREF as we create a new ref in the else branch */
1024 Py_INCREF(bases);
1025 } else {
1026 bases = PyTuple_Pack(1, base);
1027 if (bases == NULL)
1028 goto failure;
1029 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001030 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001031 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001033 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 Py_XDECREF(bases);
1035 Py_XDECREF(mydict);
1036 Py_XDECREF(classname);
1037 Py_XDECREF(modulename);
1038 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001039}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001040
Georg Brandl1e28a272009-12-28 08:41:01 +00001041
1042/* Create an exception with docstring */
1043PyObject *
1044PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 int result;
1048 PyObject *ret = NULL;
1049 PyObject *mydict = NULL; /* points to the dict only if we create it */
1050 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 if (dict == NULL) {
1053 dict = mydict = PyDict_New();
1054 if (dict == NULL) {
1055 return NULL;
1056 }
1057 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (doc != NULL) {
1060 docobj = PyUnicode_FromString(doc);
1061 if (docobj == NULL)
1062 goto failure;
1063 result = PyDict_SetItemString(dict, "__doc__", docobj);
1064 Py_DECREF(docobj);
1065 if (result < 0)
1066 goto failure;
1067 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001070 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 Py_XDECREF(mydict);
1072 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001073}
1074
1075
Victor Stinneref9d9b62019-05-22 11:28:22 +02001076PyDoc_STRVAR(UnraisableHookArgs__doc__,
1077"UnraisableHookArgs\n\
1078\n\
1079Type used to pass arguments to sys.unraisablehook.");
1080
1081static PyTypeObject UnraisableHookArgsType;
1082
1083static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1084 {"exc_type", "Exception type"},
1085 {"exc_value", "Exception value"},
1086 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001087 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001088 {"object", "Object causing the exception"},
1089 {0}
1090};
1091
1092static PyStructSequence_Desc UnraisableHookArgs_desc = {
1093 .name = "UnraisableHookArgs",
1094 .doc = UnraisableHookArgs__doc__,
1095 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001096 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001097};
1098
1099
Victor Stinner331a6a52019-05-27 16:39:22 +02001100PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001101_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001102{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001103 if (UnraisableHookArgsType.tp_name == NULL) {
1104 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1105 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001106 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001107 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001108 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001109 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001110}
1111
1112
1113static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001114make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001115 PyObject *exc_value, PyObject *exc_tb,
1116 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001117{
1118 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1119 if (args == NULL) {
1120 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001122
Victor Stinneref9d9b62019-05-22 11:28:22 +02001123 Py_ssize_t pos = 0;
1124#define ADD_ITEM(exc_type) \
1125 do { \
1126 if (exc_type == NULL) { \
1127 exc_type = Py_None; \
1128 } \
1129 Py_INCREF(exc_type); \
1130 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1131 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001132
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001133
Victor Stinneref9d9b62019-05-22 11:28:22 +02001134 ADD_ITEM(exc_type);
1135 ADD_ITEM(exc_value);
1136 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001137 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001138 ADD_ITEM(obj);
1139#undef ADD_ITEM
1140
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001141 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001142 Py_DECREF(args);
1143 return NULL;
1144 }
1145 return args;
1146}
1147
1148
1149
1150/* Default implementation of sys.unraisablehook.
1151
1152 It can be called to log the exception of a custom sys.unraisablehook.
1153
1154 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1155static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001156write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1157 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001158 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001159{
1160 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001161 if (err_msg != NULL && err_msg != Py_None) {
1162 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1163 return -1;
1164 }
1165 if (PyFile_WriteString(": ", file) < 0) {
1166 return -1;
1167 }
1168 }
1169 else {
1170 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1171 return -1;
1172 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001173 }
1174
1175 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001176 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001177 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1178 return -1;
1179 }
1180 }
1181 if (PyFile_WriteString("\n", file) < 0) {
1182 return -1;
1183 }
1184 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001185 else if (err_msg != NULL && err_msg != Py_None) {
1186 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1187 return -1;
1188 }
1189 if (PyFile_WriteString(":\n", file) < 0) {
1190 return -1;
1191 }
1192 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001193
1194 if (exc_tb != NULL && exc_tb != Py_None) {
1195 if (PyTraceBack_Print(exc_tb, file) < 0) {
1196 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001197 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001198 }
1199 }
1200
Victor Stinnerdf22c032019-05-23 01:00:58 +02001201 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001202 return -1;
1203 }
1204
1205 assert(PyExceptionClass_Check(exc_type));
1206 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001207 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001208 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001209 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001210 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001211 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001212 }
1213
Victor Stinneref9d9b62019-05-22 11:28:22 +02001214 _Py_IDENTIFIER(__module__);
1215 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001216 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001217 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001218 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001219 if (PyFile_WriteString("<unknown>", file) < 0) {
1220 return -1;
1221 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001222 }
1223 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001224 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001225 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1226 Py_DECREF(moduleName);
1227 return -1;
1228 }
1229 Py_DECREF(moduleName);
1230 if (PyFile_WriteString(".", file) < 0) {
1231 return -1;
1232 }
1233 }
1234 else {
1235 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001236 }
1237 }
1238 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001239 if (PyFile_WriteString("<unknown>", file) < 0) {
1240 return -1;
1241 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001242 }
1243 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001244 if (PyFile_WriteString(className, file) < 0) {
1245 return -1;
1246 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001247 }
1248
Victor Stinneref9d9b62019-05-22 11:28:22 +02001249 if (exc_value && exc_value != Py_None) {
1250 if (PyFile_WriteString(": ", file) < 0) {
1251 return -1;
1252 }
1253 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001254 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001255 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1256 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001257 }
1258 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001259 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001260
Victor Stinneref9d9b62019-05-22 11:28:22 +02001261 if (PyFile_WriteString("\n", file) < 0) {
1262 return -1;
1263 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001264
1265 /* Explicitly call file.flush() */
1266 PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL);
1267 if (!res) {
1268 return -1;
1269 }
1270 Py_DECREF(res);
1271
Victor Stinneref9d9b62019-05-22 11:28:22 +02001272 return 0;
1273}
1274
1275
1276static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001277write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001278 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1279 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001280{
1281 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1282 if (file == NULL || file == Py_None) {
1283 return 0;
1284 }
1285
1286 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1287 while we use it */
1288 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001289 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001290 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001291 Py_DECREF(file);
1292
1293 return res;
1294}
1295
1296
1297PyObject*
1298_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1299{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001300 PyThreadState *tstate = _PyThreadState_GET();
1301
Victor Stinneref9d9b62019-05-22 11:28:22 +02001302 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001303 _PyErr_SetString(tstate, PyExc_TypeError,
1304 "sys.unraisablehook argument type "
1305 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001306 return NULL;
1307 }
1308
1309 /* Borrowed references */
1310 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1311 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1312 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001313 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1314 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001315
Victor Stinner71c52e32019-05-27 08:57:14 +02001316 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001317 return NULL;
1318 }
1319 Py_RETURN_NONE;
1320}
1321
1322
1323/* Call sys.unraisablehook().
1324
1325 This function can be used when an exception has occurred but there is no way
1326 for Python to handle it. For example, when a destructor raises an exception
1327 or during garbage collection (gc.collect()).
1328
Victor Stinner71c52e32019-05-27 08:57:14 +02001329 If err_msg_str is non-NULL, the error message is formatted as:
1330 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1331 error message.
1332
Victor Stinneref9d9b62019-05-22 11:28:22 +02001333 An exception must be set when calling this function. */
1334void
Victor Stinner71c52e32019-05-27 08:57:14 +02001335_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001336{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001337 PyThreadState *tstate = _PyThreadState_GET();
1338 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001339
Victor Stinner71c52e32019-05-27 08:57:14 +02001340 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001341 PyObject *exc_type, *exc_value, *exc_tb;
1342 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001343
1344 assert(exc_type != NULL);
1345
1346 if (exc_type == NULL) {
1347 /* sys.unraisablehook requires that at least exc_type is set */
1348 goto default_hook;
1349 }
1350
Victor Stinnerdf22c032019-05-23 01:00:58 +02001351 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001352 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001353 if (frame != NULL) {
1354 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1355 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001356 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001357 }
1358 }
1359 }
1360
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001361 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001362
1363 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1364 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001365 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001366 }
1367 }
1368
Victor Stinner71c52e32019-05-27 08:57:14 +02001369 if (err_msg_str != NULL) {
1370 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1371 if (err_msg == NULL) {
1372 PyErr_Clear();
1373 }
1374 }
1375
Victor Stinneref9d9b62019-05-22 11:28:22 +02001376 _Py_IDENTIFIER(unraisablehook);
1377 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
1378 if (hook != NULL && hook != Py_None) {
1379 PyObject *hook_args;
1380
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001381 hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value,
Victor Stinner71c52e32019-05-27 08:57:14 +02001382 exc_tb, err_msg, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001383 if (hook_args != NULL) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001384 PyObject *res = _PyObject_CallOneArg(hook, hook_args);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001385 Py_DECREF(hook_args);
1386 if (res != NULL) {
1387 Py_DECREF(res);
1388 goto done;
1389 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001390
1391 err_msg_str = "Exception ignored in sys.unraisablehook";
1392 }
1393 else {
1394 err_msg_str = ("Exception ignored on building "
1395 "sys.unraisablehook arguments");
1396 }
1397
1398 Py_XDECREF(err_msg);
1399 err_msg = PyUnicode_FromString(err_msg_str);
1400 if (err_msg == NULL) {
1401 PyErr_Clear();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001402 }
1403
1404 /* sys.unraisablehook failed: log its error using default hook */
1405 Py_XDECREF(exc_type);
1406 Py_XDECREF(exc_value);
1407 Py_XDECREF(exc_tb);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001408 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001409
1410 obj = hook;
1411 }
1412
1413default_hook:
1414 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001415 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1416 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001417
1418done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001419 Py_XDECREF(exc_type);
1420 Py_XDECREF(exc_value);
1421 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001422 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001423 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001424}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001425
Victor Stinner71c52e32019-05-27 08:57:14 +02001426
1427void
1428PyErr_WriteUnraisable(PyObject *obj)
1429{
1430 _PyErr_WriteUnraisableMsg(NULL, obj);
1431}
1432
1433
Armin Rigo092381a2003-10-25 14:29:27 +00001434extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001435
Guido van Rossum2fd45652001-02-28 21:46:24 +00001436
Benjamin Peterson2c539712010-09-20 22:42:10 +00001437void
Victor Stinner14e461d2013-08-26 22:28:21 +02001438PyErr_SyntaxLocation(const char *filename, int lineno)
1439{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001440 PyErr_SyntaxLocationEx(filename, lineno, -1);
1441}
1442
1443
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001444/* Set file and line information for the current exception.
1445 If the exception is not a SyntaxError, also sets additional attributes
1446 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001447
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001448void
Victor Stinner14e461d2013-08-26 22:28:21 +02001449PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001452 _Py_IDENTIFIER(filename);
1453 _Py_IDENTIFIER(lineno);
1454 _Py_IDENTIFIER(msg);
1455 _Py_IDENTIFIER(offset);
1456 _Py_IDENTIFIER(print_file_and_line);
1457 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001458 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001461 _PyErr_Fetch(tstate, &exc, &v, &tb);
1462 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 /* XXX check that it is, indeed, a syntax error. It might not
1464 * be, though. */
1465 tmp = PyLong_FromLong(lineno);
1466 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001467 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001469 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1470 _PyErr_Clear(tstate);
1471 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_DECREF(tmp);
1473 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001474 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001475 if (col_offset >= 0) {
1476 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001477 if (tmp == NULL) {
1478 _PyErr_Clear(tstate);
1479 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001480 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001481 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1482 _PyErr_Clear(tstate);
1483 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001484 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001486 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1487 _PyErr_Clear(tstate);
1488 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001489
Victor Stinner14e461d2013-08-26 22:28:21 +02001490 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001492 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1493 _PyErr_Clear(tstate);
1494 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 Py_DECREF(tmp);
1496 }
1497 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001499 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 tmp = PyObject_Str(v);
1501 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001502 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1503 _PyErr_Clear(tstate);
1504 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001506 }
1507 else {
1508 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 }
1510 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001511 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1512 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001513 Py_None)) {
1514 _PyErr_Clear(tstate);
1515 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 }
1517 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001518 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001519}
1520
Victor Stinner14e461d2013-08-26 22:28:21 +02001521void
1522PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1523{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001524 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001525 PyObject *fileobj;
1526 if (filename != NULL) {
1527 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001528 if (fileobj == NULL) {
1529 _PyErr_Clear(tstate);
1530 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001531 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001532 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001533 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001534 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001535 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1536 Py_XDECREF(fileobj);
1537}
1538
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001539/* Attempt to load the line of text that the exception refers to. If it
1540 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001541
1542 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001543 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001544
Antoine Pitrou409b5382013-10-12 22:41:17 +02001545static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001546err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 int i;
1549 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 if (fp == NULL)
1552 return NULL;
1553 for (i = 0; i < lineno; i++) {
1554 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1555 do {
1556 *pLastChar = '\0';
1557 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1558 fp, NULL) == NULL)
1559 break;
1560 /* fgets read *something*; if it didn't get as
1561 far as pLastChar, it must have found a newline
1562 or hit the end of the file; if pLastChar is \n,
1563 it obviously found a newline; else we haven't
1564 yet seen a newline, so must continue */
1565 } while (*pLastChar != '\0' && *pLastChar != '\n');
1566 }
1567 fclose(fp);
1568 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001570 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001572 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 return res;
1574 }
1575 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001576}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001577
Victor Stinner14e461d2013-08-26 22:28:21 +02001578PyObject *
1579PyErr_ProgramText(const char *filename, int lineno)
1580{
1581 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001582 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001583 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001584 }
1585 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001586 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001587 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001588}
1589
1590PyObject *
1591PyErr_ProgramTextObject(PyObject *filename, int lineno)
1592{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001593 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001594 return NULL;
1595 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001596
1597 PyThreadState *tstate = _PyThreadState_GET();
1598 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1599 if (fp == NULL) {
1600 _PyErr_Clear(tstate);
1601 return NULL;
1602 }
1603 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001604}
1605
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001606#ifdef __cplusplus
1607}
1608#endif