blob: 9658afeb9f773f5737243706b12bcbdebed450c6 [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 *
Victor Stinner17269092019-11-05 01:22:12 +0100524_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception,
525 const char *format, ...)
526{
527 va_list vargs;
528#ifdef HAVE_STDARG_PROTOTYPES
529 va_start(vargs, format);
530#else
531 va_start(vargs);
532#endif
533 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
534 va_end(vargs);
535 return NULL;
536}
537
538PyObject *
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300539_PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
540{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200541 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300542 va_list vargs;
543#ifdef HAVE_STDARG_PROTOTYPES
544 va_start(vargs, format);
545#else
546 va_start(vargs);
547#endif
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200548 _PyErr_FormatVFromCause(tstate, exception, format, vargs);
Serhiy Storchaka467ab192016-10-21 17:09:17 +0300549 va_end(vargs);
550 return NULL;
551}
552
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000553/* Convenience functions to set a type error exception and return 0 */
554
555int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000556PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000557{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200558 PyThreadState *tstate = _PyThreadState_GET();
559 _PyErr_SetString(tstate, PyExc_TypeError,
560 "bad argument type for built-in operation");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return 0;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000562}
563
Guido van Rossum373c8691997-04-29 18:22:47 +0000564PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200565_PyErr_NoMemory(PyThreadState *tstate)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000566{
Victor Stinnerf54a5742013-07-22 22:28:37 +0200567 if (Py_TYPE(PyExc_MemoryError) == NULL) {
568 /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
569 initialized by _PyExc_Init() */
570 Py_FatalError("Out of memory and PyExc_MemoryError is not "
571 "initialized yet");
572 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200573 _PyErr_SetNone(tstate, PyExc_MemoryError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000575}
576
Guido van Rossum373c8691997-04-29 18:22:47 +0000577PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +0200578PyErr_NoMemory(void)
579{
580 PyThreadState *tstate = _PyThreadState_GET();
581 return _PyErr_NoMemory(tstate);
582}
583
584PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000585PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000586{
Larry Hastingsb0827312014-02-09 22:05:19 -0800587 return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
588}
589
590PyObject *
591PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
592{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200593 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 PyObject *message;
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200595 PyObject *v, *args;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 int i = errno;
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100597#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 WCHAR *s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000599#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000600
Guido van Rossume9fbc091995-02-18 14:52:19 +0000601#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 if (i == EINTR && PyErr_CheckSignals())
603 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000604#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000605
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000606#ifndef MS_WINDOWS
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100607 if (i != 0) {
608 char *s = strerror(i);
Victor Stinner1b579672011-12-17 05:47:23 +0100609 message = PyUnicode_DecodeLocale(s, "surrogateescape");
Victor Stinner1f33f2b2011-12-17 04:45:09 +0100610 }
611 else {
612 /* Sometimes errno didn't get set */
613 message = PyUnicode_FromString("Error");
614 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000615#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 if (i == 0)
617 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
618 else
619 {
620 /* Note that the Win32 errors do not lineup with the
621 errno error. So if the error is in the MSVC error
622 table, we use it, otherwise we assume it really _is_
623 a Win32 error code
624 */
625 if (i > 0 && i < _sys_nerr) {
626 message = PyUnicode_FromString(_sys_errlist[i]);
627 }
628 else {
629 int len = FormatMessageW(
630 FORMAT_MESSAGE_ALLOCATE_BUFFER |
631 FORMAT_MESSAGE_FROM_SYSTEM |
632 FORMAT_MESSAGE_IGNORE_INSERTS,
633 NULL, /* no message source */
634 i,
635 MAKELANGID(LANG_NEUTRAL,
636 SUBLANG_DEFAULT),
637 /* Default language */
638 (LPWSTR) &s_buf,
639 0, /* size not used */
640 NULL); /* no args */
641 if (len==0) {
642 /* Only ever seen this in out-of-mem
643 situations */
644 s_buf = NULL;
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300645 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 } else {
647 /* remove trailing cr/lf and dots */
648 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
649 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200650 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 }
652 }
653 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000654#endif /* Unix/Windows */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (message == NULL)
657 {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000658#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 LocalFree(s_buf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return NULL;
662 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000663
Larry Hastingsb0827312014-02-09 22:05:19 -0800664 if (filenameObject != NULL) {
665 if (filenameObject2 != NULL)
666 args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
667 else
668 args = Py_BuildValue("(iOO)", i, message, filenameObject);
669 } else {
670 assert(filenameObject2 == NULL);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200671 args = Py_BuildValue("(iO)", i, message);
Larry Hastingsb0827312014-02-09 22:05:19 -0800672 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000674
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200675 if (args != NULL) {
676 v = PyObject_Call(exc, args, NULL);
677 Py_DECREF(args);
678 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200679 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Antoine Pitrou5d6fbe82011-10-12 19:39:57 +0200680 Py_DECREF(v);
681 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000683#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return NULL;
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000687}
Guido van Rossum743007d1999-04-21 15:27:31 +0000688
Barry Warsaw97d95151998-07-23 16:05:56 +0000689PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000690PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800693 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 Py_XDECREF(name);
695 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000696}
697
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000698#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000699PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000700PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000701{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200702 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800703 PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 Py_XDECREF(name);
705 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000706}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000707#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000708
709PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000711{
Larry Hastingsb0827312014-02-09 22:05:19 -0800712 return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000713}
Guido van Rossum683a0721990-10-21 22:09:12 +0000714
Brett Cannonbf364092006-03-01 04:25:17 +0000715#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000716/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000717PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 PyObject *exc,
719 int ierr,
720 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000721{
Larry Hastingsb0827312014-02-09 22:05:19 -0800722 return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
723 filenameObject, NULL);
724}
725
726PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
727 PyObject *exc,
728 int ierr,
729 PyObject *filenameObject,
730 PyObject *filenameObject2)
731{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200732 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 int len;
734 WCHAR *s_buf = NULL; /* Free via LocalFree */
735 PyObject *message;
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200736 PyObject *args, *v;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 DWORD err = (DWORD)ierr;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200739 if (err==0) {
740 err = GetLastError();
741 }
742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 len = FormatMessageW(
744 /* Error API error */
745 FORMAT_MESSAGE_ALLOCATE_BUFFER |
746 FORMAT_MESSAGE_FROM_SYSTEM |
747 FORMAT_MESSAGE_IGNORE_INSERTS,
748 NULL, /* no message source */
749 err,
750 MAKELANGID(LANG_NEUTRAL,
751 SUBLANG_DEFAULT), /* Default language */
752 (LPWSTR) &s_buf,
753 0, /* size not used */
754 NULL); /* no args */
755 if (len==0) {
756 /* Only seen this in out of mem situations */
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300757 message = PyUnicode_FromFormat("Windows Error 0x%x", err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 s_buf = NULL;
759 } else {
760 /* remove trailing cr/lf and dots */
761 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
762 s_buf[--len] = L'\0';
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200763 message = PyUnicode_FromWideChar(s_buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 if (message == NULL)
767 {
768 LocalFree(s_buf);
769 return NULL;
770 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000771
Larry Hastingsb0827312014-02-09 22:05:19 -0800772 if (filenameObject == NULL) {
773 assert(filenameObject2 == NULL);
774 filenameObject = filenameObject2 = Py_None;
775 }
776 else if (filenameObject2 == NULL)
777 filenameObject2 = Py_None;
778 /* This is the constructor signature for OSError.
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200779 The POSIX translation will be figured out by the constructor. */
Larry Hastingsb0827312014-02-09 22:05:19 -0800780 args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 Py_DECREF(message);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000782
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200783 if (args != NULL) {
784 v = PyObject_Call(exc, args, NULL);
785 Py_DECREF(args);
786 if (v != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200787 _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v);
Victor Stinner9ea8e4c2011-10-17 20:18:58 +0200788 Py_DECREF(v);
789 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 }
791 LocalFree(s_buf);
792 return NULL;
Guido van Rossum795e1892000-02-17 15:19:15 +0000793}
794
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000795PyObject *PyErr_SetExcFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyObject *exc,
797 int ierr,
798 const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000799{
Victor Stinner92be9392010-12-28 00:28:21 +0000800 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800801 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800803 name,
804 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 Py_XDECREF(name);
806 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000807}
808
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000809PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyObject *exc,
811 int ierr,
812 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000813{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200814 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800815 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 ierr,
Larry Hastingsb0827312014-02-09 22:05:19 -0800817 name,
818 NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 Py_XDECREF(name);
820 return ret;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000821}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000822
Thomas Heller085358a2002-07-29 14:27:41 +0000823PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
824{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800825 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
Thomas Heller085358a2002-07-29 14:27:41 +0000826}
827
Guido van Rossum795e1892000-02-17 15:19:15 +0000828PyObject *PyErr_SetFromWindowsErr(int ierr)
829{
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800830 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
831 ierr, NULL);
Larry Hastingsb0827312014-02-09 22:05:19 -0800832}
833
Thomas Heller085358a2002-07-29 14:27:41 +0000834PyObject *PyErr_SetFromWindowsErrWithFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 int ierr,
836 const char *filename)
Thomas Heller085358a2002-07-29 14:27:41 +0000837{
Victor Stinner92be9392010-12-28 00:28:21 +0000838 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800839 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200840 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800841 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 Py_XDECREF(name);
843 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000844}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000845
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000846PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 int ierr,
848 const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000849{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200850 PyObject *name = filename ? PyUnicode_FromWideChar(filename, -1) : NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800851 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
Andrew Svetlov2606a6f2012-12-19 14:33:35 +0200852 PyExc_OSError,
Larry Hastingsb0827312014-02-09 22:05:19 -0800853 ierr, name, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 Py_XDECREF(name);
855 return result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000856}
Guido van Rossum795e1892000-02-17 15:19:15 +0000857#endif /* MS_WINDOWS */
858
Brett Cannon79ec55e2012-04-12 20:24:54 -0400859PyObject *
Eric Snow46f97b82016-09-07 16:56:15 -0700860PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
861 PyObject *name, PyObject *path)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400862{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200863 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow46f97b82016-09-07 16:56:15 -0700864 int issubclass;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200865 PyObject *kwargs, *error;
Brian Curtin09b86d12012-04-17 16:57:09 -0500866
Eric Snow46f97b82016-09-07 16:56:15 -0700867 issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
868 if (issubclass < 0) {
869 return NULL;
870 }
871 else if (!issubclass) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200872 _PyErr_SetString(tstate, PyExc_TypeError,
873 "expected a subclass of ImportError");
Brian Curtin94c001b2012-04-18 08:30:51 -0500874 return NULL;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200875 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500876
Eric Snow46f97b82016-09-07 16:56:15 -0700877 if (msg == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200878 _PyErr_SetString(tstate, PyExc_TypeError,
879 "expected a message argument");
Brian Curtin09b86d12012-04-17 16:57:09 -0500880 return NULL;
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400881 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500882
Brian Curtin94c001b2012-04-18 08:30:51 -0500883 if (name == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500884 name = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500885 }
Brian Curtin94c001b2012-04-18 08:30:51 -0500886 if (path == NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -0500887 path = Py_None;
Brian Curtin94c001b2012-04-18 08:30:51 -0500888 }
Brian Curtin09b86d12012-04-17 16:57:09 -0500889
Eric Snow46f97b82016-09-07 16:56:15 -0700890 kwargs = PyDict_New();
891 if (kwargs == NULL) {
892 return NULL;
893 }
Victor Stinnerf45a5612016-08-23 00:04:41 +0200894 if (PyDict_SetItemString(kwargs, "name", name) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300895 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200896 }
897 if (PyDict_SetItemString(kwargs, "path", path) < 0) {
Berker Peksagec766d32016-05-01 09:06:36 +0300898 goto done;
Victor Stinnerf45a5612016-08-23 00:04:41 +0200899 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400900
Eric Snow46f97b82016-09-07 16:56:15 -0700901 error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
Benjamin Petersonda20cd22012-04-18 10:48:00 -0400902 if (error != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200903 _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error);
Brian Curtin09b86d12012-04-17 16:57:09 -0500904 Py_DECREF(error);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400905 }
906
Berker Peksagec766d32016-05-01 09:06:36 +0300907done:
Brett Cannon79ec55e2012-04-12 20:24:54 -0400908 Py_DECREF(kwargs);
Brian Curtin09b86d12012-04-17 16:57:09 -0500909 return NULL;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400910}
911
Eric Snow46f97b82016-09-07 16:56:15 -0700912PyObject *
913PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
914{
915 return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
916}
917
Guido van Rossum683a0721990-10-21 22:09:12 +0000918void
Neal Norwitzb382b842007-08-24 20:00:37 +0000919_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000920{
Victor Stinner438a12d2019-05-24 17:01:38 +0200921 PyThreadState *tstate = _PyThreadState_GET();
922 _PyErr_Format(tstate, PyExc_SystemError,
923 "%s:%d: bad argument to internal function",
924 filename, lineno);
Fred Drake6d63adf2000-08-24 22:38:39 +0000925}
926
927/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
928 export the entry point for existing object code: */
929#undef PyErr_BadInternalCall
930void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000931PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000932{
Victor Stinnerfb3a6302013-07-12 00:37:30 +0200933 assert(0 && "bad argument to internal function");
Victor Stinner438a12d2019-05-24 17:01:38 +0200934 PyThreadState *tstate = _PyThreadState_GET();
935 _PyErr_SetString(tstate, PyExc_SystemError,
936 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000937}
Fred Drake6d63adf2000-08-24 22:38:39 +0000938#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
939
Guido van Rossum1548bac1997-02-14 17:09:47 +0000940
Victor Stinner438a12d2019-05-24 17:01:38 +0200941static PyObject *
942_PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
943 const char *format, va_list vargs)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000946
Victor Stinnerde821be2015-03-24 12:41:23 +0100947 /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
948 exception set, it calls arbitrary Python code like PyObject_Repr() */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200949 _PyErr_Clear(tstate);
Victor Stinnerace47d72013-07-18 01:41:08 +0200950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 string = PyUnicode_FromFormatV(format, vargs);
Victor Stinnerde821be2015-03-24 12:41:23 +0100952
Victor Stinnerb4bdecd2019-05-24 13:44:24 +0200953 _PyErr_SetObject(tstate, exception, string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 Py_XDECREF(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 return NULL;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000956}
Guido van Rossum7617e051997-09-16 18:43:50 +0000957
958
Antoine Pitrou0676a402014-09-30 21:16:27 +0200959PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +0200960PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
961{
962 PyThreadState *tstate = _PyThreadState_GET();
963 return _PyErr_FormatV(tstate, exception, format, vargs);
964}
965
966
967PyObject *
968_PyErr_Format(PyThreadState *tstate, PyObject *exception,
969 const char *format, ...)
Antoine Pitrou0676a402014-09-30 21:16:27 +0200970{
971 va_list vargs;
972#ifdef HAVE_STDARG_PROTOTYPES
973 va_start(vargs, format);
974#else
975 va_start(vargs);
976#endif
Victor Stinner438a12d2019-05-24 17:01:38 +0200977 _PyErr_FormatV(tstate, exception, format, vargs);
978 va_end(vargs);
979 return NULL;
980}
981
982
983PyObject *
984PyErr_Format(PyObject *exception, const char *format, ...)
985{
986 PyThreadState *tstate = _PyThreadState_GET();
987 va_list vargs;
988#ifdef HAVE_STDARG_PROTOTYPES
989 va_start(vargs, format);
990#else
991 va_start(vargs);
992#endif
993 _PyErr_FormatV(tstate, exception, format, vargs);
Antoine Pitrou0676a402014-09-30 21:16:27 +0200994 va_end(vargs);
995 return NULL;
996}
997
Thomas Wouters477c8d52006-05-27 19:21:47 +0000998
Guido van Rossum7617e051997-09-16 18:43:50 +0000999PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +00001000PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +00001001{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001002 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001003 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 PyObject *modulename = NULL;
1005 PyObject *classname = NULL;
1006 PyObject *mydict = NULL;
1007 PyObject *bases = NULL;
1008 PyObject *result = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001009
1010 const char *dot = strrchr(name, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 if (dot == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001012 _PyErr_SetString(tstate, PyExc_SystemError,
1013 "PyErr_NewException: name must be module.class");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 return NULL;
1015 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001016 if (base == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 base = PyExc_Exception;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001018 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (dict == NULL) {
1020 dict = mydict = PyDict_New();
1021 if (dict == NULL)
1022 goto failure;
1023 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001024
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001025 if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001026 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001027 goto failure;
1028 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 modulename = PyUnicode_FromStringAndSize(name,
1030 (Py_ssize_t)(dot-name));
1031 if (modulename == NULL)
1032 goto failure;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001033 if (_PyDict_SetItemId(dict, &PyId___module__, modulename) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 goto failure;
1035 }
1036 if (PyTuple_Check(base)) {
1037 bases = base;
1038 /* INCREF as we create a new ref in the else branch */
1039 Py_INCREF(bases);
1040 } else {
1041 bases = PyTuple_Pack(1, base);
1042 if (bases == NULL)
1043 goto failure;
1044 }
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +01001045 /* Create a real class. */
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001046 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +00001048 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 Py_XDECREF(bases);
1050 Py_XDECREF(mydict);
1051 Py_XDECREF(classname);
1052 Py_XDECREF(modulename);
1053 return result;
Guido van Rossum7617e051997-09-16 18:43:50 +00001054}
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001055
Georg Brandl1e28a272009-12-28 08:41:01 +00001056
1057/* Create an exception with docstring */
1058PyObject *
1059PyErr_NewExceptionWithDoc(const char *name, const char *doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 PyObject *base, PyObject *dict)
Georg Brandl1e28a272009-12-28 08:41:01 +00001061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 int result;
1063 PyObject *ret = NULL;
1064 PyObject *mydict = NULL; /* points to the dict only if we create it */
1065 PyObject *docobj;
Georg Brandl1e28a272009-12-28 08:41:01 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 if (dict == NULL) {
1068 dict = mydict = PyDict_New();
1069 if (dict == NULL) {
1070 return NULL;
1071 }
1072 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 if (doc != NULL) {
1075 docobj = PyUnicode_FromString(doc);
1076 if (docobj == NULL)
1077 goto failure;
1078 result = PyDict_SetItemString(dict, "__doc__", docobj);
1079 Py_DECREF(docobj);
1080 if (result < 0)
1081 goto failure;
1082 }
Georg Brandl1e28a272009-12-28 08:41:01 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 ret = PyErr_NewException(name, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00001085 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 Py_XDECREF(mydict);
1087 return ret;
Georg Brandl1e28a272009-12-28 08:41:01 +00001088}
1089
1090
Victor Stinneref9d9b62019-05-22 11:28:22 +02001091PyDoc_STRVAR(UnraisableHookArgs__doc__,
1092"UnraisableHookArgs\n\
1093\n\
1094Type used to pass arguments to sys.unraisablehook.");
1095
1096static PyTypeObject UnraisableHookArgsType;
1097
1098static PyStructSequence_Field UnraisableHookArgs_fields[] = {
1099 {"exc_type", "Exception type"},
1100 {"exc_value", "Exception value"},
1101 {"exc_traceback", "Exception traceback"},
Victor Stinner71c52e32019-05-27 08:57:14 +02001102 {"err_msg", "Error message"},
Victor Stinneref9d9b62019-05-22 11:28:22 +02001103 {"object", "Object causing the exception"},
1104 {0}
1105};
1106
1107static PyStructSequence_Desc UnraisableHookArgs_desc = {
1108 .name = "UnraisableHookArgs",
1109 .doc = UnraisableHookArgs__doc__,
1110 .fields = UnraisableHookArgs_fields,
Victor Stinner71c52e32019-05-27 08:57:14 +02001111 .n_in_sequence = 5
Victor Stinneref9d9b62019-05-22 11:28:22 +02001112};
1113
1114
Victor Stinner331a6a52019-05-27 16:39:22 +02001115PyStatus
Victor Stinneref9d9b62019-05-22 11:28:22 +02001116_PyErr_Init(void)
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001117{
Victor Stinneref9d9b62019-05-22 11:28:22 +02001118 if (UnraisableHookArgsType.tp_name == NULL) {
1119 if (PyStructSequence_InitType2(&UnraisableHookArgsType,
1120 &UnraisableHookArgs_desc) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02001121 return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
Martin Panter3263f682016-02-28 03:16:11 +00001122 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001123 }
Victor Stinner331a6a52019-05-27 16:39:22 +02001124 return _PyStatus_OK();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001125}
1126
1127
1128static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001129make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001130 PyObject *exc_value, PyObject *exc_tb,
1131 PyObject *err_msg, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001132{
1133 PyObject *args = PyStructSequence_New(&UnraisableHookArgsType);
1134 if (args == NULL) {
1135 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001137
Victor Stinneref9d9b62019-05-22 11:28:22 +02001138 Py_ssize_t pos = 0;
1139#define ADD_ITEM(exc_type) \
1140 do { \
1141 if (exc_type == NULL) { \
1142 exc_type = Py_None; \
1143 } \
1144 Py_INCREF(exc_type); \
1145 PyStructSequence_SET_ITEM(args, pos++, exc_type); \
1146 } while (0)
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001147
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001148
Victor Stinneref9d9b62019-05-22 11:28:22 +02001149 ADD_ITEM(exc_type);
1150 ADD_ITEM(exc_value);
1151 ADD_ITEM(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001152 ADD_ITEM(err_msg);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001153 ADD_ITEM(obj);
1154#undef ADD_ITEM
1155
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001156 if (_PyErr_Occurred(tstate)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001157 Py_DECREF(args);
1158 return NULL;
1159 }
1160 return args;
1161}
1162
1163
1164
1165/* Default implementation of sys.unraisablehook.
1166
1167 It can be called to log the exception of a custom sys.unraisablehook.
1168
1169 Do nothing if sys.stderr attribute doesn't exist or is set to None. */
1170static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001171write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
1172 PyObject *exc_value, PyObject *exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001173 PyObject *err_msg, PyObject *obj, PyObject *file)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001174{
1175 if (obj != NULL && obj != Py_None) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001176 if (err_msg != NULL && err_msg != Py_None) {
1177 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1178 return -1;
1179 }
1180 if (PyFile_WriteString(": ", file) < 0) {
1181 return -1;
1182 }
1183 }
1184 else {
1185 if (PyFile_WriteString("Exception ignored in: ", file) < 0) {
1186 return -1;
1187 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001188 }
1189
1190 if (PyFile_WriteObject(obj, file, 0) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001191 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001192 if (PyFile_WriteString("<object repr() failed>", file) < 0) {
1193 return -1;
1194 }
1195 }
1196 if (PyFile_WriteString("\n", file) < 0) {
1197 return -1;
1198 }
1199 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001200 else if (err_msg != NULL && err_msg != Py_None) {
1201 if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) {
1202 return -1;
1203 }
1204 if (PyFile_WriteString(":\n", file) < 0) {
1205 return -1;
1206 }
1207 }
Victor Stinneref9d9b62019-05-22 11:28:22 +02001208
1209 if (exc_tb != NULL && exc_tb != Py_None) {
1210 if (PyTraceBack_Print(exc_tb, file) < 0) {
1211 /* continue even if writing the traceback failed */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001212 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001213 }
1214 }
1215
Victor Stinnerdf22c032019-05-23 01:00:58 +02001216 if (exc_type == NULL || exc_type == Py_None) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001217 return -1;
1218 }
1219
1220 assert(PyExceptionClass_Check(exc_type));
1221 const char *className = PyExceptionClass_Name(exc_type);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001222 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +03001223 const char *dot = strrchr(className, '.');
Victor Stinner71c52e32019-05-27 08:57:14 +02001224 if (dot != NULL) {
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001225 className = dot+1;
Victor Stinner71c52e32019-05-27 08:57:14 +02001226 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001227 }
1228
Victor Stinneref9d9b62019-05-22 11:28:22 +02001229 _Py_IDENTIFIER(__module__);
1230 PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__);
Oren Milmanf6e61df2017-09-14 01:30:05 +03001231 if (moduleName == NULL || !PyUnicode_Check(moduleName)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001232 Py_XDECREF(moduleName);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001233 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001234 if (PyFile_WriteString("<unknown>", file) < 0) {
1235 return -1;
1236 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001237 }
1238 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +02001239 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001240 if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) {
1241 Py_DECREF(moduleName);
1242 return -1;
1243 }
1244 Py_DECREF(moduleName);
1245 if (PyFile_WriteString(".", file) < 0) {
1246 return -1;
1247 }
1248 }
1249 else {
1250 Py_DECREF(moduleName);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001251 }
1252 }
1253 if (className == NULL) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001254 if (PyFile_WriteString("<unknown>", file) < 0) {
1255 return -1;
1256 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001257 }
1258 else {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001259 if (PyFile_WriteString(className, file) < 0) {
1260 return -1;
1261 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001262 }
1263
Victor Stinneref9d9b62019-05-22 11:28:22 +02001264 if (exc_value && exc_value != Py_None) {
1265 if (PyFile_WriteString(": ", file) < 0) {
1266 return -1;
1267 }
1268 if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001269 _PyErr_Clear(tstate);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001270 if (PyFile_WriteString("<exception str() failed>", file) < 0) {
1271 return -1;
Martin Panter3263f682016-02-28 03:16:11 +00001272 }
1273 }
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001274 }
Victor Stinnerdf22c032019-05-23 01:00:58 +02001275
Victor Stinneref9d9b62019-05-22 11:28:22 +02001276 if (PyFile_WriteString("\n", file) < 0) {
1277 return -1;
1278 }
Victor Stinnera85a1d32019-05-28 16:01:17 +02001279
1280 /* Explicitly call file.flush() */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02001281 PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
Victor Stinnera85a1d32019-05-28 16:01:17 +02001282 if (!res) {
1283 return -1;
1284 }
1285 Py_DECREF(res);
1286
Victor Stinneref9d9b62019-05-22 11:28:22 +02001287 return 0;
1288}
1289
1290
1291static int
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001292write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
Victor Stinner71c52e32019-05-27 08:57:14 +02001293 PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
1294 PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001295{
1296 PyObject *file = _PySys_GetObjectId(&PyId_stderr);
1297 if (file == NULL || file == Py_None) {
1298 return 0;
1299 }
1300
1301 /* Hold a strong reference to ensure that sys.stderr doesn't go away
1302 while we use it */
1303 Py_INCREF(file);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001304 int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
Victor Stinner71c52e32019-05-27 08:57:14 +02001305 err_msg, obj, file);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001306 Py_DECREF(file);
1307
1308 return res;
1309}
1310
1311
1312PyObject*
1313_PyErr_WriteUnraisableDefaultHook(PyObject *args)
1314{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001315 PyThreadState *tstate = _PyThreadState_GET();
1316
Victor Stinneref9d9b62019-05-22 11:28:22 +02001317 if (Py_TYPE(args) != &UnraisableHookArgsType) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001318 _PyErr_SetString(tstate, PyExc_TypeError,
1319 "sys.unraisablehook argument type "
1320 "must be UnraisableHookArgs");
Victor Stinneref9d9b62019-05-22 11:28:22 +02001321 return NULL;
1322 }
1323
1324 /* Borrowed references */
1325 PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0);
1326 PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1);
1327 PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
Victor Stinner71c52e32019-05-27 08:57:14 +02001328 PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3);
1329 PyObject *obj = PyStructSequence_GET_ITEM(args, 4);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001330
Victor Stinner71c52e32019-05-27 08:57:14 +02001331 if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02001332 return NULL;
1333 }
1334 Py_RETURN_NONE;
1335}
1336
1337
1338/* Call sys.unraisablehook().
1339
1340 This function can be used when an exception has occurred but there is no way
1341 for Python to handle it. For example, when a destructor raises an exception
1342 or during garbage collection (gc.collect()).
1343
Victor Stinner71c52e32019-05-27 08:57:14 +02001344 If err_msg_str is non-NULL, the error message is formatted as:
1345 "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in"
1346 error message.
1347
Victor Stinneref9d9b62019-05-22 11:28:22 +02001348 An exception must be set when calling this function. */
1349void
Victor Stinner71c52e32019-05-27 08:57:14 +02001350_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj)
Victor Stinneref9d9b62019-05-22 11:28:22 +02001351{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001352 PyThreadState *tstate = _PyThreadState_GET();
1353 assert(tstate != NULL);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001354
Victor Stinner71c52e32019-05-27 08:57:14 +02001355 PyObject *err_msg = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001356 PyObject *exc_type, *exc_value, *exc_tb;
1357 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001358
1359 assert(exc_type != NULL);
1360
1361 if (exc_type == NULL) {
1362 /* sys.unraisablehook requires that at least exc_type is set */
1363 goto default_hook;
1364 }
1365
Victor Stinnerdf22c032019-05-23 01:00:58 +02001366 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001367 struct _frame *frame = tstate->frame;
Victor Stinnerdf22c032019-05-23 01:00:58 +02001368 if (frame != NULL) {
1369 exc_tb = _PyTraceBack_FromFrame(NULL, frame);
1370 if (exc_tb == NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001371 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001372 }
1373 }
1374 }
1375
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001376 _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001377
1378 if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) {
1379 if (PyException_SetTraceback(exc_value, exc_tb) < 0) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001380 _PyErr_Clear(tstate);
Victor Stinnerdf22c032019-05-23 01:00:58 +02001381 }
1382 }
1383
Victor Stinner71c52e32019-05-27 08:57:14 +02001384 if (err_msg_str != NULL) {
1385 err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str);
1386 if (err_msg == NULL) {
1387 PyErr_Clear();
1388 }
1389 }
1390
Victor Stinneref9d9b62019-05-22 11:28:22 +02001391 _Py_IDENTIFIER(unraisablehook);
1392 PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook);
1393 if (hook != NULL && hook != Py_None) {
1394 PyObject *hook_args;
1395
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001396 hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value,
Victor Stinner71c52e32019-05-27 08:57:14 +02001397 exc_tb, err_msg, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001398 if (hook_args != NULL) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001399 PyObject *res = _PyObject_CallOneArg(hook, hook_args);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001400 Py_DECREF(hook_args);
1401 if (res != NULL) {
1402 Py_DECREF(res);
1403 goto done;
1404 }
Victor Stinner71c52e32019-05-27 08:57:14 +02001405
1406 err_msg_str = "Exception ignored in sys.unraisablehook";
1407 }
1408 else {
1409 err_msg_str = ("Exception ignored on building "
1410 "sys.unraisablehook arguments");
1411 }
1412
1413 Py_XDECREF(err_msg);
1414 err_msg = PyUnicode_FromString(err_msg_str);
1415 if (err_msg == NULL) {
1416 PyErr_Clear();
Victor Stinneref9d9b62019-05-22 11:28:22 +02001417 }
1418
1419 /* sys.unraisablehook failed: log its error using default hook */
1420 Py_XDECREF(exc_type);
1421 Py_XDECREF(exc_value);
1422 Py_XDECREF(exc_tb);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001423 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb);
Victor Stinneref9d9b62019-05-22 11:28:22 +02001424
1425 obj = hook;
1426 }
1427
1428default_hook:
1429 /* Call the default unraisable hook (ignore failure) */
Victor Stinner71c52e32019-05-27 08:57:14 +02001430 (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb,
1431 err_msg, obj);
Victor Stinnerc82bfd82013-08-26 14:04:10 +02001432
1433done:
Victor Stinneref9d9b62019-05-22 11:28:22 +02001434 Py_XDECREF(exc_type);
1435 Py_XDECREF(exc_value);
1436 Py_XDECREF(exc_tb);
Victor Stinner71c52e32019-05-27 08:57:14 +02001437 Py_XDECREF(err_msg);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001438 _PyErr_Clear(tstate); /* Just in case */
Jeremy Hyltonb709df32000-09-01 02:47:25 +00001439}
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001440
Victor Stinner71c52e32019-05-27 08:57:14 +02001441
1442void
1443PyErr_WriteUnraisable(PyObject *obj)
1444{
1445 _PyErr_WriteUnraisableMsg(NULL, obj);
1446}
1447
1448
Armin Rigo092381a2003-10-25 14:29:27 +00001449extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +00001450
Guido van Rossum2fd45652001-02-28 21:46:24 +00001451
Benjamin Peterson2c539712010-09-20 22:42:10 +00001452void
Victor Stinner14e461d2013-08-26 22:28:21 +02001453PyErr_SyntaxLocation(const char *filename, int lineno)
1454{
Benjamin Peterson2c539712010-09-20 22:42:10 +00001455 PyErr_SyntaxLocationEx(filename, lineno, -1);
1456}
1457
1458
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001459/* Set file and line information for the current exception.
1460 If the exception is not a SyntaxError, also sets additional attributes
1461 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +00001462
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001463void
Victor Stinner14e461d2013-08-26 22:28:21 +02001464PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 PyObject *exc, *v, *tb, *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001467 _Py_IDENTIFIER(filename);
1468 _Py_IDENTIFIER(lineno);
1469 _Py_IDENTIFIER(msg);
1470 _Py_IDENTIFIER(offset);
1471 _Py_IDENTIFIER(print_file_and_line);
1472 _Py_IDENTIFIER(text);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001473 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 /* add attributes for the line number and filename for the error */
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001476 _PyErr_Fetch(tstate, &exc, &v, &tb);
1477 _PyErr_NormalizeException(tstate, &exc, &v, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 /* XXX check that it is, indeed, a syntax error. It might not
1479 * be, though. */
1480 tmp = PyLong_FromLong(lineno);
1481 if (tmp == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001482 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 else {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001484 if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) {
1485 _PyErr_Clear(tstate);
1486 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 Py_DECREF(tmp);
1488 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001489 tmp = NULL;
Benjamin Peterson2c539712010-09-20 22:42:10 +00001490 if (col_offset >= 0) {
1491 tmp = PyLong_FromLong(col_offset);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001492 if (tmp == NULL) {
1493 _PyErr_Clear(tstate);
1494 }
Benjamin Peterson2c539712010-09-20 22:42:10 +00001495 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001496 if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) {
1497 _PyErr_Clear(tstate);
1498 }
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001499 Py_XDECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (filename != NULL) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001501 if (_PyObject_SetAttrId(v, &PyId_filename, filename)) {
1502 _PyErr_Clear(tstate);
1503 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001504
Victor Stinner14e461d2013-08-26 22:28:21 +02001505 tmp = PyErr_ProgramTextObject(filename, lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001507 if (_PyObject_SetAttrId(v, &PyId_text, tmp)) {
1508 _PyErr_Clear(tstate);
1509 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 Py_DECREF(tmp);
1511 }
1512 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 if (exc != PyExc_SyntaxError) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001514 if (!_PyObject_HasAttrId(v, &PyId_msg)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 tmp = PyObject_Str(v);
1516 if (tmp) {
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001517 if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) {
1518 _PyErr_Clear(tstate);
1519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 Py_DECREF(tmp);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001521 }
1522 else {
1523 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 }
1525 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001526 if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
1527 if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001528 Py_None)) {
1529 _PyErr_Clear(tstate);
1530 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 }
1532 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001533 _PyErr_Restore(tstate, exc, v, tb);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001534}
1535
Victor Stinner14e461d2013-08-26 22:28:21 +02001536void
1537PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
1538{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001539 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner14e461d2013-08-26 22:28:21 +02001540 PyObject *fileobj;
1541 if (filename != NULL) {
1542 fileobj = PyUnicode_DecodeFSDefault(filename);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001543 if (fileobj == NULL) {
1544 _PyErr_Clear(tstate);
1545 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001546 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001547 else {
Victor Stinner14e461d2013-08-26 22:28:21 +02001548 fileobj = NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001549 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001550 PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
1551 Py_XDECREF(fileobj);
1552}
1553
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001554/* Attempt to load the line of text that the exception refers to. If it
1555 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001556
1557 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +00001558 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001559
Antoine Pitrou409b5382013-10-12 22:41:17 +02001560static PyObject *
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001561err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 int i;
1564 char linebuf[1000];
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (fp == NULL)
1567 return NULL;
1568 for (i = 0; i < lineno; i++) {
1569 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
1570 do {
1571 *pLastChar = '\0';
1572 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
1573 fp, NULL) == NULL)
1574 break;
1575 /* fgets read *something*; if it didn't get as
1576 far as pLastChar, it must have found a newline
1577 or hit the end of the file; if pLastChar is \n,
1578 it obviously found a newline; else we haven't
1579 yet seen a newline, so must continue */
1580 } while (*pLastChar != '\0' && *pLastChar != '\n');
1581 }
1582 fclose(fp);
1583 if (i == lineno) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 PyObject *res;
Martin Panterca3263c2016-12-11 00:18:36 +00001585 res = PyUnicode_FromString(linebuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 if (res == NULL)
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001587 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 return res;
1589 }
1590 return NULL;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001591}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001592
Victor Stinner14e461d2013-08-26 22:28:21 +02001593PyObject *
1594PyErr_ProgramText(const char *filename, int lineno)
1595{
1596 FILE *fp;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001597 if (filename == NULL || *filename == '\0' || lineno <= 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02001598 return NULL;
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001599 }
1600 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerdaf45552013-08-28 00:53:59 +02001601 fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001602 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001603}
1604
1605PyObject *
1606PyErr_ProgramTextObject(PyObject *filename, int lineno)
1607{
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001608 if (filename == NULL || lineno <= 0) {
Victor Stinnere42ccd22015-03-18 01:39:23 +01001609 return NULL;
1610 }
Victor Stinnerb4bdecd2019-05-24 13:44:24 +02001611
1612 PyThreadState *tstate = _PyThreadState_GET();
1613 FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
1614 if (fp == NULL) {
1615 _PyErr_Clear(tstate);
1616 return NULL;
1617 }
1618 return err_programtext(tstate, fp, lineno);
Victor Stinner14e461d2013-08-26 22:28:21 +02001619}
1620
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001621#ifdef __cplusplus
1622}
1623#endif