blob: db5e3da12b00f3c2aca5b023ba211f47ac4afa5f [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
Victor Stinner331a6a52019-05-27 16:39:22 +02009#include "pycore_initconfig.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010010#include "pycore_object.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020011#include "structmember.h" // PyMemberDef
Victor Stinner361dcdc2020-04-15 03:24:57 +020012#include "osdefs.h" // SEP
Thomas Wouters477c8d52006-05-27 19:21:47 +000013
Thomas Wouters477c8d52006-05-27 19:21:47 +000014
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020015/* Compatibility aliases */
16PyObject *PyExc_EnvironmentError = NULL;
17PyObject *PyExc_IOError = NULL;
18#ifdef MS_WINDOWS
19PyObject *PyExc_WindowsError = NULL;
20#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020021
22/* The dict map from errno codes to OSError subclasses */
23static PyObject *errnomap = NULL;
24
25
Thomas Wouters477c8d52006-05-27 19:21:47 +000026/* NOTE: If the exception class hierarchy changes, don't forget to update
27 * Lib/test/exception_hierarchy.txt
28 */
29
Thomas Wouters477c8d52006-05-27 19:21:47 +000030/*
31 * BaseException
32 */
33static PyObject *
34BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35{
36 PyBaseExceptionObject *self;
37
38 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000039 if (!self)
40 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000041 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000042 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000043 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070044 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000045
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010046 if (args) {
47 self->args = args;
48 Py_INCREF(args);
49 return (PyObject *)self;
50 }
51
Thomas Wouters477c8d52006-05-27 19:21:47 +000052 self->args = PyTuple_New(0);
53 if (!self->args) {
54 Py_DECREF(self);
55 return NULL;
56 }
57
Thomas Wouters477c8d52006-05-27 19:21:47 +000058 return (PyObject *)self;
59}
60
61static int
62BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
63{
Christian Heimes90aa7642007-12-19 02:45:37 +000064 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000065 return -1;
66
Serhiy Storchaka576f1322016-01-05 21:27:54 +020067 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030068 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000069
Thomas Wouters477c8d52006-05-27 19:21:47 +000070 return 0;
71}
72
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000073static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000074BaseException_clear(PyBaseExceptionObject *self)
75{
76 Py_CLEAR(self->dict);
77 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000078 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000079 Py_CLEAR(self->cause);
80 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000081 return 0;
82}
83
84static void
85BaseException_dealloc(PyBaseExceptionObject *self)
86{
Thomas Wouters89f507f2006-12-13 04:49:30 +000087 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000089 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000090}
91
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000092static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000093BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
94{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000095 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000097 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000098 Py_VISIT(self->cause);
99 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000100 return 0;
101}
102
103static PyObject *
104BaseException_str(PyBaseExceptionObject *self)
105{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000108 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000112 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000113 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114}
115
116static PyObject *
117BaseException_repr(PyBaseExceptionObject *self)
118{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300119 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200120 if (PyTuple_GET_SIZE(self->args) == 1)
121 return PyUnicode_FromFormat("%s(%R)", name,
122 PyTuple_GET_ITEM(self->args, 0));
123 else
124 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125}
126
127/* Pickling support */
128static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530129BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000130{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135}
136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137/*
138 * Needed for backward compatibility, since exceptions used to store
139 * all their attributes in the __dict__. Code is taken from cPickle's
140 * load_build function.
141 */
142static PyObject *
143BaseException_setstate(PyObject *self, PyObject *state)
144{
145 PyObject *d_key, *d_value;
146 Py_ssize_t i = 0;
147
148 if (state != Py_None) {
149 if (!PyDict_Check(state)) {
150 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
151 return NULL;
152 }
153 while (PyDict_Next(state, &i, &d_key, &d_value)) {
154 if (PyObject_SetAttr(self, d_key, d_value) < 0)
155 return NULL;
156 }
157 }
158 Py_RETURN_NONE;
159}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000160
Collin Winter828f04a2007-08-31 00:04:24 +0000161static PyObject *
162BaseException_with_traceback(PyObject *self, PyObject *tb) {
163 if (PyException_SetTraceback(self, tb))
164 return NULL;
165
166 Py_INCREF(self);
167 return self;
168}
169
Georg Brandl76941002008-05-05 21:38:47 +0000170PyDoc_STRVAR(with_traceback_doc,
171"Exception.with_traceback(tb) --\n\
172 set self.__traceback__ to tb and return self.");
173
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174
175static PyMethodDef BaseException_methods[] = {
176 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000178 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
179 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 {NULL, NULL, 0, NULL},
181};
182
Thomas Wouters477c8d52006-05-27 19:21:47 +0000183static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200184BaseException_get_args(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000185{
186 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000188 }
189 Py_INCREF(self->args);
190 return self->args;
191}
192
193static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200194BaseException_set_args(PyBaseExceptionObject *self, PyObject *val, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000195{
196 PyObject *seq;
197 if (val == NULL) {
198 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
199 return -1;
200 }
201 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500202 if (!seq)
203 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300204 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200209BaseException_get_tb(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000210{
211 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200212 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000213 }
214 Py_INCREF(self->traceback);
215 return self->traceback;
216}
217
218static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000220{
221 if (tb == NULL) {
222 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
223 return -1;
224 }
225 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
226 PyErr_SetString(PyExc_TypeError,
227 "__traceback__ must be a traceback or None");
228 return -1;
229 }
230
Serhiy Storchaka37665722016-08-20 21:22:03 +0300231 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300232 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000233 return 0;
234}
235
Georg Brandlab6f2f62009-03-31 04:16:10 +0000236static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200237BaseException_get_context(PyObject *self, void *Py_UNUSED(ignored))
238{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000239 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500240 if (res)
241 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000242 Py_RETURN_NONE;
243}
244
245static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200246BaseException_set_context(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
247{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000248 if (arg == NULL) {
249 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
250 return -1;
251 } else if (arg == Py_None) {
252 arg = NULL;
253 } else if (!PyExceptionInstance_Check(arg)) {
254 PyErr_SetString(PyExc_TypeError, "exception context must be None "
255 "or derive from BaseException");
256 return -1;
257 } else {
258 /* PyException_SetContext steals this reference */
259 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000261 PyException_SetContext(self, arg);
262 return 0;
263}
264
265static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200266BaseException_get_cause(PyObject *self, void *Py_UNUSED(ignored))
267{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000268 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500269 if (res)
270 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700271 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000272}
273
274static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200275BaseException_set_cause(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
276{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000277 if (arg == NULL) {
278 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
279 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700280 } else if (arg == Py_None) {
281 arg = NULL;
282 } else if (!PyExceptionInstance_Check(arg)) {
283 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
284 "or derive from BaseException");
285 return -1;
286 } else {
287 /* PyException_SetCause steals this reference */
288 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700290 PyException_SetCause(self, arg);
291 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000292}
293
Guido van Rossum360e4b82007-05-14 22:51:27 +0000294
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500296 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000297 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000298 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200299 {"__context__", BaseException_get_context,
300 BaseException_set_context, PyDoc_STR("exception context")},
301 {"__cause__", BaseException_get_cause,
302 BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000303 {NULL},
304};
305
306
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200307static inline PyBaseExceptionObject*
308_PyBaseExceptionObject_cast(PyObject *exc)
309{
310 assert(PyExceptionInstance_Check(exc));
311 return (PyBaseExceptionObject *)exc;
312}
313
314
Collin Winter828f04a2007-08-31 00:04:24 +0000315PyObject *
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200316PyException_GetTraceback(PyObject *self)
317{
318 PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
Collin Winter828f04a2007-08-31 00:04:24 +0000319 Py_XINCREF(base_self->traceback);
320 return base_self->traceback;
321}
322
323
324int
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200325PyException_SetTraceback(PyObject *self, PyObject *tb)
326{
327 return BaseException_set_tb(_PyBaseExceptionObject_cast(self), tb, NULL);
Collin Winter828f04a2007-08-31 00:04:24 +0000328}
329
330PyObject *
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200331PyException_GetCause(PyObject *self)
332{
333 PyObject *cause = _PyBaseExceptionObject_cast(self)->cause;
Collin Winter828f04a2007-08-31 00:04:24 +0000334 Py_XINCREF(cause);
335 return cause;
336}
337
338/* Steals a reference to cause */
339void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200340PyException_SetCause(PyObject *self, PyObject *cause)
341{
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200342 PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
343 base_self->suppress_context = 1;
344 Py_XSETREF(base_self->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000345}
346
347PyObject *
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200348PyException_GetContext(PyObject *self)
349{
350 PyObject *context = _PyBaseExceptionObject_cast(self)->context;
Collin Winter828f04a2007-08-31 00:04:24 +0000351 Py_XINCREF(context);
352 return context;
353}
354
355/* Steals a reference to context */
356void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200357PyException_SetContext(PyObject *self, PyObject *context)
358{
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200359 Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000360}
361
Christian Tismerea62ce72018-06-09 20:32:25 +0200362#undef PyExceptionClass_Name
Christian Tismer83987132018-06-11 00:48:28 +0200363
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300364const char *
Christian Tismerea62ce72018-06-09 20:32:25 +0200365PyExceptionClass_Name(PyObject *ob)
366{
Victor Stinnerb0be6b32020-05-05 17:07:41 +0200367 assert(PyExceptionClass_Check(ob));
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300368 return ((PyTypeObject*)ob)->tp_name;
Christian Tismerea62ce72018-06-09 20:32:25 +0200369}
Collin Winter828f04a2007-08-31 00:04:24 +0000370
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700371static struct PyMemberDef BaseException_members[] = {
372 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200373 offsetof(PyBaseExceptionObject, suppress_context)},
374 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700375};
376
377
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000379 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000380 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000381 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
382 0, /*tp_itemsize*/
383 (destructor)BaseException_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200384 0, /*tp_vectorcall_offset*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000385 0, /*tp_getattr*/
386 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200387 0, /*tp_as_async*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 (reprfunc)BaseException_repr, /*tp_repr*/
389 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000390 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000391 0, /*tp_as_mapping*/
392 0, /*tp_hash */
393 0, /*tp_call*/
394 (reprfunc)BaseException_str, /*tp_str*/
395 PyObject_GenericGetAttr, /*tp_getattro*/
396 PyObject_GenericSetAttr, /*tp_setattro*/
397 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000398 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000400 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
401 (traverseproc)BaseException_traverse, /* tp_traverse */
402 (inquiry)BaseException_clear, /* tp_clear */
403 0, /* tp_richcompare */
404 0, /* tp_weaklistoffset */
405 0, /* tp_iter */
406 0, /* tp_iternext */
407 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700408 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409 BaseException_getset, /* tp_getset */
410 0, /* tp_base */
411 0, /* tp_dict */
412 0, /* tp_descr_get */
413 0, /* tp_descr_set */
414 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
415 (initproc)BaseException_init, /* tp_init */
416 0, /* tp_alloc */
417 BaseException_new, /* tp_new */
418};
419/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
Min ho Kimc4cacc82019-07-31 08:16:13 +1000420from the previous implementation and also allowing Python objects to be used
Thomas Wouters477c8d52006-05-27 19:21:47 +0000421in the API */
422PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
423
424/* note these macros omit the last semicolon so the macro invocation may
425 * include it and not look strange.
426 */
427#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
428static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000429 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000430 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 sizeof(PyBaseExceptionObject), \
432 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
433 0, 0, 0, 0, 0, 0, 0, \
434 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
435 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
436 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
437 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
438 (initproc)BaseException_init, 0, BaseException_new,\
439}; \
440PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
441
442#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
443static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000444 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000445 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000446 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000447 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000448 0, 0, 0, 0, 0, \
449 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000450 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
451 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000452 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200453 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000454}; \
455PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
456
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200457#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
458 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
459 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000461 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000462 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000463 sizeof(Py ## EXCSTORE ## Object), 0, \
464 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
465 (reprfunc)EXCSTR, 0, 0, 0, \
466 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
467 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
468 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200471 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000472}; \
473PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
474
475
476/*
477 * Exception extends BaseException
478 */
479SimpleExtendsException(PyExc_BaseException, Exception,
480 "Common base class for all non-exit exceptions.");
481
482
483/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000484 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000485 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000486SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000487 "Inappropriate argument type.");
488
489
490/*
Yury Selivanov75445082015-05-11 22:57:16 -0400491 * StopAsyncIteration extends Exception
492 */
493SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
494 "Signal the end from iterator.__anext__().");
495
496
497/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000498 * StopIteration extends Exception
499 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000500
501static PyMemberDef StopIteration_members[] = {
502 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
503 PyDoc_STR("generator return value")},
504 {NULL} /* Sentinel */
505};
506
507static int
508StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
509{
510 Py_ssize_t size = PyTuple_GET_SIZE(args);
511 PyObject *value;
512
513 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
514 return -1;
515 Py_CLEAR(self->value);
516 if (size > 0)
517 value = PyTuple_GET_ITEM(args, 0);
518 else
519 value = Py_None;
520 Py_INCREF(value);
521 self->value = value;
522 return 0;
523}
524
525static int
526StopIteration_clear(PyStopIterationObject *self)
527{
528 Py_CLEAR(self->value);
529 return BaseException_clear((PyBaseExceptionObject *)self);
530}
531
532static void
533StopIteration_dealloc(PyStopIterationObject *self)
534{
535 _PyObject_GC_UNTRACK(self);
536 StopIteration_clear(self);
537 Py_TYPE(self)->tp_free((PyObject *)self);
538}
539
540static int
541StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
542{
543 Py_VISIT(self->value);
544 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
545}
546
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000547ComplexExtendsException(
548 PyExc_Exception, /* base */
549 StopIteration, /* name */
550 StopIteration, /* prefix for *_init, etc */
551 0, /* new */
552 0, /* methods */
553 StopIteration_members, /* members */
554 0, /* getset */
555 0, /* str */
556 "Signal the end from iterator.__next__()."
557);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558
559
560/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000561 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000562 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000563SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000564 "Request that a generator exit.");
565
566
567/*
568 * SystemExit extends BaseException
569 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000570
571static int
572SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
573{
574 Py_ssize_t size = PyTuple_GET_SIZE(args);
575
576 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
577 return -1;
578
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000579 if (size == 0)
580 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200581 if (size == 1) {
582 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300583 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200584 }
585 else { /* size > 1 */
586 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300587 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200588 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000589 return 0;
590}
591
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000592static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000593SystemExit_clear(PySystemExitObject *self)
594{
595 Py_CLEAR(self->code);
596 return BaseException_clear((PyBaseExceptionObject *)self);
597}
598
599static void
600SystemExit_dealloc(PySystemExitObject *self)
601{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000602 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000603 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000604 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605}
606
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000607static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
609{
610 Py_VISIT(self->code);
611 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
612}
613
614static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000615 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
616 PyDoc_STR("exception code")},
617 {NULL} /* Sentinel */
618};
619
620ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200621 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000622 "Request to exit from the interpreter.");
623
624/*
625 * KeyboardInterrupt extends BaseException
626 */
627SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
628 "Program interrupted by user.");
629
630
631/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000632 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000633 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000634
Brett Cannon79ec55e2012-04-12 20:24:54 -0400635static int
636ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
637{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300638 static char *kwlist[] = {"name", "path", 0};
639 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400640 PyObject *msg = NULL;
641 PyObject *name = NULL;
642 PyObject *path = NULL;
643
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300644 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400645 return -1;
646
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300647 empty_tuple = PyTuple_New(0);
648 if (!empty_tuple)
649 return -1;
650 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
651 &name, &path)) {
652 Py_DECREF(empty_tuple);
653 return -1;
654 }
655 Py_DECREF(empty_tuple);
656
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300657 Py_XINCREF(name);
658 Py_XSETREF(self->name, name);
659
660 Py_XINCREF(path);
661 Py_XSETREF(self->path, path);
662
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300663 if (PyTuple_GET_SIZE(args) == 1) {
664 msg = PyTuple_GET_ITEM(args, 0);
665 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300666 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300667 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400668
669 return 0;
670}
671
672static int
673ImportError_clear(PyImportErrorObject *self)
674{
675 Py_CLEAR(self->msg);
676 Py_CLEAR(self->name);
677 Py_CLEAR(self->path);
678 return BaseException_clear((PyBaseExceptionObject *)self);
679}
680
681static void
682ImportError_dealloc(PyImportErrorObject *self)
683{
684 _PyObject_GC_UNTRACK(self);
685 ImportError_clear(self);
686 Py_TYPE(self)->tp_free((PyObject *)self);
687}
688
689static int
690ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
691{
692 Py_VISIT(self->msg);
693 Py_VISIT(self->name);
694 Py_VISIT(self->path);
695 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
696}
697
698static PyObject *
699ImportError_str(PyImportErrorObject *self)
700{
Brett Cannon07c6e712012-08-24 13:05:09 -0400701 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400702 Py_INCREF(self->msg);
703 return self->msg;
704 }
705 else {
706 return BaseException_str((PyBaseExceptionObject *)self);
707 }
708}
709
Serhiy Storchakab7853962017-04-08 09:55:07 +0300710static PyObject *
711ImportError_getstate(PyImportErrorObject *self)
712{
713 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
714 if (self->name || self->path) {
715 _Py_IDENTIFIER(name);
716 _Py_IDENTIFIER(path);
717 dict = dict ? PyDict_Copy(dict) : PyDict_New();
718 if (dict == NULL)
719 return NULL;
720 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
721 Py_DECREF(dict);
722 return NULL;
723 }
724 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
725 Py_DECREF(dict);
726 return NULL;
727 }
728 return dict;
729 }
730 else if (dict) {
731 Py_INCREF(dict);
732 return dict;
733 }
734 else {
735 Py_RETURN_NONE;
736 }
737}
738
739/* Pickling support */
740static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530741ImportError_reduce(PyImportErrorObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakab7853962017-04-08 09:55:07 +0300742{
743 PyObject *res;
744 PyObject *args;
745 PyObject *state = ImportError_getstate(self);
746 if (state == NULL)
747 return NULL;
748 args = ((PyBaseExceptionObject *)self)->args;
749 if (state == Py_None)
750 res = PyTuple_Pack(2, Py_TYPE(self), args);
751 else
752 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
753 Py_DECREF(state);
754 return res;
755}
756
Brett Cannon79ec55e2012-04-12 20:24:54 -0400757static PyMemberDef ImportError_members[] = {
758 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
759 PyDoc_STR("exception message")},
760 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
761 PyDoc_STR("module name")},
762 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
763 PyDoc_STR("module path")},
764 {NULL} /* Sentinel */
765};
766
767static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300768 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400769 {NULL}
770};
771
772ComplexExtendsException(PyExc_Exception, ImportError,
773 ImportError, 0 /* new */,
774 ImportError_methods, ImportError_members,
775 0 /* getset */, ImportError_str,
776 "Import can't find module, or can't find name in "
777 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000778
779/*
Eric Snowc9432652016-09-07 15:42:32 -0700780 * ModuleNotFoundError extends ImportError
781 */
782
783MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
784 "Module not found.");
785
786/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200787 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000788 */
789
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200790#ifdef MS_WINDOWS
791#include "errmap.h"
792#endif
793
Thomas Wouters477c8d52006-05-27 19:21:47 +0000794/* Where a function has a single filename, such as open() or some
795 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
796 * called, giving a third argument which is the filename. But, so
797 * that old code using in-place unpacking doesn't break, e.g.:
798 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200799 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000800 *
801 * we hack args so that it only contains two items. This also
802 * means we need our own __str__() which prints out the filename
803 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800804 *
805 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800806 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
807 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000808 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200809
Antoine Pitroue0e27352011-12-15 14:31:28 +0100810/* This function doesn't cleanup on error, the caller should */
811static int
812oserror_parse_args(PyObject **p_args,
813 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800814 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200815#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100816 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200817#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100818 )
819{
820 Py_ssize_t nargs;
821 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800822#ifndef MS_WINDOWS
823 /*
824 * ignored on non-Windows platforms,
825 * but parsed so OSError has a consistent signature
826 */
827 PyObject *_winerror = NULL;
828 PyObject **winerror = &_winerror;
829#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200831 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000832
Larry Hastingsb0827312014-02-09 22:05:19 -0800833 if (nargs >= 2 && nargs <= 5) {
834 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
835 myerrno, strerror,
836 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100837 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800838#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100839 if (*winerror && PyLong_Check(*winerror)) {
840 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200841 PyObject *newargs;
842 Py_ssize_t i;
843
Antoine Pitroue0e27352011-12-15 14:31:28 +0100844 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200845 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100846 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200847 /* Set errno to the corresponding POSIX errno (overriding
848 first argument). Windows Socket error codes (>= 10000)
849 have the same value as their POSIX counterparts.
850 */
851 if (winerrcode < 10000)
852 errcode = winerror_to_errno(winerrcode);
853 else
854 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855 *myerrno = PyLong_FromLong(errcode);
856 if (!*myerrno)
857 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200858 newargs = PyTuple_New(nargs);
859 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100860 return -1;
861 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200862 for (i = 1; i < nargs; i++) {
863 PyObject *val = PyTuple_GET_ITEM(args, i);
864 Py_INCREF(val);
865 PyTuple_SET_ITEM(newargs, i, val);
866 }
867 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100868 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200869 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800870#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200871 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000872
Antoine Pitroue0e27352011-12-15 14:31:28 +0100873 return 0;
874}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000875
Antoine Pitroue0e27352011-12-15 14:31:28 +0100876static int
877oserror_init(PyOSErrorObject *self, PyObject **p_args,
878 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800879 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100880#ifdef MS_WINDOWS
881 , PyObject *winerror
882#endif
883 )
884{
885 PyObject *args = *p_args;
886 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000887
888 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200889 if (filename && filename != Py_None) {
Andy Lesterdffe4c02020-03-04 07:15:20 -0600890 if (Py_IS_TYPE(self, (PyTypeObject *) PyExc_BlockingIOError) &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 PyNumber_Check(filename)) {
892 /* BlockingIOError's 3rd argument can be the number of
893 * characters written.
894 */
895 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
896 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100897 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200898 }
899 else {
900 Py_INCREF(filename);
901 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902
Larry Hastingsb0827312014-02-09 22:05:19 -0800903 if (filename2 && filename2 != Py_None) {
904 Py_INCREF(filename2);
905 self->filename2 = filename2;
906 }
907
908 if (nargs >= 2 && nargs <= 5) {
909 /* filename, filename2, and winerror are removed from the args tuple
910 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100911 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200912 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100913 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000914
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200915 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100916 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200917 }
918 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000919 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200920 Py_XINCREF(myerrno);
921 self->myerrno = myerrno;
922
923 Py_XINCREF(strerror);
924 self->strerror = strerror;
925
926#ifdef MS_WINDOWS
927 Py_XINCREF(winerror);
928 self->winerror = winerror;
929#endif
930
Antoine Pitroue0e27352011-12-15 14:31:28 +0100931 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300932 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100933 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100934
935 return 0;
936}
937
938static PyObject *
939OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
940static int
941OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
942
943static int
944oserror_use_init(PyTypeObject *type)
945{
Martin Panter7462b6492015-11-02 03:37:02 +0000946 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100947 extraneous argument to __new__ to be ignored. The only reasonable
948 solution, given __new__ takes a variable number of arguments,
949 is to defer arg parsing and initialization to __init__.
950
Martin Pantere26da7c2016-06-02 10:07:09 +0000951 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100952 with the right arguments.
953
954 (see http://bugs.python.org/issue12555#msg148829 )
955 */
956 if (type->tp_init != (initproc) OSError_init &&
957 type->tp_new == (newfunc) OSError_new) {
958 assert((PyObject *) type != PyExc_OSError);
959 return 1;
960 }
961 return 0;
962}
963
964static PyObject *
965OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
966{
967 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800968 PyObject *myerrno = NULL, *strerror = NULL;
969 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100970#ifdef MS_WINDOWS
971 PyObject *winerror = NULL;
972#endif
973
Victor Stinner46ef3192013-11-14 22:31:41 +0100974 Py_INCREF(args);
975
Antoine Pitroue0e27352011-12-15 14:31:28 +0100976 if (!oserror_use_init(type)) {
977 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100978 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100979
Larry Hastingsb0827312014-02-09 22:05:19 -0800980 if (oserror_parse_args(&args, &myerrno, &strerror,
981 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100982#ifdef MS_WINDOWS
983 , &winerror
984#endif
985 ))
986 goto error;
987
988 if (myerrno && PyLong_Check(myerrno) &&
989 errnomap && (PyObject *) type == PyExc_OSError) {
990 PyObject *newtype;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200991 newtype = PyDict_GetItemWithError(errnomap, myerrno);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100992 if (newtype) {
993 assert(PyType_Check(newtype));
994 type = (PyTypeObject *) newtype;
995 }
996 else if (PyErr_Occurred())
997 goto error;
998 }
999 }
1000
1001 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
1002 if (!self)
1003 goto error;
1004
1005 self->dict = NULL;
1006 self->traceback = self->cause = self->context = NULL;
1007 self->written = -1;
1008
1009 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001010 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001011#ifdef MS_WINDOWS
1012 , winerror
1013#endif
1014 ))
1015 goto error;
1016 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +02001017 else {
1018 self->args = PyTuple_New(0);
1019 if (self->args == NULL)
1020 goto error;
1021 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001022
Victor Stinner46ef3192013-11-14 22:31:41 +01001023 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001024 return (PyObject *) self;
1025
1026error:
1027 Py_XDECREF(args);
1028 Py_XDECREF(self);
1029 return NULL;
1030}
1031
1032static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001033OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001034{
Larry Hastingsb0827312014-02-09 22:05:19 -08001035 PyObject *myerrno = NULL, *strerror = NULL;
1036 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001037#ifdef MS_WINDOWS
1038 PyObject *winerror = NULL;
1039#endif
1040
1041 if (!oserror_use_init(Py_TYPE(self)))
1042 /* Everything already done in OSError_new */
1043 return 0;
1044
1045 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1046 return -1;
1047
1048 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001049 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001050#ifdef MS_WINDOWS
1051 , &winerror
1052#endif
1053 ))
1054 goto error;
1055
Larry Hastingsb0827312014-02-09 22:05:19 -08001056 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001057#ifdef MS_WINDOWS
1058 , winerror
1059#endif
1060 ))
1061 goto error;
1062
Thomas Wouters477c8d52006-05-27 19:21:47 +00001063 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001064
1065error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001066 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001067 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068}
1069
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001070static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072{
1073 Py_CLEAR(self->myerrno);
1074 Py_CLEAR(self->strerror);
1075 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001076 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001077#ifdef MS_WINDOWS
1078 Py_CLEAR(self->winerror);
1079#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001080 return BaseException_clear((PyBaseExceptionObject *)self);
1081}
1082
1083static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001084OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001085{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001087 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001088 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001089}
1090
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001091static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001092OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001093 void *arg)
1094{
1095 Py_VISIT(self->myerrno);
1096 Py_VISIT(self->strerror);
1097 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001098 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001099#ifdef MS_WINDOWS
1100 Py_VISIT(self->winerror);
1101#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001102 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1103}
1104
1105static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001106OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001107{
Larry Hastingsb0827312014-02-09 22:05:19 -08001108#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001109#ifdef MS_WINDOWS
1110 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001111 if (self->winerror && self->filename) {
1112 if (self->filename2) {
1113 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1114 OR_NONE(self->winerror),
1115 OR_NONE(self->strerror),
1116 self->filename,
1117 self->filename2);
1118 } else {
1119 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1120 OR_NONE(self->winerror),
1121 OR_NONE(self->strerror),
1122 self->filename);
1123 }
1124 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001125 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001126 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001127 self->winerror ? self->winerror: Py_None,
1128 self->strerror ? self->strerror: Py_None);
1129#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001130 if (self->filename) {
1131 if (self->filename2) {
1132 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1133 OR_NONE(self->myerrno),
1134 OR_NONE(self->strerror),
1135 self->filename,
1136 self->filename2);
1137 } else {
1138 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1139 OR_NONE(self->myerrno),
1140 OR_NONE(self->strerror),
1141 self->filename);
1142 }
1143 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001144 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001145 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001146 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001147 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148}
1149
Thomas Wouters477c8d52006-05-27 19:21:47 +00001150static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301151OSError_reduce(PyOSErrorObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001152{
1153 PyObject *args = self->args;
1154 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001155
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001157 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001158 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001159 Py_ssize_t size = self->filename2 ? 5 : 3;
1160 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001161 if (!args)
1162 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001163
1164 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001165 Py_INCREF(tmp);
1166 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001167
1168 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001169 Py_INCREF(tmp);
1170 PyTuple_SET_ITEM(args, 1, tmp);
1171
1172 Py_INCREF(self->filename);
1173 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001174
1175 if (self->filename2) {
1176 /*
1177 * This tuple is essentially used as OSError(*args).
1178 * So, to recreate filename2, we need to pass in
1179 * winerror as well.
1180 */
1181 Py_INCREF(Py_None);
1182 PyTuple_SET_ITEM(args, 3, Py_None);
1183
1184 /* filename2 */
1185 Py_INCREF(self->filename2);
1186 PyTuple_SET_ITEM(args, 4, self->filename2);
1187 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001188 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001189 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001190
1191 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001192 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001193 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001194 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001195 Py_DECREF(args);
1196 return res;
1197}
1198
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001199static PyObject *
1200OSError_written_get(PyOSErrorObject *self, void *context)
1201{
1202 if (self->written == -1) {
1203 PyErr_SetString(PyExc_AttributeError, "characters_written");
1204 return NULL;
1205 }
1206 return PyLong_FromSsize_t(self->written);
1207}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001208
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001209static int
1210OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1211{
Serhiy Storchakae2af34f2018-12-17 16:43:14 +02001212 if (arg == NULL) {
1213 if (self->written == -1) {
1214 PyErr_SetString(PyExc_AttributeError, "characters_written");
1215 return -1;
1216 }
1217 self->written = -1;
1218 return 0;
1219 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001220 Py_ssize_t n;
1221 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1222 if (n == -1 && PyErr_Occurred())
1223 return -1;
1224 self->written = n;
1225 return 0;
1226}
1227
1228static PyMemberDef OSError_members[] = {
1229 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1230 PyDoc_STR("POSIX exception code")},
1231 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1232 PyDoc_STR("exception strerror")},
1233 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1234 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001235 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1236 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001237#ifdef MS_WINDOWS
1238 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1239 PyDoc_STR("Win32 exception code")},
1240#endif
1241 {NULL} /* Sentinel */
1242};
1243
1244static PyMethodDef OSError_methods[] = {
1245 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001246 {NULL}
1247};
1248
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001249static PyGetSetDef OSError_getset[] = {
1250 {"characters_written", (getter) OSError_written_get,
1251 (setter) OSError_written_set, NULL},
1252 {NULL}
1253};
1254
1255
1256ComplexExtendsException(PyExc_Exception, OSError,
1257 OSError, OSError_new,
1258 OSError_methods, OSError_members, OSError_getset,
1259 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001260 "Base class for I/O related errors.");
1261
1262
1263/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001264 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001265 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001266MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1267 "I/O operation would block.");
1268MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1269 "Connection error.");
1270MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1271 "Child process error.");
1272MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1273 "Broken pipe.");
1274MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1275 "Connection aborted.");
1276MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1277 "Connection refused.");
1278MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1279 "Connection reset.");
1280MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1281 "File already exists.");
1282MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1283 "File not found.");
1284MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1285 "Operation doesn't work on directories.");
1286MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1287 "Operation only works on directories.");
1288MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1289 "Interrupted by signal.");
1290MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1291 "Not enough permissions.");
1292MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1293 "Process not found.");
1294MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1295 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001296
1297/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001298 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001299 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001300SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301 "Read beyond end of file.");
1302
1303
1304/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001305 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001306 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001307SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001308 "Unspecified run-time error.");
1309
Yury Selivanovf488fb42015-07-03 01:04:23 -04001310/*
1311 * RecursionError extends RuntimeError
1312 */
1313SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1314 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315
1316/*
1317 * NotImplementedError extends RuntimeError
1318 */
1319SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1320 "Method or function hasn't been implemented yet.");
1321
1322/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001323 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001325SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001326 "Name not found globally.");
1327
1328/*
1329 * UnboundLocalError extends NameError
1330 */
1331SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1332 "Local name referenced but not bound to a value.");
1333
1334/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001335 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001336 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001337SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338 "Attribute not found.");
1339
1340
1341/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001342 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001343 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001344
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001345/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001346static int _report_missing_parentheses(PySyntaxErrorObject *self);
1347
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348static int
1349SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1350{
1351 PyObject *info = NULL;
1352 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1353
1354 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1355 return -1;
1356
1357 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001358 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001359 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001360 }
1361 if (lenargs == 2) {
1362 info = PyTuple_GET_ITEM(args, 1);
1363 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001364 if (!info)
1365 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001367 if (PyTuple_GET_SIZE(info) != 4) {
1368 /* not a very good error message, but it's what Python 2.4 gives */
1369 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1370 Py_DECREF(info);
1371 return -1;
1372 }
1373
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001374 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001375 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001376
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001377 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001378 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001380 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001381 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001383 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001384 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001385
1386 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001387
Martijn Pieters772d8092017-08-22 21:16:23 +01001388 /*
1389 * Issue #21669: Custom error for 'print' & 'exec' as statements
1390 *
1391 * Only applies to SyntaxError instances, not to subclasses such
1392 * as TabError or IndentationError (see issue #31161)
1393 */
Andy Lesterdffe4c02020-03-04 07:15:20 -06001394 if (Py_IS_TYPE(self, (PyTypeObject *)PyExc_SyntaxError) &&
Martijn Pieters772d8092017-08-22 21:16:23 +01001395 self->text && PyUnicode_Check(self->text) &&
1396 _report_missing_parentheses(self) < 0) {
1397 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001398 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001399 }
1400 return 0;
1401}
1402
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001403static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001404SyntaxError_clear(PySyntaxErrorObject *self)
1405{
1406 Py_CLEAR(self->msg);
1407 Py_CLEAR(self->filename);
1408 Py_CLEAR(self->lineno);
1409 Py_CLEAR(self->offset);
1410 Py_CLEAR(self->text);
1411 Py_CLEAR(self->print_file_and_line);
1412 return BaseException_clear((PyBaseExceptionObject *)self);
1413}
1414
1415static void
1416SyntaxError_dealloc(PySyntaxErrorObject *self)
1417{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001419 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001420 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421}
1422
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001423static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001424SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1425{
1426 Py_VISIT(self->msg);
1427 Py_VISIT(self->filename);
1428 Py_VISIT(self->lineno);
1429 Py_VISIT(self->offset);
1430 Py_VISIT(self->text);
1431 Py_VISIT(self->print_file_and_line);
1432 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1433}
1434
1435/* This is called "my_basename" instead of just "basename" to avoid name
1436 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1437 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001438static PyObject*
1439my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001440{
Victor Stinner6237daf2010-04-28 17:26:19 +00001441 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001442 int kind;
Serhiy Storchakacd8295f2020-04-11 10:48:40 +03001443 const void *data;
Victor Stinner31392e72011-10-05 20:14:23 +02001444
1445 if (PyUnicode_READY(name))
1446 return NULL;
1447 kind = PyUnicode_KIND(name);
1448 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001449 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001450 offset = 0;
1451 for(i=0; i < size; i++) {
Victor Stinner361dcdc2020-04-15 03:24:57 +02001452 if (PyUnicode_READ(kind, data, i) == SEP) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001453 offset = i + 1;
Victor Stinner361dcdc2020-04-15 03:24:57 +02001454 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455 }
Victor Stinner361dcdc2020-04-15 03:24:57 +02001456 if (offset != 0) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001457 return PyUnicode_Substring(name, offset, size);
Victor Stinner361dcdc2020-04-15 03:24:57 +02001458 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001459 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001460 Py_INCREF(name);
1461 return name;
1462 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001463}
1464
1465
1466static PyObject *
1467SyntaxError_str(PySyntaxErrorObject *self)
1468{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001469 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001470 PyObject *filename;
1471 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001472 /* Below, we always ignore overflow errors, just printing -1.
1473 Still, we cannot allow an OverflowError to be raised, so
1474 we need to call PyLong_AsLongAndOverflow. */
1475 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001476
1477 /* XXX -- do all the additional formatting with filename and
1478 lineno here */
1479
Neal Norwitzed2b7392007-08-26 04:51:10 +00001480 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001481 filename = my_basename(self->filename);
1482 if (filename == NULL)
1483 return NULL;
1484 } else {
1485 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001486 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001487 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001488
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001489 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001490 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001491
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001492 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001493 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001494 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001495 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001497 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001498 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001499 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001500 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001501 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001502 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001503 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001504 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001505 Py_XDECREF(filename);
1506 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001507}
1508
1509static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001510 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1511 PyDoc_STR("exception msg")},
1512 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1513 PyDoc_STR("exception filename")},
1514 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1515 PyDoc_STR("exception lineno")},
1516 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1517 PyDoc_STR("exception offset")},
1518 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1519 PyDoc_STR("exception text")},
1520 {"print_file_and_line", T_OBJECT,
1521 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1522 PyDoc_STR("exception print_file_and_line")},
1523 {NULL} /* Sentinel */
1524};
1525
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001526ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001527 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001528 SyntaxError_str, "Invalid syntax.");
1529
1530
1531/*
1532 * IndentationError extends SyntaxError
1533 */
1534MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1535 "Improper indentation.");
1536
1537
1538/*
1539 * TabError extends IndentationError
1540 */
1541MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1542 "Improper mixture of spaces and tabs.");
1543
1544
1545/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001546 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001547 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001548SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549 "Base class for lookup errors.");
1550
1551
1552/*
1553 * IndexError extends LookupError
1554 */
1555SimpleExtendsException(PyExc_LookupError, IndexError,
1556 "Sequence index out of range.");
1557
1558
1559/*
1560 * KeyError extends LookupError
1561 */
1562static PyObject *
1563KeyError_str(PyBaseExceptionObject *self)
1564{
1565 /* If args is a tuple of exactly one item, apply repr to args[0].
1566 This is done so that e.g. the exception raised by {}[''] prints
1567 KeyError: ''
1568 rather than the confusing
1569 KeyError
1570 alone. The downside is that if KeyError is raised with an explanatory
1571 string, that string will be displayed in quotes. Too bad.
1572 If args is anything else, use the default BaseException__str__().
1573 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001574 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001575 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001576 }
1577 return BaseException_str(self);
1578}
1579
1580ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001581 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582
1583
1584/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001585 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001586 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001587SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001588 "Inappropriate argument value (of correct type).");
1589
1590/*
1591 * UnicodeError extends ValueError
1592 */
1593
1594SimpleExtendsException(PyExc_ValueError, UnicodeError,
1595 "Unicode related error.");
1596
Thomas Wouters477c8d52006-05-27 19:21:47 +00001597static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001598get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001599{
1600 if (!attr) {
1601 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1602 return NULL;
1603 }
1604
Christian Heimes72b710a2008-05-26 13:28:38 +00001605 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001606 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1607 return NULL;
1608 }
1609 Py_INCREF(attr);
1610 return attr;
1611}
1612
1613static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001614get_unicode(PyObject *attr, const char *name)
1615{
1616 if (!attr) {
1617 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1618 return NULL;
1619 }
1620
1621 if (!PyUnicode_Check(attr)) {
1622 PyErr_Format(PyExc_TypeError,
1623 "%.200s attribute must be unicode", name);
1624 return NULL;
1625 }
1626 Py_INCREF(attr);
1627 return attr;
1628}
1629
Walter Dörwaldd2034312007-05-18 16:29:38 +00001630static int
1631set_unicodefromstring(PyObject **attr, const char *value)
1632{
1633 PyObject *obj = PyUnicode_FromString(value);
1634 if (!obj)
1635 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001636 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001637 return 0;
1638}
1639
Thomas Wouters477c8d52006-05-27 19:21:47 +00001640PyObject *
1641PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1642{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001643 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001644}
1645
1646PyObject *
1647PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1648{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001649 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001650}
1651
1652PyObject *
1653PyUnicodeEncodeError_GetObject(PyObject *exc)
1654{
1655 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1656}
1657
1658PyObject *
1659PyUnicodeDecodeError_GetObject(PyObject *exc)
1660{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001661 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001662}
1663
1664PyObject *
1665PyUnicodeTranslateError_GetObject(PyObject *exc)
1666{
1667 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1668}
1669
1670int
1671PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1672{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001673 Py_ssize_t size;
1674 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1675 "object");
1676 if (!obj)
1677 return -1;
1678 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001679 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001680 if (*start<0)
1681 *start = 0; /*XXX check for values <0*/
1682 if (*start>=size)
1683 *start = size-1;
1684 Py_DECREF(obj);
1685 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001686}
1687
1688
1689int
1690PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1691{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001692 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001693 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001694 if (!obj)
1695 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001696 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001697 *start = ((PyUnicodeErrorObject *)exc)->start;
1698 if (*start<0)
1699 *start = 0;
1700 if (*start>=size)
1701 *start = size-1;
1702 Py_DECREF(obj);
1703 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704}
1705
1706
1707int
1708PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1709{
1710 return PyUnicodeEncodeError_GetStart(exc, start);
1711}
1712
1713
1714int
1715PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1716{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001717 ((PyUnicodeErrorObject *)exc)->start = start;
1718 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719}
1720
1721
1722int
1723PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1724{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001725 ((PyUnicodeErrorObject *)exc)->start = start;
1726 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001727}
1728
1729
1730int
1731PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1732{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001733 ((PyUnicodeErrorObject *)exc)->start = start;
1734 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001735}
1736
1737
1738int
1739PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1740{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001741 Py_ssize_t size;
1742 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1743 "object");
1744 if (!obj)
1745 return -1;
1746 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001747 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001748 if (*end<1)
1749 *end = 1;
1750 if (*end>size)
1751 *end = size;
1752 Py_DECREF(obj);
1753 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001754}
1755
1756
1757int
1758PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1759{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001760 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001761 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001762 if (!obj)
1763 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001764 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001765 *end = ((PyUnicodeErrorObject *)exc)->end;
1766 if (*end<1)
1767 *end = 1;
1768 if (*end>size)
1769 *end = size;
1770 Py_DECREF(obj);
1771 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772}
1773
1774
1775int
Max Bernsteine6a0e802019-04-02 01:16:22 -07001776PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777{
Max Bernsteine6a0e802019-04-02 01:16:22 -07001778 return PyUnicodeEncodeError_GetEnd(exc, end);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779}
1780
1781
1782int
1783PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1784{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001785 ((PyUnicodeErrorObject *)exc)->end = end;
1786 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001787}
1788
1789
1790int
1791PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1792{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001793 ((PyUnicodeErrorObject *)exc)->end = end;
1794 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001795}
1796
1797
1798int
1799PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1800{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001801 ((PyUnicodeErrorObject *)exc)->end = end;
1802 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803}
1804
1805PyObject *
1806PyUnicodeEncodeError_GetReason(PyObject *exc)
1807{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001808 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001809}
1810
1811
1812PyObject *
1813PyUnicodeDecodeError_GetReason(PyObject *exc)
1814{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001815 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816}
1817
1818
1819PyObject *
1820PyUnicodeTranslateError_GetReason(PyObject *exc)
1821{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001822 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823}
1824
1825
1826int
1827PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1828{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001829 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1830 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001831}
1832
1833
1834int
1835PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1836{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001837 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1838 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839}
1840
1841
1842int
1843PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1844{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001845 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1846 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847}
1848
1849
Thomas Wouters477c8d52006-05-27 19:21:47 +00001850static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851UnicodeError_clear(PyUnicodeErrorObject *self)
1852{
1853 Py_CLEAR(self->encoding);
1854 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001855 Py_CLEAR(self->reason);
1856 return BaseException_clear((PyBaseExceptionObject *)self);
1857}
1858
1859static void
1860UnicodeError_dealloc(PyUnicodeErrorObject *self)
1861{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001863 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001864 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865}
1866
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001867static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001868UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1869{
1870 Py_VISIT(self->encoding);
1871 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001872 Py_VISIT(self->reason);
1873 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1874}
1875
1876static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001877 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1878 PyDoc_STR("exception encoding")},
1879 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1880 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001881 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001882 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001883 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001884 PyDoc_STR("exception end")},
1885 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1886 PyDoc_STR("exception reason")},
1887 {NULL} /* Sentinel */
1888};
1889
1890
1891/*
1892 * UnicodeEncodeError extends UnicodeError
1893 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001894
1895static int
1896UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1897{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001898 PyUnicodeErrorObject *err;
1899
Thomas Wouters477c8d52006-05-27 19:21:47 +00001900 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1901 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001902
1903 err = (PyUnicodeErrorObject *)self;
1904
1905 Py_CLEAR(err->encoding);
1906 Py_CLEAR(err->object);
1907 Py_CLEAR(err->reason);
1908
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001909 if (!PyArg_ParseTuple(args, "UUnnU",
1910 &err->encoding, &err->object,
1911 &err->start, &err->end, &err->reason)) {
1912 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001913 return -1;
1914 }
1915
Guido van Rossum98297ee2007-11-06 21:34:58 +00001916 Py_INCREF(err->encoding);
1917 Py_INCREF(err->object);
1918 Py_INCREF(err->reason);
1919
1920 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001921}
1922
1923static PyObject *
1924UnicodeEncodeError_str(PyObject *self)
1925{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001926 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001927 PyObject *result = NULL;
1928 PyObject *reason_str = NULL;
1929 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001930
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001931 if (!uself->object)
1932 /* Not properly initialized. */
1933 return PyUnicode_FromString("");
1934
Eric Smith0facd772010-02-24 15:42:29 +00001935 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001936 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001937 reason_str = PyObject_Str(uself->reason);
1938 if (reason_str == NULL)
1939 goto done;
1940 encoding_str = PyObject_Str(uself->encoding);
1941 if (encoding_str == NULL)
1942 goto done;
1943
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001944 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1945 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001946 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001947 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001948 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001949 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001950 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001951 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001952 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001953 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001954 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001955 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001956 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001957 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001958 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001959 }
Eric Smith0facd772010-02-24 15:42:29 +00001960 else {
1961 result = PyUnicode_FromFormat(
1962 "'%U' codec can't encode characters in position %zd-%zd: %U",
1963 encoding_str,
1964 uself->start,
1965 uself->end-1,
1966 reason_str);
1967 }
1968done:
1969 Py_XDECREF(reason_str);
1970 Py_XDECREF(encoding_str);
1971 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972}
1973
1974static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001975 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001976 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977 sizeof(PyUnicodeErrorObject), 0,
1978 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1979 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1980 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001981 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1982 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001984 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001985};
1986PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1987
1988PyObject *
1989PyUnicodeEncodeError_Create(
1990 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1991 Py_ssize_t start, Py_ssize_t end, const char *reason)
1992{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001993 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001994 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001995}
1996
1997
1998/*
1999 * UnicodeDecodeError extends UnicodeError
2000 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002001
2002static int
2003UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
2004{
Guido van Rossum98297ee2007-11-06 21:34:58 +00002005 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00002006
Thomas Wouters477c8d52006-05-27 19:21:47 +00002007 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2008 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00002009
2010 ude = (PyUnicodeErrorObject *)self;
2011
2012 Py_CLEAR(ude->encoding);
2013 Py_CLEAR(ude->object);
2014 Py_CLEAR(ude->reason);
2015
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002016 if (!PyArg_ParseTuple(args, "UOnnU",
2017 &ude->encoding, &ude->object,
2018 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002019 ude->encoding = ude->object = ude->reason = NULL;
2020 return -1;
2021 }
2022
Guido van Rossum98297ee2007-11-06 21:34:58 +00002023 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002024 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002025 Py_INCREF(ude->reason);
2026
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002027 if (!PyBytes_Check(ude->object)) {
2028 Py_buffer view;
2029 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2030 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002031 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002032 PyBuffer_Release(&view);
2033 if (!ude->object)
2034 goto error;
2035 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002036 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002037
2038error:
2039 Py_CLEAR(ude->encoding);
2040 Py_CLEAR(ude->object);
2041 Py_CLEAR(ude->reason);
2042 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002043}
2044
2045static PyObject *
2046UnicodeDecodeError_str(PyObject *self)
2047{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002048 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002049 PyObject *result = NULL;
2050 PyObject *reason_str = NULL;
2051 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002052
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002053 if (!uself->object)
2054 /* Not properly initialized. */
2055 return PyUnicode_FromString("");
2056
Eric Smith0facd772010-02-24 15:42:29 +00002057 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002058 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002059 reason_str = PyObject_Str(uself->reason);
2060 if (reason_str == NULL)
2061 goto done;
2062 encoding_str = PyObject_Str(uself->encoding);
2063 if (encoding_str == NULL)
2064 goto done;
2065
2066 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002067 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002068 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002069 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002070 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002071 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002072 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002073 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074 }
Eric Smith0facd772010-02-24 15:42:29 +00002075 else {
2076 result = PyUnicode_FromFormat(
2077 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2078 encoding_str,
2079 uself->start,
2080 uself->end-1,
2081 reason_str
2082 );
2083 }
2084done:
2085 Py_XDECREF(reason_str);
2086 Py_XDECREF(encoding_str);
2087 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002088}
2089
2090static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002091 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002092 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 sizeof(PyUnicodeErrorObject), 0,
2094 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2095 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2096 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002097 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2098 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002100 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101};
2102PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2103
2104PyObject *
2105PyUnicodeDecodeError_Create(
2106 const char *encoding, const char *object, Py_ssize_t length,
2107 Py_ssize_t start, Py_ssize_t end, const char *reason)
2108{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002109 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002110 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002111}
2112
2113
2114/*
2115 * UnicodeTranslateError extends UnicodeError
2116 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002117
2118static int
2119UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2120 PyObject *kwds)
2121{
2122 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2123 return -1;
2124
2125 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002126 Py_CLEAR(self->reason);
2127
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002128 if (!PyArg_ParseTuple(args, "UnnU",
2129 &self->object,
2130 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002131 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002132 return -1;
2133 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002134
Thomas Wouters477c8d52006-05-27 19:21:47 +00002135 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002136 Py_INCREF(self->reason);
2137
2138 return 0;
2139}
2140
2141
2142static PyObject *
2143UnicodeTranslateError_str(PyObject *self)
2144{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002145 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002146 PyObject *result = NULL;
2147 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002148
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002149 if (!uself->object)
2150 /* Not properly initialized. */
2151 return PyUnicode_FromString("");
2152
Eric Smith0facd772010-02-24 15:42:29 +00002153 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002154 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002155 reason_str = PyObject_Str(uself->reason);
2156 if (reason_str == NULL)
2157 goto done;
2158
Victor Stinner53b33e72011-11-21 01:17:27 +01002159 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2160 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002161 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002162 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002163 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002164 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002165 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002166 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002167 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002168 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002169 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002170 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002171 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002172 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002173 );
Eric Smith0facd772010-02-24 15:42:29 +00002174 } else {
2175 result = PyUnicode_FromFormat(
2176 "can't translate characters in position %zd-%zd: %U",
2177 uself->start,
2178 uself->end-1,
2179 reason_str
2180 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002181 }
Eric Smith0facd772010-02-24 15:42:29 +00002182done:
2183 Py_XDECREF(reason_str);
2184 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002185}
2186
2187static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002188 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002189 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002190 sizeof(PyUnicodeErrorObject), 0,
2191 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2192 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2193 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002194 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2196 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002197 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198};
2199PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2200
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002201/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002202PyObject *
2203PyUnicodeTranslateError_Create(
2204 const Py_UNICODE *object, Py_ssize_t length,
2205 Py_ssize_t start, Py_ssize_t end, const char *reason)
2206{
2207 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002208 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002209}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002210
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002211PyObject *
2212_PyUnicodeTranslateError_Create(
2213 PyObject *object,
2214 Py_ssize_t start, Py_ssize_t end, const char *reason)
2215{
Victor Stinner69598d42014-04-04 20:59:44 +02002216 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002217 object, start, end, reason);
2218}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002219
2220/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002221 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002222 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002223SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 "Assertion failed.");
2225
2226
2227/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002228 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002229 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002230SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002231 "Base class for arithmetic errors.");
2232
2233
2234/*
2235 * FloatingPointError extends ArithmeticError
2236 */
2237SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2238 "Floating point operation failed.");
2239
2240
2241/*
2242 * OverflowError extends ArithmeticError
2243 */
2244SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2245 "Result too large to be represented.");
2246
2247
2248/*
2249 * ZeroDivisionError extends ArithmeticError
2250 */
2251SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2252 "Second argument to a division or modulo operation was zero.");
2253
2254
2255/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002256 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002257 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002258SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002259 "Internal error in the Python interpreter.\n"
2260 "\n"
2261 "Please report this to the Python maintainer, along with the traceback,\n"
2262 "the Python version, and the hardware/OS platform and version.");
2263
2264
2265/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002266 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002267 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002268SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002269 "Weak ref proxy used after referent went away.");
2270
2271
2272/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002273 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002274 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002275
2276#define MEMERRORS_SAVE 16
2277static PyBaseExceptionObject *memerrors_freelist = NULL;
2278static int memerrors_numfree = 0;
2279
2280static PyObject *
2281MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2282{
2283 PyBaseExceptionObject *self;
2284
2285 if (type != (PyTypeObject *) PyExc_MemoryError)
2286 return BaseException_new(type, args, kwds);
2287 if (memerrors_freelist == NULL)
2288 return BaseException_new(type, args, kwds);
2289 /* Fetch object from freelist and revive it */
2290 self = memerrors_freelist;
2291 self->args = PyTuple_New(0);
2292 /* This shouldn't happen since the empty tuple is persistent */
2293 if (self->args == NULL)
2294 return NULL;
2295 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2296 memerrors_numfree--;
2297 self->dict = NULL;
2298 _Py_NewReference((PyObject *)self);
2299 _PyObject_GC_TRACK(self);
2300 return (PyObject *)self;
2301}
2302
2303static void
2304MemoryError_dealloc(PyBaseExceptionObject *self)
2305{
2306 _PyObject_GC_UNTRACK(self);
2307 BaseException_clear(self);
2308 if (memerrors_numfree >= MEMERRORS_SAVE)
2309 Py_TYPE(self)->tp_free((PyObject *)self);
2310 else {
2311 self->dict = (PyObject *) memerrors_freelist;
2312 memerrors_freelist = self;
2313 memerrors_numfree++;
2314 }
2315}
2316
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002317static int
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002318preallocate_memerrors(void)
2319{
2320 /* We create enough MemoryErrors and then decref them, which will fill
2321 up the freelist. */
2322 int i;
2323 PyObject *errors[MEMERRORS_SAVE];
2324 for (i = 0; i < MEMERRORS_SAVE; i++) {
2325 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2326 NULL, NULL);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002327 if (!errors[i]) {
2328 return -1;
2329 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002330 }
2331 for (i = 0; i < MEMERRORS_SAVE; i++) {
2332 Py_DECREF(errors[i]);
2333 }
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002334 return 0;
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002335}
2336
2337static void
2338free_preallocated_memerrors(void)
2339{
2340 while (memerrors_freelist != NULL) {
2341 PyObject *self = (PyObject *) memerrors_freelist;
2342 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2343 Py_TYPE(self)->tp_free((PyObject *)self);
2344 }
2345}
2346
2347
2348static PyTypeObject _PyExc_MemoryError = {
2349 PyVarObject_HEAD_INIT(NULL, 0)
2350 "MemoryError",
2351 sizeof(PyBaseExceptionObject),
2352 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2353 0, 0, 0, 0, 0, 0, 0,
2354 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2355 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2356 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2357 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2358 (initproc)BaseException_init, 0, MemoryError_new
2359};
2360PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2361
Thomas Wouters477c8d52006-05-27 19:21:47 +00002362
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002363/*
2364 * BufferError extends Exception
2365 */
2366SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2367
Thomas Wouters477c8d52006-05-27 19:21:47 +00002368
2369/* Warning category docstrings */
2370
2371/*
2372 * Warning extends Exception
2373 */
2374SimpleExtendsException(PyExc_Exception, Warning,
2375 "Base class for warning categories.");
2376
2377
2378/*
2379 * UserWarning extends Warning
2380 */
2381SimpleExtendsException(PyExc_Warning, UserWarning,
2382 "Base class for warnings generated by user code.");
2383
2384
2385/*
2386 * DeprecationWarning extends Warning
2387 */
2388SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2389 "Base class for warnings about deprecated features.");
2390
2391
2392/*
2393 * PendingDeprecationWarning extends Warning
2394 */
2395SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2396 "Base class for warnings about features which will be deprecated\n"
2397 "in the future.");
2398
2399
2400/*
2401 * SyntaxWarning extends Warning
2402 */
2403SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2404 "Base class for warnings about dubious syntax.");
2405
2406
2407/*
2408 * RuntimeWarning extends Warning
2409 */
2410SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2411 "Base class for warnings about dubious runtime behavior.");
2412
2413
2414/*
2415 * FutureWarning extends Warning
2416 */
2417SimpleExtendsException(PyExc_Warning, FutureWarning,
2418 "Base class for warnings about constructs that will change semantically\n"
2419 "in the future.");
2420
2421
2422/*
2423 * ImportWarning extends Warning
2424 */
2425SimpleExtendsException(PyExc_Warning, ImportWarning,
2426 "Base class for warnings about probable mistakes in module imports");
2427
2428
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002429/*
2430 * UnicodeWarning extends Warning
2431 */
2432SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2433 "Base class for warnings about Unicode related problems, mostly\n"
2434 "related to conversion problems.");
2435
Georg Brandl08be72d2010-10-24 15:11:22 +00002436
Guido van Rossum98297ee2007-11-06 21:34:58 +00002437/*
2438 * BytesWarning extends Warning
2439 */
2440SimpleExtendsException(PyExc_Warning, BytesWarning,
2441 "Base class for warnings about bytes and buffer related problems, mostly\n"
2442 "related to conversion from str or comparing to str.");
2443
2444
Georg Brandl08be72d2010-10-24 15:11:22 +00002445/*
2446 * ResourceWarning extends Warning
2447 */
2448SimpleExtendsException(PyExc_Warning, ResourceWarning,
2449 "Base class for warnings about resource usage.");
2450
2451
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002452
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002453#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002454#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002455/* The following constants were added to errno.h in VS2010 but have
2456 preferred WSA equivalents. */
2457#undef EADDRINUSE
2458#undef EADDRNOTAVAIL
2459#undef EAFNOSUPPORT
2460#undef EALREADY
2461#undef ECONNABORTED
2462#undef ECONNREFUSED
2463#undef ECONNRESET
2464#undef EDESTADDRREQ
2465#undef EHOSTUNREACH
2466#undef EINPROGRESS
2467#undef EISCONN
2468#undef ELOOP
2469#undef EMSGSIZE
2470#undef ENETDOWN
2471#undef ENETRESET
2472#undef ENETUNREACH
2473#undef ENOBUFS
2474#undef ENOPROTOOPT
2475#undef ENOTCONN
2476#undef ENOTSOCK
2477#undef EOPNOTSUPP
2478#undef EPROTONOSUPPORT
2479#undef EPROTOTYPE
2480#undef ETIMEDOUT
2481#undef EWOULDBLOCK
2482
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002483#if defined(WSAEALREADY) && !defined(EALREADY)
2484#define EALREADY WSAEALREADY
2485#endif
2486#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2487#define ECONNABORTED WSAECONNABORTED
2488#endif
2489#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2490#define ECONNREFUSED WSAECONNREFUSED
2491#endif
2492#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2493#define ECONNRESET WSAECONNRESET
2494#endif
2495#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2496#define EINPROGRESS WSAEINPROGRESS
2497#endif
2498#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2499#define ESHUTDOWN WSAESHUTDOWN
2500#endif
2501#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2502#define ETIMEDOUT WSAETIMEDOUT
2503#endif
2504#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2505#define EWOULDBLOCK WSAEWOULDBLOCK
2506#endif
2507#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002508
Victor Stinner331a6a52019-05-27 16:39:22 +02002509PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002510_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002511{
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002512#define PRE_INIT(TYPE) \
2513 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2514 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002515 return _PyStatus_ERR("exceptions bootstrapping error."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002516 } \
2517 Py_INCREF(PyExc_ ## TYPE); \
2518 }
2519
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002520#define ADD_ERRNO(TYPE, CODE) \
2521 do { \
2522 PyObject *_code = PyLong_FromLong(CODE); \
2523 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2524 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
Victor Stinner331a6a52019-05-27 16:39:22 +02002525 return _PyStatus_ERR("errmap insertion problem."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002526 Py_DECREF(_code); \
2527 } while (0)
2528
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002529 PRE_INIT(BaseException);
2530 PRE_INIT(Exception);
2531 PRE_INIT(TypeError);
2532 PRE_INIT(StopAsyncIteration);
2533 PRE_INIT(StopIteration);
2534 PRE_INIT(GeneratorExit);
2535 PRE_INIT(SystemExit);
2536 PRE_INIT(KeyboardInterrupt);
2537 PRE_INIT(ImportError);
2538 PRE_INIT(ModuleNotFoundError);
2539 PRE_INIT(OSError);
2540 PRE_INIT(EOFError);
2541 PRE_INIT(RuntimeError);
2542 PRE_INIT(RecursionError);
2543 PRE_INIT(NotImplementedError);
2544 PRE_INIT(NameError);
2545 PRE_INIT(UnboundLocalError);
2546 PRE_INIT(AttributeError);
2547 PRE_INIT(SyntaxError);
2548 PRE_INIT(IndentationError);
2549 PRE_INIT(TabError);
2550 PRE_INIT(LookupError);
2551 PRE_INIT(IndexError);
2552 PRE_INIT(KeyError);
2553 PRE_INIT(ValueError);
2554 PRE_INIT(UnicodeError);
2555 PRE_INIT(UnicodeEncodeError);
2556 PRE_INIT(UnicodeDecodeError);
2557 PRE_INIT(UnicodeTranslateError);
2558 PRE_INIT(AssertionError);
2559 PRE_INIT(ArithmeticError);
2560 PRE_INIT(FloatingPointError);
2561 PRE_INIT(OverflowError);
2562 PRE_INIT(ZeroDivisionError);
2563 PRE_INIT(SystemError);
2564 PRE_INIT(ReferenceError);
2565 PRE_INIT(MemoryError);
2566 PRE_INIT(BufferError);
2567 PRE_INIT(Warning);
2568 PRE_INIT(UserWarning);
2569 PRE_INIT(DeprecationWarning);
2570 PRE_INIT(PendingDeprecationWarning);
2571 PRE_INIT(SyntaxWarning);
2572 PRE_INIT(RuntimeWarning);
2573 PRE_INIT(FutureWarning);
2574 PRE_INIT(ImportWarning);
2575 PRE_INIT(UnicodeWarning);
2576 PRE_INIT(BytesWarning);
2577 PRE_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002579 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002580 PRE_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002581
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002582 PRE_INIT(BlockingIOError);
2583 PRE_INIT(BrokenPipeError);
2584 PRE_INIT(ChildProcessError);
2585 PRE_INIT(ConnectionAbortedError);
2586 PRE_INIT(ConnectionRefusedError);
2587 PRE_INIT(ConnectionResetError);
2588 PRE_INIT(FileExistsError);
2589 PRE_INIT(FileNotFoundError);
2590 PRE_INIT(IsADirectoryError);
2591 PRE_INIT(NotADirectoryError);
2592 PRE_INIT(InterruptedError);
2593 PRE_INIT(PermissionError);
2594 PRE_INIT(ProcessLookupError);
2595 PRE_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002596
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002597 if (preallocate_memerrors() < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002598 return _PyStatus_ERR("Could not preallocate MemoryError object");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002599 }
2600
2601 /* Add exceptions to errnomap */
2602 if (!errnomap) {
2603 errnomap = PyDict_New();
2604 if (!errnomap) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002605 return _PyStatus_ERR("Cannot allocate map from errnos to OSError subclasses");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002606 }
2607 }
2608
2609 ADD_ERRNO(BlockingIOError, EAGAIN);
2610 ADD_ERRNO(BlockingIOError, EALREADY);
2611 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2612 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2613 ADD_ERRNO(BrokenPipeError, EPIPE);
2614#ifdef ESHUTDOWN
2615 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2616#endif
2617 ADD_ERRNO(ChildProcessError, ECHILD);
2618 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2619 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2620 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2621 ADD_ERRNO(FileExistsError, EEXIST);
2622 ADD_ERRNO(FileNotFoundError, ENOENT);
2623 ADD_ERRNO(IsADirectoryError, EISDIR);
2624 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2625 ADD_ERRNO(InterruptedError, EINTR);
2626 ADD_ERRNO(PermissionError, EACCES);
2627 ADD_ERRNO(PermissionError, EPERM);
2628 ADD_ERRNO(ProcessLookupError, ESRCH);
2629 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2630
Victor Stinner331a6a52019-05-27 16:39:22 +02002631 return _PyStatus_OK();
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002632
2633#undef PRE_INIT
2634#undef ADD_ERRNO
2635}
2636
2637
2638/* Add exception types to the builtins module */
Victor Stinner331a6a52019-05-27 16:39:22 +02002639PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002640_PyBuiltins_AddExceptions(PyObject *bltinmod)
2641{
2642#define POST_INIT(TYPE) \
2643 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002644 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002645 }
2646
2647#define INIT_ALIAS(NAME, TYPE) \
2648 do { \
2649 Py_INCREF(PyExc_ ## TYPE); \
2650 Py_XDECREF(PyExc_ ## NAME); \
2651 PyExc_ ## NAME = PyExc_ ## TYPE; \
2652 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002653 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002654 } \
2655 } while (0)
2656
2657 PyObject *bdict;
2658
Thomas Wouters477c8d52006-05-27 19:21:47 +00002659 bdict = PyModule_GetDict(bltinmod);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002660 if (bdict == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002661 return _PyStatus_ERR("exceptions bootstrapping error.");
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002662 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002664 POST_INIT(BaseException);
2665 POST_INIT(Exception);
2666 POST_INIT(TypeError);
2667 POST_INIT(StopAsyncIteration);
2668 POST_INIT(StopIteration);
2669 POST_INIT(GeneratorExit);
2670 POST_INIT(SystemExit);
2671 POST_INIT(KeyboardInterrupt);
2672 POST_INIT(ImportError);
2673 POST_INIT(ModuleNotFoundError);
2674 POST_INIT(OSError);
2675 INIT_ALIAS(EnvironmentError, OSError);
2676 INIT_ALIAS(IOError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002677#ifdef MS_WINDOWS
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002678 INIT_ALIAS(WindowsError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002679#endif
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002680 POST_INIT(EOFError);
2681 POST_INIT(RuntimeError);
2682 POST_INIT(RecursionError);
2683 POST_INIT(NotImplementedError);
2684 POST_INIT(NameError);
2685 POST_INIT(UnboundLocalError);
2686 POST_INIT(AttributeError);
2687 POST_INIT(SyntaxError);
2688 POST_INIT(IndentationError);
2689 POST_INIT(TabError);
2690 POST_INIT(LookupError);
2691 POST_INIT(IndexError);
2692 POST_INIT(KeyError);
2693 POST_INIT(ValueError);
2694 POST_INIT(UnicodeError);
2695 POST_INIT(UnicodeEncodeError);
2696 POST_INIT(UnicodeDecodeError);
2697 POST_INIT(UnicodeTranslateError);
2698 POST_INIT(AssertionError);
2699 POST_INIT(ArithmeticError);
2700 POST_INIT(FloatingPointError);
2701 POST_INIT(OverflowError);
2702 POST_INIT(ZeroDivisionError);
2703 POST_INIT(SystemError);
2704 POST_INIT(ReferenceError);
2705 POST_INIT(MemoryError);
2706 POST_INIT(BufferError);
2707 POST_INIT(Warning);
2708 POST_INIT(UserWarning);
2709 POST_INIT(DeprecationWarning);
2710 POST_INIT(PendingDeprecationWarning);
2711 POST_INIT(SyntaxWarning);
2712 POST_INIT(RuntimeWarning);
2713 POST_INIT(FutureWarning);
2714 POST_INIT(ImportWarning);
2715 POST_INIT(UnicodeWarning);
2716 POST_INIT(BytesWarning);
2717 POST_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002718
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002719 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002720 POST_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002721
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002722 POST_INIT(BlockingIOError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002723 POST_INIT(BrokenPipeError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002724 POST_INIT(ChildProcessError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002725 POST_INIT(ConnectionAbortedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002726 POST_INIT(ConnectionRefusedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002727 POST_INIT(ConnectionResetError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002728 POST_INIT(FileExistsError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002729 POST_INIT(FileNotFoundError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002730 POST_INIT(IsADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002731 POST_INIT(NotADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002732 POST_INIT(InterruptedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002733 POST_INIT(PermissionError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002734 POST_INIT(ProcessLookupError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002735 POST_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002736
Victor Stinner331a6a52019-05-27 16:39:22 +02002737 return _PyStatus_OK();
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002738
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002739#undef POST_INIT
2740#undef INIT_ALIAS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002741}
2742
2743void
2744_PyExc_Fini(void)
2745{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002746 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002747 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002748}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002749
2750/* Helper to do the equivalent of "raise X from Y" in C, but always using
2751 * the current exception rather than passing one in.
2752 *
2753 * We currently limit this to *only* exceptions that use the BaseException
2754 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2755 * those correctly without losing data and without losing backwards
2756 * compatibility.
2757 *
2758 * We also aim to rule out *all* exceptions that might be storing additional
2759 * state, whether by having a size difference relative to BaseException,
2760 * additional arguments passed in during construction or by having a
2761 * non-empty instance dict.
2762 *
2763 * We need to be very careful with what we wrap, since changing types to
2764 * a broader exception type would be backwards incompatible for
2765 * existing codecs, and with different init or new method implementations
2766 * may either not support instantiation with PyErr_Format or lose
2767 * information when instantiated that way.
2768 *
2769 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2770 * fact that exceptions are expected to support pickling. If more builtin
2771 * exceptions (e.g. AttributeError) start to be converted to rich
2772 * exceptions with additional attributes, that's probably a better approach
2773 * to pursue over adding special cases for particular stateful subclasses.
2774 *
2775 * Returns a borrowed reference to the new exception (if any), NULL if the
2776 * existing exception was left in place.
2777 */
2778PyObject *
2779_PyErr_TrySetFromCause(const char *format, ...)
2780{
2781 PyObject* msg_prefix;
2782 PyObject *exc, *val, *tb;
2783 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002784 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002785 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002786 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002787 PyObject *new_exc, *new_val, *new_tb;
2788 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002789 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002790
Nick Coghlan8b097b42013-11-13 23:49:21 +10002791 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002792 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002793 /* Ensure type info indicates no extra state is stored at the C level
2794 * and that the type can be reinstantiated using PyErr_Format
2795 */
2796 caught_type_size = caught_type->tp_basicsize;
2797 base_exc_size = _PyExc_BaseException.tp_basicsize;
2798 same_basic_size = (
2799 caught_type_size == base_exc_size ||
2800 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002801 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002802 )
2803 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002804 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002805 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002806 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002807 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002808 /* We can't be sure we can wrap this safely, since it may contain
2809 * more state than just the exception type. Accordingly, we just
2810 * leave it alone.
2811 */
2812 PyErr_Restore(exc, val, tb);
2813 return NULL;
2814 }
2815
2816 /* Check the args are empty or contain a single string */
2817 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002818 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002819 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002820 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002821 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002822 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002823 /* More than 1 arg, or the one arg we do have isn't a string
2824 */
2825 PyErr_Restore(exc, val, tb);
2826 return NULL;
2827 }
2828
2829 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002830 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002831 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002832 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002833 /* While we could potentially copy a non-empty instance dictionary
2834 * to the replacement exception, for now we take the more
2835 * conservative path of leaving exceptions with attributes set
2836 * alone.
2837 */
2838 PyErr_Restore(exc, val, tb);
2839 return NULL;
2840 }
2841
2842 /* For exceptions that we can wrap safely, we chain the original
2843 * exception to a new one of the exact same type with an
2844 * error message that mentions the additional details and the
2845 * original exception.
2846 *
2847 * It would be nice to wrap OSError and various other exception
2848 * types as well, but that's quite a bit trickier due to the extra
2849 * state potentially stored on OSError instances.
2850 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002851 /* Ensure the traceback is set correctly on the existing exception */
2852 if (tb != NULL) {
2853 PyException_SetTraceback(val, tb);
2854 Py_DECREF(tb);
2855 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002856
Christian Heimes507eabd2013-11-14 01:39:35 +01002857#ifdef HAVE_STDARG_PROTOTYPES
2858 va_start(vargs, format);
2859#else
2860 va_start(vargs);
2861#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002862 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002863 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002864 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002865 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002866 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002867 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002868 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002869
2870 PyErr_Format(exc, "%U (%s: %S)",
2871 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002872 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002873 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002874 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2875 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2876 PyException_SetCause(new_val, val);
2877 PyErr_Restore(new_exc, new_val, new_tb);
2878 return new_val;
2879}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002880
2881
2882/* To help with migration from Python 2, SyntaxError.__init__ applies some
2883 * heuristics to try to report a more meaningful exception when print and
2884 * exec are used like statements.
2885 *
2886 * The heuristics are currently expected to detect the following cases:
2887 * - top level statement
2888 * - statement in a nested suite
2889 * - trailing section of a one line complex statement
2890 *
2891 * They're currently known not to trigger:
2892 * - after a semi-colon
2893 *
2894 * The error message can be a bit odd in cases where the "arguments" are
2895 * completely illegal syntactically, but that isn't worth the hassle of
2896 * fixing.
2897 *
2898 * We also can't do anything about cases that are legal Python 3 syntax
2899 * but mean something entirely different from what they did in Python 2
2900 * (omitting the arguments entirely, printing items preceded by a unary plus
2901 * or minus, using the stream redirection syntax).
2902 */
2903
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302904
2905// Static helper for setting legacy print error message
2906static int
2907_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2908{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302909 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302910 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302911 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302912 Py_ssize_t start_pos = start + PRINT_OFFSET;
2913 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2914 Py_UCS4 semicolon = ';';
2915 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2916 start_pos, text_len, 1);
2917 if (end_pos < -1) {
2918 return -1;
2919 } else if (end_pos == -1) {
2920 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302921 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302922
2923 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302924 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302925 return -1;
2926 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302927
2928 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2929 if (strip_sep_obj == NULL) {
2930 Py_DECREF(data);
2931 return -1;
2932 }
2933
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302934 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302935 Py_DECREF(data);
2936 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302937 if (new_data == NULL) {
2938 return -1;
2939 }
2940 // gets the modified text_len after stripping `print `
2941 text_len = PyUnicode_GET_LENGTH(new_data);
2942 const char *maybe_end_arg = "";
2943 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2944 maybe_end_arg = " end=\" \"";
2945 }
2946 PyObject *error_msg = PyUnicode_FromFormat(
2947 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2948 new_data, maybe_end_arg
2949 );
2950 Py_DECREF(new_data);
2951 if (error_msg == NULL)
2952 return -1;
2953
2954 Py_XSETREF(self->msg, error_msg);
2955 return 1;
2956}
2957
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002958static int
2959_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2960{
2961 /* Return values:
2962 * -1: an error occurred
2963 * 0: nothing happened
2964 * 1: the check triggered & the error message was changed
2965 */
2966 static PyObject *print_prefix = NULL;
2967 static PyObject *exec_prefix = NULL;
Zackery Spytza4b48f12018-10-12 02:20:59 -06002968 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002969 int kind = PyUnicode_KIND(self->text);
Serhiy Storchakacd8295f2020-04-11 10:48:40 +03002970 const void *data = PyUnicode_DATA(self->text);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002971
2972 /* Ignore leading whitespace */
2973 while (start < text_len) {
2974 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2975 if (!Py_UNICODE_ISSPACE(ch))
2976 break;
2977 start++;
2978 }
2979 /* Checking against an empty or whitespace-only part of the string */
2980 if (start == text_len) {
2981 return 0;
2982 }
2983
2984 /* Check for legacy print statements */
2985 if (print_prefix == NULL) {
2986 print_prefix = PyUnicode_InternFromString("print ");
2987 if (print_prefix == NULL) {
2988 return -1;
2989 }
2990 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002991 match = PyUnicode_Tailmatch(self->text, print_prefix,
2992 start, text_len, -1);
2993 if (match == -1) {
2994 return -1;
2995 }
2996 if (match) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302997 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002998 }
2999
3000 /* Check for legacy exec statements */
3001 if (exec_prefix == NULL) {
3002 exec_prefix = PyUnicode_InternFromString("exec ");
3003 if (exec_prefix == NULL) {
3004 return -1;
3005 }
3006 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06003007 match = PyUnicode_Tailmatch(self->text, exec_prefix, start, text_len, -1);
3008 if (match == -1) {
3009 return -1;
3010 }
3011 if (match) {
3012 PyObject *msg = PyUnicode_FromString("Missing parentheses in call "
3013 "to 'exec'");
3014 if (msg == NULL) {
3015 return -1;
3016 }
3017 Py_XSETREF(self->msg, msg);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10003018 return 1;
3019 }
3020 /* Fall back to the default error message */
3021 return 0;
3022}
3023
3024static int
3025_report_missing_parentheses(PySyntaxErrorObject *self)
3026{
3027 Py_UCS4 left_paren = 40;
3028 Py_ssize_t left_paren_index;
3029 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
3030 int legacy_check_result = 0;
3031
3032 /* Skip entirely if there is an opening parenthesis */
3033 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
3034 0, text_len, 1);
3035 if (left_paren_index < -1) {
3036 return -1;
3037 }
3038 if (left_paren_index != -1) {
3039 /* Use default error message for any line with an opening paren */
3040 return 0;
3041 }
3042 /* Handle the simple statement case */
3043 legacy_check_result = _check_for_legacy_statements(self, 0);
3044 if (legacy_check_result < 0) {
3045 return -1;
3046
3047 }
3048 if (legacy_check_result == 0) {
3049 /* Handle the one-line complex statement case */
3050 Py_UCS4 colon = 58;
3051 Py_ssize_t colon_index;
3052 colon_index = PyUnicode_FindChar(self->text, colon,
3053 0, text_len, 1);
3054 if (colon_index < -1) {
3055 return -1;
3056 }
3057 if (colon_index >= 0 && colon_index < text_len) {
3058 /* Check again, starting from just after the colon */
3059 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3060 return -1;
3061 }
3062 }
3063 }
3064 return 0;
3065}