blob: 8a94afdd8c41015314b4c0b2f781abe2f00183c6 [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 {
Victor Stinner7bfb42d2016-12-05 17:04:32 +010096 return PyObject_CallFunctionObjArgs(exception, value, NULL);
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 *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000550PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000551{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200552 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf54a5742013-07-22 22:28:37 +0200553 if (Py_TYPE(PyExc_MemoryError) == NULL) {
554 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
555 initialized by _PyExc_Init() */
556 Py_FatalError("Out of memory and PyExc_MemoryError is not "
557 "initialized yet");
558 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200559 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000561}
562
Guido van Rossum373c8691997-04-29 18:22:47 +0000563PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000564PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000565{
Larry Hastingsb0827312014-02-09 22:05:19 -0800566 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
567}
568
569PyObject *
570PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
571{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200572 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200574 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100576#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000578#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000579
Guido van Rossume9fbc091995-02-18 14:52:19 +0000580#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (i == EINTR && PyErr_CheckSignals())
582 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000583#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000584
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000585#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100586 if (i != 0) {
587 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100588 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100589 }
590 else {
591 /* Sometimes errno didn't get set */
592 message = PyUnicode_FromString("Error");
593 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000594#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 if (i == 0)
596 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
597 else
598 {
599 /* Note that the Win32 errors do not lineup with the
600 errno error. So if the error is in the MSVC error
601 table, we use it, otherwise we assume it really _is_
602 a Win32 error code
603 */
604 if (i > 0 && i < _sys_nerr) {
605 message = PyUnicode_FromString(_sys_errlist[i]);
606 }
607 else {
608 int len = FormatMessageW(
609 FORMAT_MESSAGE_ALLOCATE_BUFFER |
610 FORMAT_MESSAGE_FROM_SYSTEM |
611 FORMAT_MESSAGE_IGNORE_INSERTS,
612 NULL, /* no message source */
613 i,
614 MAKELANGID(LANG_NEUTRAL,
615 SUBLANG_DEFAULT),
616 /* Default language */
617 (LPWSTR) &s_buf,
618 0, /* size not used */
619 NULL); /* no args */
620 if (len==0) {
621 /* Only ever seen this in out-of-mem
622 situations */
623 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300624 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 } else {
626 /* remove trailing cr/lf and dots */
627 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
628 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200629 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 }
631 }
632 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000633#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 if (message == NULL)
636 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000637#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 return NULL;
641 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000642
Larry Hastingsb0827312014-02-09 22:05:19 -0800643 if (filenameObject != NULL) {
644 if (filenameObject2 != NULL)
645 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
646 else
647 args = Py_BuildValue("(iOO)", i, message, filenameObject);
648 } else {
649 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200650 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000653
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200654 if (args != NULL) {
655 v = PyObject_Call(exc, args, NULL);
656 Py_DECREF(args);
657 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200658 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200659 Py_DECREF(v);
660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000662#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000666}
Guido van Rossum743007d1999-04-21 15:27:31 +0000667
Barry Warsaw97d95151998-07-23 16:05:56 +0000668PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000669PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800672 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_XDECREF(name);
674 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000675}
676
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000677#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000678PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000679PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000680{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200681 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800682 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_XDECREF(name);
684 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000685}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000686#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000687
688PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000689PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000690{
Larry Hastingsb0827312014-02-09 22:05:19 -0800691 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000692}
Guido van Rossum683a0721990-10-21 22:09:12 +0000693
Brett Cannonbf364092006-03-01 04:25:17 +0000694#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000695/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000696PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyObject *exc,
698 int ierr,
699 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000700{
Larry Hastingsb0827312014-02-09 22:05:19 -0800701 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
702 filenameObject, NULL);
703}
704
705PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
706 PyObject *exc,
707 int ierr,
708 PyObject *filenameObject,
709 PyObject *filenameObject2)
710{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200711 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 int len;
713 WCHAR *s_buf = NULL; /* Free via LocalFree */
714 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200715 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200718 if (err==0) {
719 err = GetLastError();
720 }
721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 len = FormatMessageW(
723 /* Error API error */
724 FORMAT_MESSAGE_ALLOCATE_BUFFER |
725 FORMAT_MESSAGE_FROM_SYSTEM |
726 FORMAT_MESSAGE_IGNORE_INSERTS,
727 NULL, /* no message source */
728 err,
729 MAKELANGID(LANG_NEUTRAL,
730 SUBLANG_DEFAULT), /* Default language */
731 (LPWSTR) &s_buf,
732 0, /* size not used */
733 NULL); /* no args */
734 if (len==0) {
735 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300736 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 s_buf = NULL;
738 } else {
739 /* remove trailing cr/lf and dots */
740 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
741 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200742 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 if (message == NULL)
746 {
747 LocalFree(s_buf);
748 return NULL;
749 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000750
Larry Hastingsb0827312014-02-09 22:05:19 -0800751 if (filenameObject == NULL) {
752 assert(filenameObject2 == NULL);
753 filenameObject = filenameObject2 = Py_None;
754 }
755 else if (filenameObject2 == NULL)
756 filenameObject2 = Py_None;
757 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200758 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800759 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000761
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200762 if (args != NULL) {
763 v = PyObject_Call(exc, args, NULL);
764 Py_DECREF(args);
765 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200766 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200767 Py_DECREF(v);
768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 }
770 LocalFree(s_buf);
771 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000772}
773
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000774PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 PyObject *exc,
776 int ierr,
777 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000778{
Victor Stinner92be9392010-12-28 00:28:21 +0000779 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800780 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800782 name,
783 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 Py_XDECREF(name);
785 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000786}
787
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000788PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 PyObject *exc,
790 int ierr,
791 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000792{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200793 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800794 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800796 name,
797 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 Py_XDECREF(name);
799 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000800}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000801
Thomas Heller085358a2002-07-29 14:27:41 +0000802PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
803{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800804 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000805}
806
Guido van Rossum795e1892000-02-17 15:19:15 +0000807PyObject *PyErr_SetFromWindowsErr(int ierr)
808{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800809 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
810 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800811}
812
Thomas Heller085358a2002-07-29 14:27:41 +0000813PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 int ierr,
815 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000816{
Victor Stinner92be9392010-12-28 00:28:21 +0000817 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800818 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200819 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800820 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 Py_XDECREF(name);
822 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000823}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000824
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000825PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 int ierr,
827 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000828{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200829 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800830 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200831 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800832 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 Py_XDECREF(name);
834 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000835}
Guido van Rossum795e1892000-02-17 15:19:15 +0000836#endif /* MS_WINDOWS */
837
Brett Cannon79ec55e2012-04-12 20:24:54 -0400838PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700839PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
840 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400841{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200842 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700843 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200844 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500845
Eric Snow46f97b82016-09-07 16:56:15 -0700846 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
847 if (issubclass < 0) {
848 return NULL;
849 }
850 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200851 _PyErr_SetString(tstate, PyExc_TypeError,
852 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500853 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200854 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500855
Eric Snow46f97b82016-09-07 16:56:15 -0700856 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200857 _PyErr_SetString(tstate, PyExc_TypeError,
858 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500859 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400860 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500861
Brian Curtin94c001b2012-04-18 08:30:51 -0500862 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500863 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500864 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500865 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500866 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500867 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500868
Eric Snow46f97b82016-09-07 16:56:15 -0700869 kwargs = PyDict_New();
870 if (kwargs == NULL) {
871 return NULL;
872 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200873 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300874 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200875 }
876 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300877 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200878 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400879
Eric Snow46f97b82016-09-07 16:56:15 -0700880 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400881 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200882 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500883 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400884 }
885
Berker Peksagec766d32016-05-01 09:06:36 +0300886done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400887 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500888 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400889}
890
Eric Snow46f97b82016-09-07 16:56:15 -0700891PyObject *
892PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
893{
894 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
895}
896
Guido van Rossum683a0721990-10-21 22:09:12 +0000897void
Neal Norwitzb382b842007-08-24 20:00:37 +0000898_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000899{
Victor Stinner438a12d2019-05-24 17:01:38 +0200900 PyThreadState *tstate = _PyThreadState_GET();
901 _PyErr_Format(tstate, PyExc_SystemError,
902 "%s:%d: bad argument to internal function",
903 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000904}
905
906/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
907 export the entry point for existing object code: */
908#undef PyErr_BadInternalCall
909void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000910PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000911{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200912 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200913 PyThreadState *tstate = _PyThreadState_GET();
914 _PyErr_SetString(tstate, PyExc_SystemError,
915 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000916}
Fred Drake6d63adf2000-08-24 22:38:39 +0000917#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
918
Guido van Rossum1548bac1997-02-14 17:09:47 +0000919
Victor Stinner438a12d2019-05-24 17:01:38 +0200920static PyObject *
921_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
922 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000925
Victor Stinnerde821be2015-03-24 12:41:23 +0100926 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
927 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200928 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100931
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200932 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000935}
Guido van Rossum7617e051997-09-16 18:43:50 +0000936
937
Antoine Pitrou0676a402014-09-30 21:16:27 +0200938PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200939PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
940{
941 PyThreadState *tstate = _PyThreadState_GET();
942 return _PyErr_FormatV(tstate, exception, format, vargs);
943}
944
945
946PyObject *
947_PyErr_Format(PyThreadState *tstate, PyObject *exception,
948 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200949{
950 va_list vargs;
951#ifdef HAVE_STDARG_PROTOTYPES
952 va_start(vargs, format);
953#else
954 va_start(vargs);
955#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200956 _PyErr_FormatV(tstate, exception, format, vargs);
957 va_end(vargs);
958 return NULL;
959}
960
961
962PyObject *
963PyErr_Format(PyObject *exception, const char *format, ...)
964{
965 PyThreadState *tstate = _PyThreadState_GET();
966 va_list vargs;
967#ifdef HAVE_STDARG_PROTOTYPES
968 va_start(vargs, format);
969#else
970 va_start(vargs);
971#endif
972 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +0200973 va_end(vargs);
974 return NULL;
975}
976
Thomas Wouters477c8d52006-05-27 19:21:47 +0000977
Guido van Rossum7617e051997-09-16 18:43:50 +0000978PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000979PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000980{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200981 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200982 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 PyObject *modulename = NULL;
984 PyObject *classname = NULL;
985 PyObject *mydict = NULL;
986 PyObject *bases = NULL;
987 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200988
989 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200991 _PyErr_SetString(tstate, PyExc_SystemError,
992 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 return NULL;
994 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200995 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200997 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 if (dict == NULL) {
999 dict = mydict = PyDict_New();
1000 if (dict == NULL)
1001 goto failure;
1002 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001003
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001004 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001005 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001006 goto failure;
1007 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 modulename = PyUnicode_FromStringAndSize(name,
1009 (Py_ssize_t)(dot-name));
1010 if (modulename == NULL)
1011 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001012 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 goto failure;
1014 }
1015 if (PyTuple_Check(base)) {
1016 bases = base;
1017 /* INCREF as we create a new ref in the else branch */
1018 Py_INCREF(bases);
1019 } else {
1020 bases = PyTuple_Pack(1, base);
1021 if (bases == NULL)
1022 goto failure;
1023 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001024 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001025 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001027 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 Py_XDECREF(bases);
1029 Py_XDECREF(mydict);
1030 Py_XDECREF(classname);
1031 Py_XDECREF(modulename);
1032 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001033}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001034
Georg Brandl1e28a272009-12-28 08:41:01 +00001035
1036/* Create an exception with docstring */
1037PyObject *
1038PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 int result;
1042 PyObject *ret = NULL;
1043 PyObject *mydict = NULL; /* points to the dict only if we create it */
1044 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 if (dict == NULL) {
1047 dict = mydict = PyDict_New();
1048 if (dict == NULL) {
1049 return NULL;
1050 }
1051 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 if (doc != NULL) {
1054 docobj = PyUnicode_FromString(doc);
1055 if (docobj == NULL)
1056 goto failure;
1057 result = PyDict_SetItemString(dict, "__doc__", docobj);
1058 Py_DECREF(docobj);
1059 if (result < 0)
1060 goto failure;
1061 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001064 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 Py_XDECREF(mydict);
1066 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001067}
1068
1069
Victor Stinneref9d9b62019-05-22 11:28:22 +02001070PyDoc_STRVAR(UnraisableHookArgs__doc__,
1071"UnraisableHookArgs\n\
1072\n\
1073Type used to pass arguments to sys.unraisablehook.");
1074
1075static PyTypeObject UnraisableHookArgsType;
1076
1077static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1078 {"exc_type", "Exception type"},
1079 {"exc_value", "Exception value"},
1080 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001081 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001082 {"object", "Object causing the exception"},
1083 {0}
1084};
1085
1086static PyStructSequence_Desc UnraisableHookArgs_desc = {
1087 .name = "UnraisableHookArgs",
1088 .doc = UnraisableHookArgs__doc__,
1089 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001090 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001091};
1092
1093
Victor Stinner331a6a52019-05-27 16:39:22 +02001094PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001095_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001096{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001097 if (UnraisableHookArgsType.tp_name == NULL) {
1098 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1099 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001100 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001101 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001102 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001103 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001104}
1105
1106
1107static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001108make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001109 PyObject *exc_value, PyObject *exc_tb,
1110 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001111{
1112 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1113 if (args == NULL) {
1114 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001116
Victor Stinneref9d9b62019-05-22 11:28:22 +02001117 Py_ssize_t pos = 0;
1118#define ADD_ITEM(exc_type) \
1119 do { \
1120 if (exc_type == NULL) { \
1121 exc_type = Py_None; \
1122 } \
1123 Py_INCREF(exc_type); \
1124 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1125 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001126
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001127
Victor Stinneref9d9b62019-05-22 11:28:22 +02001128 ADD_ITEM(exc_type);
1129 ADD_ITEM(exc_value);
1130 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001131 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001132 ADD_ITEM(obj);
1133#undef ADD_ITEM
1134
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001135 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001136 Py_DECREF(args);
1137 return NULL;
1138 }
1139 return args;
1140}
1141
1142
1143
1144/* Default implementation of sys.unraisablehook.
1145
1146 It can be called to log the exception of a custom sys.unraisablehook.
1147
1148 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1149static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001150write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1151 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001152 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001153{
1154 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001155 if (err_msg != NULL && err_msg != Py_None) {
1156 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1157 return -1;
1158 }
1159 if (PyFile_WriteString(": ", file) < 0) {
1160 return -1;
1161 }
1162 }
1163 else {
1164 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1165 return -1;
1166 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001167 }
1168
1169 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001170 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001171 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1172 return -1;
1173 }
1174 }
1175 if (PyFile_WriteString("\n", file) < 0) {
1176 return -1;
1177 }
1178 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001179 else 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(":\n", file) < 0) {
1184 return -1;
1185 }
1186 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001187
1188 if (exc_tb != NULL && exc_tb != Py_None) {
1189 if (PyTraceBack_Print(exc_tb, file) < 0) {
1190 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001191 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001192 }
1193 }
1194
Victor Stinnerdf22c032019-05-23 01:00:58 +02001195 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001196 return -1;
1197 }
1198
1199 assert(PyExceptionClass_Check(exc_type));
1200 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001201 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001202 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001203 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001204 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001205 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001206 }
1207
Victor Stinneref9d9b62019-05-22 11:28:22 +02001208 _Py_IDENTIFIER(__module__);
1209 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001210 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001211 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001212 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001213 if (PyFile_WriteString("<unknown>", file) < 0) {
1214 return -1;
1215 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001216 }
1217 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001218 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001219 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1220 Py_DECREF(moduleName);
1221 return -1;
1222 }
1223 Py_DECREF(moduleName);
1224 if (PyFile_WriteString(".", file) < 0) {
1225 return -1;
1226 }
1227 }
1228 else {
1229 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001230 }
1231 }
1232 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001233 if (PyFile_WriteString("<unknown>", file) < 0) {
1234 return -1;
1235 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001236 }
1237 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001238 if (PyFile_WriteString(className, file) < 0) {
1239 return -1;
1240 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001241 }
1242
Victor Stinneref9d9b62019-05-22 11:28:22 +02001243 if (exc_value && exc_value != Py_None) {
1244 if (PyFile_WriteString(": ", file) < 0) {
1245 return -1;
1246 }
1247 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001248 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001249 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1250 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001251 }
1252 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001253 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001254
Victor Stinneref9d9b62019-05-22 11:28:22 +02001255 if (PyFile_WriteString("\n", file) < 0) {
1256 return -1;
1257 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001258
1259 /* Explicitly call file.flush() */
1260 PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL);
1261 if (!res) {
1262 return -1;
1263 }
1264 Py_DECREF(res);
1265
Victor Stinneref9d9b62019-05-22 11:28:22 +02001266 return 0;
1267}
1268
1269
1270static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001271write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001272 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1273 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001274{
1275 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1276 if (file == NULL || file == Py_None) {
1277 return 0;
1278 }
1279
1280 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1281 while we use it */
1282 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001283 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001284 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001285 Py_DECREF(file);
1286
1287 return res;
1288}
1289
1290
1291PyObject*
1292_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1293{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001294 PyThreadState *tstate = _PyThreadState_GET();
1295
Victor Stinneref9d9b62019-05-22 11:28:22 +02001296 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001297 _PyErr_SetString(tstate, PyExc_TypeError,
1298 "sys.unraisablehook argument type "
1299 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001300 return NULL;
1301 }
1302
1303 /* Borrowed references */
1304 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1305 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1306 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001307 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1308 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001309
Victor Stinner71c52e32019-05-27 08:57:14 +02001310 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001311 return NULL;
1312 }
1313 Py_RETURN_NONE;
1314}
1315
1316
1317/* Call sys.unraisablehook().
1318
1319 This function can be used when an exception has occurred but there is no way
1320 for Python to handle it. For example, when a destructor raises an exception
1321 or during garbage collection (gc.collect()).
1322
Victor Stinner71c52e32019-05-27 08:57:14 +02001323 If err_msg_str is non-NULL, the error message is formatted as:
1324 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1325 error message.
1326
Victor Stinneref9d9b62019-05-22 11:28:22 +02001327 An exception must be set when calling this function. */
1328void
Victor Stinner71c52e32019-05-27 08:57:14 +02001329_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001330{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001331 PyThreadState *tstate = _PyThreadState_GET();
1332 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001333
Victor Stinner71c52e32019-05-27 08:57:14 +02001334 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001335 PyObject *exc_type, *exc_value, *exc_tb;
1336 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001337
1338 assert(exc_type != NULL);
1339
1340 if (exc_type == NULL) {
1341 /* sys.unraisablehook requires that at least exc_type is set */
1342 goto default_hook;
1343 }
1344
Victor Stinnerdf22c032019-05-23 01:00:58 +02001345 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001346 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001347 if (frame != NULL) {
1348 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1349 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001350 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001351 }
1352 }
1353 }
1354
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001355 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001356
1357 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1358 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001359 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001360 }
1361 }
1362
Victor Stinner71c52e32019-05-27 08:57:14 +02001363 if (err_msg_str != NULL) {
1364 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1365 if (err_msg == NULL) {
1366 PyErr_Clear();
1367 }
1368 }
1369
Victor Stinneref9d9b62019-05-22 11:28:22 +02001370 _Py_IDENTIFIER(unraisablehook);
1371 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
1372 if (hook != NULL && hook != Py_None) {
1373 PyObject *hook_args;
1374
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001375 hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value,
Victor Stinner71c52e32019-05-27 08:57:14 +02001376 exc_tb, err_msg, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001377 if (hook_args != NULL) {
1378 PyObject *args[1] = {hook_args};
1379 PyObject *res = _PyObject_FastCall(hook, args, 1);
1380 Py_DECREF(hook_args);
1381 if (res != NULL) {
1382 Py_DECREF(res);
1383 goto done;
1384 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001385
1386 err_msg_str = "Exception ignored in sys.unraisablehook";
1387 }
1388 else {
1389 err_msg_str = ("Exception ignored on building "
1390 "sys.unraisablehook arguments");
1391 }
1392
1393 Py_XDECREF(err_msg);
1394 err_msg = PyUnicode_FromString(err_msg_str);
1395 if (err_msg == NULL) {
1396 PyErr_Clear();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001397 }
1398
1399 /* sys.unraisablehook failed: log its error using default hook */
1400 Py_XDECREF(exc_type);
1401 Py_XDECREF(exc_value);
1402 Py_XDECREF(exc_tb);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001403 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001404
1405 obj = hook;
1406 }
1407
1408default_hook:
1409 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001410 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1411 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001412
1413done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001414 Py_XDECREF(exc_type);
1415 Py_XDECREF(exc_value);
1416 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001417 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001418 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001419}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001420
Victor Stinner71c52e32019-05-27 08:57:14 +02001421
1422void
1423PyErr_WriteUnraisable(PyObject *obj)
1424{
1425 _PyErr_WriteUnraisableMsg(NULL, obj);
1426}
1427
1428
Armin Rigo092381a2003-10-25 14:29:27 +00001429extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001430
Guido van Rossum2fd45652001-02-28 21:46:24 +00001431
Benjamin Peterson2c539712010-09-20 22:42:10 +00001432void
Victor Stinner14e461d2013-08-26 22:28:21 +02001433PyErr_SyntaxLocation(const char *filename, int lineno)
1434{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001435 PyErr_SyntaxLocationEx(filename, lineno, -1);
1436}
1437
1438
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001439/* Set file and line information for the current exception.
1440 If the exception is not a SyntaxError, also sets additional attributes
1441 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001442
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001443void
Victor Stinner14e461d2013-08-26 22:28:21 +02001444PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001447 _Py_IDENTIFIER(filename);
1448 _Py_IDENTIFIER(lineno);
1449 _Py_IDENTIFIER(msg);
1450 _Py_IDENTIFIER(offset);
1451 _Py_IDENTIFIER(print_file_and_line);
1452 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001453 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001456 _PyErr_Fetch(tstate, &exc, &v, &tb);
1457 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 /* XXX check that it is, indeed, a syntax error. It might not
1459 * be, though. */
1460 tmp = PyLong_FromLong(lineno);
1461 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001462 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001464 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1465 _PyErr_Clear(tstate);
1466 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 Py_DECREF(tmp);
1468 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001469 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001470 if (col_offset >= 0) {
1471 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001472 if (tmp == NULL) {
1473 _PyErr_Clear(tstate);
1474 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001475 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001476 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1477 _PyErr_Clear(tstate);
1478 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001479 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001481 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1482 _PyErr_Clear(tstate);
1483 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001484
Victor Stinner14e461d2013-08-26 22:28:21 +02001485 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001487 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1488 _PyErr_Clear(tstate);
1489 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 Py_DECREF(tmp);
1491 }
1492 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001494 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 tmp = PyObject_Str(v);
1496 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001497 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1498 _PyErr_Clear(tstate);
1499 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001501 }
1502 else {
1503 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 }
1505 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001506 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1507 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001508 Py_None)) {
1509 _PyErr_Clear(tstate);
1510 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 }
1512 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001513 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001514}
1515
Victor Stinner14e461d2013-08-26 22:28:21 +02001516void
1517PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1518{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001519 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001520 PyObject *fileobj;
1521 if (filename != NULL) {
1522 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001523 if (fileobj == NULL) {
1524 _PyErr_Clear(tstate);
1525 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001526 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001527 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001528 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001529 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001530 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1531 Py_XDECREF(fileobj);
1532}
1533
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001534/* Attempt to load the line of text that the exception refers to. If it
1535 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001536
1537 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001538 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001539
Antoine Pitrou409b5382013-10-12 22:41:17 +02001540static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001541err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 int i;
1544 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 if (fp == NULL)
1547 return NULL;
1548 for (i = 0; i < lineno; i++) {
1549 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1550 do {
1551 *pLastChar = '\0';
1552 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1553 fp, NULL) == NULL)
1554 break;
1555 /* fgets read *something*; if it didn't get as
1556 far as pLastChar, it must have found a newline
1557 or hit the end of the file; if pLastChar is \n,
1558 it obviously found a newline; else we haven't
1559 yet seen a newline, so must continue */
1560 } while (*pLastChar != '\0' && *pLastChar != '\n');
1561 }
1562 fclose(fp);
1563 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001565 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001567 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 return res;
1569 }
1570 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001571}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001572
Victor Stinner14e461d2013-08-26 22:28:21 +02001573PyObject *
1574PyErr_ProgramText(const char *filename, int lineno)
1575{
1576 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001577 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001578 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001579 }
1580 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001581 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001582 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001583}
1584
1585PyObject *
1586PyErr_ProgramTextObject(PyObject *filename, int lineno)
1587{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001588 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001589 return NULL;
1590 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001591
1592 PyThreadState *tstate = _PyThreadState_GET();
1593 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1594 if (fp == NULL) {
1595 _PyErr_Clear(tstate);
1596 return NULL;
1597 }
1598 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001599}
1600
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001601#ifdef __cplusplus
1602}
1603#endif