blob: 2cce40f884442ab801b3d9c68d855a14ce7fea77 [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>
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#include "internal/mem.h"
10#include "internal/pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000011#include "structmember.h"
12#include "osdefs.h"
13
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 *
129BaseException_reduce(PyBaseExceptionObject *self)
130{
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 *
184BaseException_get_args(PyBaseExceptionObject *self)
185{
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
194BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
195{
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 *
209BaseException_get_tb(PyBaseExceptionObject *self)
210{
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
219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
220{
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 *
237BaseException_get_context(PyObject *self) {
238 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500239 if (res)
240 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000241 Py_RETURN_NONE;
242}
243
244static int
245BaseException_set_context(PyObject *self, PyObject *arg) {
246 if (arg == NULL) {
247 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
248 return -1;
249 } else if (arg == Py_None) {
250 arg = NULL;
251 } else if (!PyExceptionInstance_Check(arg)) {
252 PyErr_SetString(PyExc_TypeError, "exception context must be None "
253 "or derive from BaseException");
254 return -1;
255 } else {
256 /* PyException_SetContext steals this reference */
257 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000259 PyException_SetContext(self, arg);
260 return 0;
261}
262
263static PyObject *
264BaseException_get_cause(PyObject *self) {
265 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500266 if (res)
267 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700268 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000269}
270
271static int
272BaseException_set_cause(PyObject *self, PyObject *arg) {
273 if (arg == NULL) {
274 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
275 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700276 } else if (arg == Py_None) {
277 arg = NULL;
278 } else if (!PyExceptionInstance_Check(arg)) {
279 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
280 "or derive from BaseException");
281 return -1;
282 } else {
283 /* PyException_SetCause steals this reference */
284 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700286 PyException_SetCause(self, arg);
287 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000288}
289
Guido van Rossum360e4b82007-05-14 22:51:27 +0000290
Thomas Wouters477c8d52006-05-27 19:21:47 +0000291static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500292 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000294 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000295 {"__context__", (getter)BaseException_get_context,
296 (setter)BaseException_set_context, PyDoc_STR("exception context")},
297 {"__cause__", (getter)BaseException_get_cause,
298 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299 {NULL},
300};
301
302
Collin Winter828f04a2007-08-31 00:04:24 +0000303PyObject *
304PyException_GetTraceback(PyObject *self) {
305 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
306 Py_XINCREF(base_self->traceback);
307 return base_self->traceback;
308}
309
310
311int
312PyException_SetTraceback(PyObject *self, PyObject *tb) {
313 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
314}
315
316PyObject *
317PyException_GetCause(PyObject *self) {
318 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
319 Py_XINCREF(cause);
320 return cause;
321}
322
323/* Steals a reference to cause */
324void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200325PyException_SetCause(PyObject *self, PyObject *cause)
326{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700327 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300328 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000329}
330
331PyObject *
332PyException_GetContext(PyObject *self) {
333 PyObject *context = ((PyBaseExceptionObject *)self)->context;
334 Py_XINCREF(context);
335 return context;
336}
337
338/* Steals a reference to context */
339void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200340PyException_SetContext(PyObject *self, PyObject *context)
341{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300342 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000343}
344
345
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700346static struct PyMemberDef BaseException_members[] = {
347 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200348 offsetof(PyBaseExceptionObject, suppress_context)},
349 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700350};
351
352
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000354 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000355 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000356 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
357 0, /*tp_itemsize*/
358 (destructor)BaseException_dealloc, /*tp_dealloc*/
359 0, /*tp_print*/
360 0, /*tp_getattr*/
361 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000362 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000363 (reprfunc)BaseException_repr, /*tp_repr*/
364 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000365 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000366 0, /*tp_as_mapping*/
367 0, /*tp_hash */
368 0, /*tp_call*/
369 (reprfunc)BaseException_str, /*tp_str*/
370 PyObject_GenericGetAttr, /*tp_getattro*/
371 PyObject_GenericSetAttr, /*tp_setattro*/
372 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000373 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000375 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
376 (traverseproc)BaseException_traverse, /* tp_traverse */
377 (inquiry)BaseException_clear, /* tp_clear */
378 0, /* tp_richcompare */
379 0, /* tp_weaklistoffset */
380 0, /* tp_iter */
381 0, /* tp_iternext */
382 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700383 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000384 BaseException_getset, /* tp_getset */
385 0, /* tp_base */
386 0, /* tp_dict */
387 0, /* tp_descr_get */
388 0, /* tp_descr_set */
389 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
390 (initproc)BaseException_init, /* tp_init */
391 0, /* tp_alloc */
392 BaseException_new, /* tp_new */
393};
394/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
395from the previous implmentation and also allowing Python objects to be used
396in the API */
397PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
398
399/* note these macros omit the last semicolon so the macro invocation may
400 * include it and not look strange.
401 */
402#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
403static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000404 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000405 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406 sizeof(PyBaseExceptionObject), \
407 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
408 0, 0, 0, 0, 0, 0, 0, \
409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
410 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
411 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
412 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
413 (initproc)BaseException_init, 0, BaseException_new,\
414}; \
415PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
416
417#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
418static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000419 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000420 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000421 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000422 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 0, 0, 0, 0, 0, \
424 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000425 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
426 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000427 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200428 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429}; \
430PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
431
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200432#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
433 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
434 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000436 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000437 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000438 sizeof(Py ## EXCSTORE ## Object), 0, \
439 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
440 (reprfunc)EXCSTR, 0, 0, 0, \
441 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
442 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
443 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200444 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000445 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200446 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447}; \
448PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
449
450
451/*
452 * Exception extends BaseException
453 */
454SimpleExtendsException(PyExc_BaseException, Exception,
455 "Common base class for all non-exit exceptions.");
456
457
458/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000459 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 "Inappropriate argument type.");
463
464
465/*
Yury Selivanov75445082015-05-11 22:57:16 -0400466 * StopAsyncIteration extends Exception
467 */
468SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
469 "Signal the end from iterator.__anext__().");
470
471
472/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000473 * StopIteration extends Exception
474 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000475
476static PyMemberDef StopIteration_members[] = {
477 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
478 PyDoc_STR("generator return value")},
479 {NULL} /* Sentinel */
480};
481
482static int
483StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
484{
485 Py_ssize_t size = PyTuple_GET_SIZE(args);
486 PyObject *value;
487
488 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
489 return -1;
490 Py_CLEAR(self->value);
491 if (size > 0)
492 value = PyTuple_GET_ITEM(args, 0);
493 else
494 value = Py_None;
495 Py_INCREF(value);
496 self->value = value;
497 return 0;
498}
499
500static int
501StopIteration_clear(PyStopIterationObject *self)
502{
503 Py_CLEAR(self->value);
504 return BaseException_clear((PyBaseExceptionObject *)self);
505}
506
507static void
508StopIteration_dealloc(PyStopIterationObject *self)
509{
510 _PyObject_GC_UNTRACK(self);
511 StopIteration_clear(self);
512 Py_TYPE(self)->tp_free((PyObject *)self);
513}
514
515static int
516StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
517{
518 Py_VISIT(self->value);
519 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
520}
521
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000522ComplexExtendsException(
523 PyExc_Exception, /* base */
524 StopIteration, /* name */
525 StopIteration, /* prefix for *_init, etc */
526 0, /* new */
527 0, /* methods */
528 StopIteration_members, /* members */
529 0, /* getset */
530 0, /* str */
531 "Signal the end from iterator.__next__()."
532);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533
534
535/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000536 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000538SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 "Request that a generator exit.");
540
541
542/*
543 * SystemExit extends BaseException
544 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000545
546static int
547SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
548{
549 Py_ssize_t size = PyTuple_GET_SIZE(args);
550
551 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
552 return -1;
553
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000554 if (size == 0)
555 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200556 if (size == 1) {
557 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300558 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200559 }
560 else { /* size > 1 */
561 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300562 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200563 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000564 return 0;
565}
566
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568SystemExit_clear(PySystemExitObject *self)
569{
570 Py_CLEAR(self->code);
571 return BaseException_clear((PyBaseExceptionObject *)self);
572}
573
574static void
575SystemExit_dealloc(PySystemExitObject *self)
576{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000579 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580}
581
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000582static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000583SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
584{
585 Py_VISIT(self->code);
586 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
587}
588
589static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
591 PyDoc_STR("exception code")},
592 {NULL} /* Sentinel */
593};
594
595ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200596 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000597 "Request to exit from the interpreter.");
598
599/*
600 * KeyboardInterrupt extends BaseException
601 */
602SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
603 "Program interrupted by user.");
604
605
606/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609
Brett Cannon79ec55e2012-04-12 20:24:54 -0400610static int
611ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
612{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300613 static char *kwlist[] = {"name", "path", 0};
614 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400615 PyObject *msg = NULL;
616 PyObject *name = NULL;
617 PyObject *path = NULL;
618
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300619 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400620 return -1;
621
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300622 empty_tuple = PyTuple_New(0);
623 if (!empty_tuple)
624 return -1;
625 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
626 &name, &path)) {
627 Py_DECREF(empty_tuple);
628 return -1;
629 }
630 Py_DECREF(empty_tuple);
631
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300632 Py_XINCREF(name);
633 Py_XSETREF(self->name, name);
634
635 Py_XINCREF(path);
636 Py_XSETREF(self->path, path);
637
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300638 if (PyTuple_GET_SIZE(args) == 1) {
639 msg = PyTuple_GET_ITEM(args, 0);
640 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300641 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300642 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400643
644 return 0;
645}
646
647static int
648ImportError_clear(PyImportErrorObject *self)
649{
650 Py_CLEAR(self->msg);
651 Py_CLEAR(self->name);
652 Py_CLEAR(self->path);
653 return BaseException_clear((PyBaseExceptionObject *)self);
654}
655
656static void
657ImportError_dealloc(PyImportErrorObject *self)
658{
659 _PyObject_GC_UNTRACK(self);
660 ImportError_clear(self);
661 Py_TYPE(self)->tp_free((PyObject *)self);
662}
663
664static int
665ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
666{
667 Py_VISIT(self->msg);
668 Py_VISIT(self->name);
669 Py_VISIT(self->path);
670 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
671}
672
673static PyObject *
674ImportError_str(PyImportErrorObject *self)
675{
Brett Cannon07c6e712012-08-24 13:05:09 -0400676 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400677 Py_INCREF(self->msg);
678 return self->msg;
679 }
680 else {
681 return BaseException_str((PyBaseExceptionObject *)self);
682 }
683}
684
Serhiy Storchakab7853962017-04-08 09:55:07 +0300685static PyObject *
686ImportError_getstate(PyImportErrorObject *self)
687{
688 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
689 if (self->name || self->path) {
690 _Py_IDENTIFIER(name);
691 _Py_IDENTIFIER(path);
692 dict = dict ? PyDict_Copy(dict) : PyDict_New();
693 if (dict == NULL)
694 return NULL;
695 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
696 Py_DECREF(dict);
697 return NULL;
698 }
699 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
700 Py_DECREF(dict);
701 return NULL;
702 }
703 return dict;
704 }
705 else if (dict) {
706 Py_INCREF(dict);
707 return dict;
708 }
709 else {
710 Py_RETURN_NONE;
711 }
712}
713
714/* Pickling support */
715static PyObject *
716ImportError_reduce(PyImportErrorObject *self)
717{
718 PyObject *res;
719 PyObject *args;
720 PyObject *state = ImportError_getstate(self);
721 if (state == NULL)
722 return NULL;
723 args = ((PyBaseExceptionObject *)self)->args;
724 if (state == Py_None)
725 res = PyTuple_Pack(2, Py_TYPE(self), args);
726 else
727 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
728 Py_DECREF(state);
729 return res;
730}
731
Brett Cannon79ec55e2012-04-12 20:24:54 -0400732static PyMemberDef ImportError_members[] = {
733 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
734 PyDoc_STR("exception message")},
735 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
736 PyDoc_STR("module name")},
737 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
738 PyDoc_STR("module path")},
739 {NULL} /* Sentinel */
740};
741
742static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300743 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400744 {NULL}
745};
746
747ComplexExtendsException(PyExc_Exception, ImportError,
748 ImportError, 0 /* new */,
749 ImportError_methods, ImportError_members,
750 0 /* getset */, ImportError_str,
751 "Import can't find module, or can't find name in "
752 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000753
754/*
Eric Snowc9432652016-09-07 15:42:32 -0700755 * ModuleNotFoundError extends ImportError
756 */
757
758MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
759 "Module not found.");
760
761/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200762 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000763 */
764
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200765#ifdef MS_WINDOWS
766#include "errmap.h"
767#endif
768
Thomas Wouters477c8d52006-05-27 19:21:47 +0000769/* Where a function has a single filename, such as open() or some
770 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
771 * called, giving a third argument which is the filename. But, so
772 * that old code using in-place unpacking doesn't break, e.g.:
773 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200774 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000775 *
776 * we hack args so that it only contains two items. This also
777 * means we need our own __str__() which prints out the filename
778 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800779 *
780 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800781 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
782 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000783 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200784
Antoine Pitroue0e27352011-12-15 14:31:28 +0100785/* This function doesn't cleanup on error, the caller should */
786static int
787oserror_parse_args(PyObject **p_args,
788 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800789 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200790#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100791 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200792#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100793 )
794{
795 Py_ssize_t nargs;
796 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800797#ifndef MS_WINDOWS
798 /*
799 * ignored on non-Windows platforms,
800 * but parsed so OSError has a consistent signature
801 */
802 PyObject *_winerror = NULL;
803 PyObject **winerror = &_winerror;
804#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000805
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200806 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000807
Larry Hastingsb0827312014-02-09 22:05:19 -0800808 if (nargs >= 2 && nargs <= 5) {
809 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
810 myerrno, strerror,
811 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100812 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800813#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100814 if (*winerror && PyLong_Check(*winerror)) {
815 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 PyObject *newargs;
817 Py_ssize_t i;
818
Antoine Pitroue0e27352011-12-15 14:31:28 +0100819 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 /* Set errno to the corresponding POSIX errno (overriding
823 first argument). Windows Socket error codes (>= 10000)
824 have the same value as their POSIX counterparts.
825 */
826 if (winerrcode < 10000)
827 errcode = winerror_to_errno(winerrcode);
828 else
829 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100830 *myerrno = PyLong_FromLong(errcode);
831 if (!*myerrno)
832 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200833 newargs = PyTuple_New(nargs);
834 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100835 return -1;
836 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200837 for (i = 1; i < nargs; i++) {
838 PyObject *val = PyTuple_GET_ITEM(args, i);
839 Py_INCREF(val);
840 PyTuple_SET_ITEM(newargs, i, val);
841 }
842 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100843 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200844 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800845#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200846 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000847
Antoine Pitroue0e27352011-12-15 14:31:28 +0100848 return 0;
849}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000850
Antoine Pitroue0e27352011-12-15 14:31:28 +0100851static int
852oserror_init(PyOSErrorObject *self, PyObject **p_args,
853 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800854 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855#ifdef MS_WINDOWS
856 , PyObject *winerror
857#endif
858 )
859{
860 PyObject *args = *p_args;
861 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000862
863 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200864 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100865 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200866 PyNumber_Check(filename)) {
867 /* BlockingIOError's 3rd argument can be the number of
868 * characters written.
869 */
870 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
871 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100872 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200873 }
874 else {
875 Py_INCREF(filename);
876 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000877
Larry Hastingsb0827312014-02-09 22:05:19 -0800878 if (filename2 && filename2 != Py_None) {
879 Py_INCREF(filename2);
880 self->filename2 = filename2;
881 }
882
883 if (nargs >= 2 && nargs <= 5) {
884 /* filename, filename2, and winerror are removed from the args tuple
885 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100886 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200887 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100888 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000889
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200890 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100891 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 }
893 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000894 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200895 Py_XINCREF(myerrno);
896 self->myerrno = myerrno;
897
898 Py_XINCREF(strerror);
899 self->strerror = strerror;
900
901#ifdef MS_WINDOWS
902 Py_XINCREF(winerror);
903 self->winerror = winerror;
904#endif
905
Antoine Pitroue0e27352011-12-15 14:31:28 +0100906 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300907 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100908 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100909
910 return 0;
911}
912
913static PyObject *
914OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
915static int
916OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
917
918static int
919oserror_use_init(PyTypeObject *type)
920{
Martin Panter7462b6492015-11-02 03:37:02 +0000921 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100922 extraneous argument to __new__ to be ignored. The only reasonable
923 solution, given __new__ takes a variable number of arguments,
924 is to defer arg parsing and initialization to __init__.
925
Martin Pantere26da7c2016-06-02 10:07:09 +0000926 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100927 with the right arguments.
928
929 (see http://bugs.python.org/issue12555#msg148829 )
930 */
931 if (type->tp_init != (initproc) OSError_init &&
932 type->tp_new == (newfunc) OSError_new) {
933 assert((PyObject *) type != PyExc_OSError);
934 return 1;
935 }
936 return 0;
937}
938
939static PyObject *
940OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
941{
942 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800943 PyObject *myerrno = NULL, *strerror = NULL;
944 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100945#ifdef MS_WINDOWS
946 PyObject *winerror = NULL;
947#endif
948
Victor Stinner46ef3192013-11-14 22:31:41 +0100949 Py_INCREF(args);
950
Antoine Pitroue0e27352011-12-15 14:31:28 +0100951 if (!oserror_use_init(type)) {
952 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100953 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100954
Larry Hastingsb0827312014-02-09 22:05:19 -0800955 if (oserror_parse_args(&args, &myerrno, &strerror,
956 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100957#ifdef MS_WINDOWS
958 , &winerror
959#endif
960 ))
961 goto error;
962
963 if (myerrno && PyLong_Check(myerrno) &&
964 errnomap && (PyObject *) type == PyExc_OSError) {
965 PyObject *newtype;
966 newtype = PyDict_GetItem(errnomap, myerrno);
967 if (newtype) {
968 assert(PyType_Check(newtype));
969 type = (PyTypeObject *) newtype;
970 }
971 else if (PyErr_Occurred())
972 goto error;
973 }
974 }
975
976 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
977 if (!self)
978 goto error;
979
980 self->dict = NULL;
981 self->traceback = self->cause = self->context = NULL;
982 self->written = -1;
983
984 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800985 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100986#ifdef MS_WINDOWS
987 , winerror
988#endif
989 ))
990 goto error;
991 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200992 else {
993 self->args = PyTuple_New(0);
994 if (self->args == NULL)
995 goto error;
996 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100997
Victor Stinner46ef3192013-11-14 22:31:41 +0100998 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200999 return (PyObject *) self;
1000
1001error:
1002 Py_XDECREF(args);
1003 Py_XDECREF(self);
1004 return NULL;
1005}
1006
1007static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001008OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001009{
Larry Hastingsb0827312014-02-09 22:05:19 -08001010 PyObject *myerrno = NULL, *strerror = NULL;
1011 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001012#ifdef MS_WINDOWS
1013 PyObject *winerror = NULL;
1014#endif
1015
1016 if (!oserror_use_init(Py_TYPE(self)))
1017 /* Everything already done in OSError_new */
1018 return 0;
1019
1020 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1021 return -1;
1022
1023 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001024 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001025#ifdef MS_WINDOWS
1026 , &winerror
1027#endif
1028 ))
1029 goto error;
1030
Larry Hastingsb0827312014-02-09 22:05:19 -08001031 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001032#ifdef MS_WINDOWS
1033 , winerror
1034#endif
1035 ))
1036 goto error;
1037
Thomas Wouters477c8d52006-05-27 19:21:47 +00001038 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001039
1040error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001041 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001042 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043}
1044
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001045static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001046OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001047{
1048 Py_CLEAR(self->myerrno);
1049 Py_CLEAR(self->strerror);
1050 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001051 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001052#ifdef MS_WINDOWS
1053 Py_CLEAR(self->winerror);
1054#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 return BaseException_clear((PyBaseExceptionObject *)self);
1056}
1057
1058static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001059OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001061 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001062 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001063 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064}
1065
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001066static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001067OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068 void *arg)
1069{
1070 Py_VISIT(self->myerrno);
1071 Py_VISIT(self->strerror);
1072 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001073 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074#ifdef MS_WINDOWS
1075 Py_VISIT(self->winerror);
1076#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1078}
1079
1080static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001081OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001082{
Larry Hastingsb0827312014-02-09 22:05:19 -08001083#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001084#ifdef MS_WINDOWS
1085 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001086 if (self->winerror && self->filename) {
1087 if (self->filename2) {
1088 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1089 OR_NONE(self->winerror),
1090 OR_NONE(self->strerror),
1091 self->filename,
1092 self->filename2);
1093 } else {
1094 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1095 OR_NONE(self->winerror),
1096 OR_NONE(self->strerror),
1097 self->filename);
1098 }
1099 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001100 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001101 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001102 self->winerror ? self->winerror: Py_None,
1103 self->strerror ? self->strerror: Py_None);
1104#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001105 if (self->filename) {
1106 if (self->filename2) {
1107 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1108 OR_NONE(self->myerrno),
1109 OR_NONE(self->strerror),
1110 self->filename,
1111 self->filename2);
1112 } else {
1113 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1114 OR_NONE(self->myerrno),
1115 OR_NONE(self->strerror),
1116 self->filename);
1117 }
1118 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001119 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001120 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001121 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001122 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001123}
1124
Thomas Wouters477c8d52006-05-27 19:21:47 +00001125static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001126OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127{
1128 PyObject *args = self->args;
1129 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001130
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001132 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001133 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001134 Py_ssize_t size = self->filename2 ? 5 : 3;
1135 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001136 if (!args)
1137 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001138
1139 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001140 Py_INCREF(tmp);
1141 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001142
1143 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 Py_INCREF(tmp);
1145 PyTuple_SET_ITEM(args, 1, tmp);
1146
1147 Py_INCREF(self->filename);
1148 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001149
1150 if (self->filename2) {
1151 /*
1152 * This tuple is essentially used as OSError(*args).
1153 * So, to recreate filename2, we need to pass in
1154 * winerror as well.
1155 */
1156 Py_INCREF(Py_None);
1157 PyTuple_SET_ITEM(args, 3, Py_None);
1158
1159 /* filename2 */
1160 Py_INCREF(self->filename2);
1161 PyTuple_SET_ITEM(args, 4, self->filename2);
1162 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001163 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001164 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001165
1166 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001167 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001168 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001169 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001170 Py_DECREF(args);
1171 return res;
1172}
1173
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001174static PyObject *
1175OSError_written_get(PyOSErrorObject *self, void *context)
1176{
1177 if (self->written == -1) {
1178 PyErr_SetString(PyExc_AttributeError, "characters_written");
1179 return NULL;
1180 }
1181 return PyLong_FromSsize_t(self->written);
1182}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001184static int
1185OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1186{
1187 Py_ssize_t n;
1188 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1189 if (n == -1 && PyErr_Occurred())
1190 return -1;
1191 self->written = n;
1192 return 0;
1193}
1194
1195static PyMemberDef OSError_members[] = {
1196 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1197 PyDoc_STR("POSIX exception code")},
1198 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1199 PyDoc_STR("exception strerror")},
1200 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1201 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001202 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1203 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001204#ifdef MS_WINDOWS
1205 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1206 PyDoc_STR("Win32 exception code")},
1207#endif
1208 {NULL} /* Sentinel */
1209};
1210
1211static PyMethodDef OSError_methods[] = {
1212 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001213 {NULL}
1214};
1215
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001216static PyGetSetDef OSError_getset[] = {
1217 {"characters_written", (getter) OSError_written_get,
1218 (setter) OSError_written_set, NULL},
1219 {NULL}
1220};
1221
1222
1223ComplexExtendsException(PyExc_Exception, OSError,
1224 OSError, OSError_new,
1225 OSError_methods, OSError_members, OSError_getset,
1226 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001227 "Base class for I/O related errors.");
1228
1229
1230/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001231 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001232 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001233MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1234 "I/O operation would block.");
1235MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1236 "Connection error.");
1237MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1238 "Child process error.");
1239MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1240 "Broken pipe.");
1241MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1242 "Connection aborted.");
1243MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1244 "Connection refused.");
1245MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1246 "Connection reset.");
1247MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1248 "File already exists.");
1249MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1250 "File not found.");
1251MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1252 "Operation doesn't work on directories.");
1253MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1254 "Operation only works on directories.");
1255MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1256 "Interrupted by signal.");
1257MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1258 "Not enough permissions.");
1259MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1260 "Process not found.");
1261MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1262 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001263
1264/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001265 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001266 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001267SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001268 "Read beyond end of file.");
1269
1270
1271/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001272 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001273 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001274SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275 "Unspecified run-time error.");
1276
Yury Selivanovf488fb42015-07-03 01:04:23 -04001277/*
1278 * RecursionError extends RuntimeError
1279 */
1280SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1281 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001282
1283/*
1284 * NotImplementedError extends RuntimeError
1285 */
1286SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1287 "Method or function hasn't been implemented yet.");
1288
1289/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001290 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001291 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001292SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001293 "Name not found globally.");
1294
1295/*
1296 * UnboundLocalError extends NameError
1297 */
1298SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1299 "Local name referenced but not bound to a value.");
1300
1301/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001302 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001303 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001304SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001305 "Attribute not found.");
1306
1307
1308/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001309 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001310 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001312/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001313static int _report_missing_parentheses(PySyntaxErrorObject *self);
1314
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315static int
1316SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1317{
1318 PyObject *info = NULL;
1319 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1320
1321 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1322 return -1;
1323
1324 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001325 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001326 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001327 }
1328 if (lenargs == 2) {
1329 info = PyTuple_GET_ITEM(args, 1);
1330 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001331 if (!info)
1332 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001333
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001334 if (PyTuple_GET_SIZE(info) != 4) {
1335 /* not a very good error message, but it's what Python 2.4 gives */
1336 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1337 Py_DECREF(info);
1338 return -1;
1339 }
1340
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001341 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001342 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001343
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001344 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001345 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001346
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001347 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001348 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001350 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001351 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001352
1353 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001354
Martijn Pieters772d8092017-08-22 21:16:23 +01001355 /*
1356 * Issue #21669: Custom error for 'print' & 'exec' as statements
1357 *
1358 * Only applies to SyntaxError instances, not to subclasses such
1359 * as TabError or IndentationError (see issue #31161)
1360 */
1361 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1362 self->text && PyUnicode_Check(self->text) &&
1363 _report_missing_parentheses(self) < 0) {
1364 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001365 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366 }
1367 return 0;
1368}
1369
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001370static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001371SyntaxError_clear(PySyntaxErrorObject *self)
1372{
1373 Py_CLEAR(self->msg);
1374 Py_CLEAR(self->filename);
1375 Py_CLEAR(self->lineno);
1376 Py_CLEAR(self->offset);
1377 Py_CLEAR(self->text);
1378 Py_CLEAR(self->print_file_and_line);
1379 return BaseException_clear((PyBaseExceptionObject *)self);
1380}
1381
1382static void
1383SyntaxError_dealloc(PySyntaxErrorObject *self)
1384{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001387 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388}
1389
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001390static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1392{
1393 Py_VISIT(self->msg);
1394 Py_VISIT(self->filename);
1395 Py_VISIT(self->lineno);
1396 Py_VISIT(self->offset);
1397 Py_VISIT(self->text);
1398 Py_VISIT(self->print_file_and_line);
1399 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1400}
1401
1402/* This is called "my_basename" instead of just "basename" to avoid name
1403 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1404 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001405static PyObject*
1406my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407{
Victor Stinner6237daf2010-04-28 17:26:19 +00001408 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001409 int kind;
1410 void *data;
1411
1412 if (PyUnicode_READY(name))
1413 return NULL;
1414 kind = PyUnicode_KIND(name);
1415 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001416 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001417 offset = 0;
1418 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001419 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001420 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001422 if (offset != 0)
1423 return PyUnicode_Substring(name, offset, size);
1424 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001425 Py_INCREF(name);
1426 return name;
1427 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001428}
1429
1430
1431static PyObject *
1432SyntaxError_str(PySyntaxErrorObject *self)
1433{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001434 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001435 PyObject *filename;
1436 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001437 /* Below, we always ignore overflow errors, just printing -1.
1438 Still, we cannot allow an OverflowError to be raised, so
1439 we need to call PyLong_AsLongAndOverflow. */
1440 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001441
1442 /* XXX -- do all the additional formatting with filename and
1443 lineno here */
1444
Neal Norwitzed2b7392007-08-26 04:51:10 +00001445 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001446 filename = my_basename(self->filename);
1447 if (filename == NULL)
1448 return NULL;
1449 } else {
1450 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001451 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001452 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001453
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001454 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001455 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001456
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001457 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001458 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001459 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001460 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001462 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001463 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001464 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001465 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001466 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001467 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001468 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001469 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001470 Py_XDECREF(filename);
1471 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001472}
1473
1474static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001475 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1476 PyDoc_STR("exception msg")},
1477 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1478 PyDoc_STR("exception filename")},
1479 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1480 PyDoc_STR("exception lineno")},
1481 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1482 PyDoc_STR("exception offset")},
1483 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1484 PyDoc_STR("exception text")},
1485 {"print_file_and_line", T_OBJECT,
1486 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1487 PyDoc_STR("exception print_file_and_line")},
1488 {NULL} /* Sentinel */
1489};
1490
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001491ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001492 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001493 SyntaxError_str, "Invalid syntax.");
1494
1495
1496/*
1497 * IndentationError extends SyntaxError
1498 */
1499MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1500 "Improper indentation.");
1501
1502
1503/*
1504 * TabError extends IndentationError
1505 */
1506MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1507 "Improper mixture of spaces and tabs.");
1508
1509
1510/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001511 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001512 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001513SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001514 "Base class for lookup errors.");
1515
1516
1517/*
1518 * IndexError extends LookupError
1519 */
1520SimpleExtendsException(PyExc_LookupError, IndexError,
1521 "Sequence index out of range.");
1522
1523
1524/*
1525 * KeyError extends LookupError
1526 */
1527static PyObject *
1528KeyError_str(PyBaseExceptionObject *self)
1529{
1530 /* If args is a tuple of exactly one item, apply repr to args[0].
1531 This is done so that e.g. the exception raised by {}[''] prints
1532 KeyError: ''
1533 rather than the confusing
1534 KeyError
1535 alone. The downside is that if KeyError is raised with an explanatory
1536 string, that string will be displayed in quotes. Too bad.
1537 If args is anything else, use the default BaseException__str__().
1538 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001539 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001540 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001541 }
1542 return BaseException_str(self);
1543}
1544
1545ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001546 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001547
1548
1549/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001550 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001551 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001552SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001553 "Inappropriate argument value (of correct type).");
1554
1555/*
1556 * UnicodeError extends ValueError
1557 */
1558
1559SimpleExtendsException(PyExc_ValueError, UnicodeError,
1560 "Unicode related error.");
1561
Thomas Wouters477c8d52006-05-27 19:21:47 +00001562static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001563get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001564{
1565 if (!attr) {
1566 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1567 return NULL;
1568 }
1569
Christian Heimes72b710a2008-05-26 13:28:38 +00001570 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001571 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1572 return NULL;
1573 }
1574 Py_INCREF(attr);
1575 return attr;
1576}
1577
1578static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001579get_unicode(PyObject *attr, const char *name)
1580{
1581 if (!attr) {
1582 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1583 return NULL;
1584 }
1585
1586 if (!PyUnicode_Check(attr)) {
1587 PyErr_Format(PyExc_TypeError,
1588 "%.200s attribute must be unicode", name);
1589 return NULL;
1590 }
1591 Py_INCREF(attr);
1592 return attr;
1593}
1594
Walter Dörwaldd2034312007-05-18 16:29:38 +00001595static int
1596set_unicodefromstring(PyObject **attr, const char *value)
1597{
1598 PyObject *obj = PyUnicode_FromString(value);
1599 if (!obj)
1600 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001601 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001602 return 0;
1603}
1604
Thomas Wouters477c8d52006-05-27 19:21:47 +00001605PyObject *
1606PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1607{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001608 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001609}
1610
1611PyObject *
1612PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1613{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001614 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001615}
1616
1617PyObject *
1618PyUnicodeEncodeError_GetObject(PyObject *exc)
1619{
1620 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1621}
1622
1623PyObject *
1624PyUnicodeDecodeError_GetObject(PyObject *exc)
1625{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001626 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001627}
1628
1629PyObject *
1630PyUnicodeTranslateError_GetObject(PyObject *exc)
1631{
1632 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1633}
1634
1635int
1636PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1637{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001638 Py_ssize_t size;
1639 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1640 "object");
1641 if (!obj)
1642 return -1;
1643 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001644 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001645 if (*start<0)
1646 *start = 0; /*XXX check for values <0*/
1647 if (*start>=size)
1648 *start = size-1;
1649 Py_DECREF(obj);
1650 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001651}
1652
1653
1654int
1655PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1656{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001657 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001658 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001659 if (!obj)
1660 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001661 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001662 *start = ((PyUnicodeErrorObject *)exc)->start;
1663 if (*start<0)
1664 *start = 0;
1665 if (*start>=size)
1666 *start = size-1;
1667 Py_DECREF(obj);
1668 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001669}
1670
1671
1672int
1673PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1674{
1675 return PyUnicodeEncodeError_GetStart(exc, start);
1676}
1677
1678
1679int
1680PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1681{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001682 ((PyUnicodeErrorObject *)exc)->start = start;
1683 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001684}
1685
1686
1687int
1688PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1689{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001690 ((PyUnicodeErrorObject *)exc)->start = start;
1691 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001692}
1693
1694
1695int
1696PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1697{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001698 ((PyUnicodeErrorObject *)exc)->start = start;
1699 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001700}
1701
1702
1703int
1704PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1705{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001706 Py_ssize_t size;
1707 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1708 "object");
1709 if (!obj)
1710 return -1;
1711 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001712 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001713 if (*end<1)
1714 *end = 1;
1715 if (*end>size)
1716 *end = size;
1717 Py_DECREF(obj);
1718 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719}
1720
1721
1722int
1723PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1724{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001725 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001726 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001727 if (!obj)
1728 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001729 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001730 *end = ((PyUnicodeErrorObject *)exc)->end;
1731 if (*end<1)
1732 *end = 1;
1733 if (*end>size)
1734 *end = size;
1735 Py_DECREF(obj);
1736 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737}
1738
1739
1740int
1741PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1742{
1743 return PyUnicodeEncodeError_GetEnd(exc, start);
1744}
1745
1746
1747int
1748PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1749{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001750 ((PyUnicodeErrorObject *)exc)->end = end;
1751 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001752}
1753
1754
1755int
1756PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1757{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001758 ((PyUnicodeErrorObject *)exc)->end = end;
1759 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001760}
1761
1762
1763int
1764PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1765{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001766 ((PyUnicodeErrorObject *)exc)->end = end;
1767 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001768}
1769
1770PyObject *
1771PyUnicodeEncodeError_GetReason(PyObject *exc)
1772{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001773 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001774}
1775
1776
1777PyObject *
1778PyUnicodeDecodeError_GetReason(PyObject *exc)
1779{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001780 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001781}
1782
1783
1784PyObject *
1785PyUnicodeTranslateError_GetReason(PyObject *exc)
1786{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001787 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788}
1789
1790
1791int
1792PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1793{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001794 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1795 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796}
1797
1798
1799int
1800PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1801{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001802 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1803 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001804}
1805
1806
1807int
1808PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1809{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001810 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1811 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812}
1813
1814
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816UnicodeError_clear(PyUnicodeErrorObject *self)
1817{
1818 Py_CLEAR(self->encoding);
1819 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820 Py_CLEAR(self->reason);
1821 return BaseException_clear((PyBaseExceptionObject *)self);
1822}
1823
1824static void
1825UnicodeError_dealloc(PyUnicodeErrorObject *self)
1826{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001827 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001828 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001829 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001830}
1831
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001832static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1834{
1835 Py_VISIT(self->encoding);
1836 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837 Py_VISIT(self->reason);
1838 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1839}
1840
1841static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001842 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1843 PyDoc_STR("exception encoding")},
1844 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1845 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001846 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001848 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849 PyDoc_STR("exception end")},
1850 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1851 PyDoc_STR("exception reason")},
1852 {NULL} /* Sentinel */
1853};
1854
1855
1856/*
1857 * UnicodeEncodeError extends UnicodeError
1858 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001859
1860static int
1861UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1862{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001863 PyUnicodeErrorObject *err;
1864
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1866 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001867
1868 err = (PyUnicodeErrorObject *)self;
1869
1870 Py_CLEAR(err->encoding);
1871 Py_CLEAR(err->object);
1872 Py_CLEAR(err->reason);
1873
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001874 if (!PyArg_ParseTuple(args, "UUnnU",
1875 &err->encoding, &err->object,
1876 &err->start, &err->end, &err->reason)) {
1877 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001878 return -1;
1879 }
1880
Guido van Rossum98297ee2007-11-06 21:34:58 +00001881 Py_INCREF(err->encoding);
1882 Py_INCREF(err->object);
1883 Py_INCREF(err->reason);
1884
1885 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001886}
1887
1888static PyObject *
1889UnicodeEncodeError_str(PyObject *self)
1890{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001891 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001892 PyObject *result = NULL;
1893 PyObject *reason_str = NULL;
1894 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001896 if (!uself->object)
1897 /* Not properly initialized. */
1898 return PyUnicode_FromString("");
1899
Eric Smith0facd772010-02-24 15:42:29 +00001900 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001901 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001902 reason_str = PyObject_Str(uself->reason);
1903 if (reason_str == NULL)
1904 goto done;
1905 encoding_str = PyObject_Str(uself->encoding);
1906 if (encoding_str == NULL)
1907 goto done;
1908
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001909 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1910 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001911 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001912 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001913 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001914 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001915 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001916 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001917 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001918 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001919 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001920 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001921 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001922 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001923 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001924 }
Eric Smith0facd772010-02-24 15:42:29 +00001925 else {
1926 result = PyUnicode_FromFormat(
1927 "'%U' codec can't encode characters in position %zd-%zd: %U",
1928 encoding_str,
1929 uself->start,
1930 uself->end-1,
1931 reason_str);
1932 }
1933done:
1934 Py_XDECREF(reason_str);
1935 Py_XDECREF(encoding_str);
1936 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001937}
1938
1939static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001940 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001941 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001942 sizeof(PyUnicodeErrorObject), 0,
1943 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1944 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1945 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001946 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1947 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001948 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001949 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001950};
1951PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1952
1953PyObject *
1954PyUnicodeEncodeError_Create(
1955 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1956 Py_ssize_t start, Py_ssize_t end, const char *reason)
1957{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001958 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001959 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001960}
1961
1962
1963/*
1964 * UnicodeDecodeError extends UnicodeError
1965 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001966
1967static int
1968UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1969{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001970 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001971
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1973 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001974
1975 ude = (PyUnicodeErrorObject *)self;
1976
1977 Py_CLEAR(ude->encoding);
1978 Py_CLEAR(ude->object);
1979 Py_CLEAR(ude->reason);
1980
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001981 if (!PyArg_ParseTuple(args, "UOnnU",
1982 &ude->encoding, &ude->object,
1983 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001984 ude->encoding = ude->object = ude->reason = NULL;
1985 return -1;
1986 }
1987
Guido van Rossum98297ee2007-11-06 21:34:58 +00001988 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001989 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001990 Py_INCREF(ude->reason);
1991
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001992 if (!PyBytes_Check(ude->object)) {
1993 Py_buffer view;
1994 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1995 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001996 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001997 PyBuffer_Release(&view);
1998 if (!ude->object)
1999 goto error;
2000 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002001 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002002
2003error:
2004 Py_CLEAR(ude->encoding);
2005 Py_CLEAR(ude->object);
2006 Py_CLEAR(ude->reason);
2007 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002008}
2009
2010static PyObject *
2011UnicodeDecodeError_str(PyObject *self)
2012{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002013 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002014 PyObject *result = NULL;
2015 PyObject *reason_str = NULL;
2016 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002017
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002018 if (!uself->object)
2019 /* Not properly initialized. */
2020 return PyUnicode_FromString("");
2021
Eric Smith0facd772010-02-24 15:42:29 +00002022 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002023 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002024 reason_str = PyObject_Str(uself->reason);
2025 if (reason_str == NULL)
2026 goto done;
2027 encoding_str = PyObject_Str(uself->encoding);
2028 if (encoding_str == NULL)
2029 goto done;
2030
2031 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002032 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002033 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002034 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002035 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002036 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002037 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002038 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002039 }
Eric Smith0facd772010-02-24 15:42:29 +00002040 else {
2041 result = PyUnicode_FromFormat(
2042 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2043 encoding_str,
2044 uself->start,
2045 uself->end-1,
2046 reason_str
2047 );
2048 }
2049done:
2050 Py_XDECREF(reason_str);
2051 Py_XDECREF(encoding_str);
2052 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002053}
2054
2055static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002056 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002057 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002058 sizeof(PyUnicodeErrorObject), 0,
2059 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2060 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2061 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002062 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2063 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002064 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002065 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002066};
2067PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2068
2069PyObject *
2070PyUnicodeDecodeError_Create(
2071 const char *encoding, const char *object, Py_ssize_t length,
2072 Py_ssize_t start, Py_ssize_t end, const char *reason)
2073{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002074 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002075 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002076}
2077
2078
2079/*
2080 * UnicodeTranslateError extends UnicodeError
2081 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002082
2083static int
2084UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2085 PyObject *kwds)
2086{
2087 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2088 return -1;
2089
2090 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002091 Py_CLEAR(self->reason);
2092
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002093 if (!PyArg_ParseTuple(args, "UnnU",
2094 &self->object,
2095 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002096 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002097 return -1;
2098 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002099
Thomas Wouters477c8d52006-05-27 19:21:47 +00002100 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101 Py_INCREF(self->reason);
2102
2103 return 0;
2104}
2105
2106
2107static PyObject *
2108UnicodeTranslateError_str(PyObject *self)
2109{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002110 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002111 PyObject *result = NULL;
2112 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002113
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002114 if (!uself->object)
2115 /* Not properly initialized. */
2116 return PyUnicode_FromString("");
2117
Eric Smith0facd772010-02-24 15:42:29 +00002118 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002119 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002120 reason_str = PyObject_Str(uself->reason);
2121 if (reason_str == NULL)
2122 goto done;
2123
Victor Stinner53b33e72011-11-21 01:17:27 +01002124 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2125 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002126 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002127 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002128 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002129 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002130 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002131 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002132 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002133 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002134 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002135 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002136 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002137 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002138 );
Eric Smith0facd772010-02-24 15:42:29 +00002139 } else {
2140 result = PyUnicode_FromFormat(
2141 "can't translate characters in position %zd-%zd: %U",
2142 uself->start,
2143 uself->end-1,
2144 reason_str
2145 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002146 }
Eric Smith0facd772010-02-24 15:42:29 +00002147done:
2148 Py_XDECREF(reason_str);
2149 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002150}
2151
2152static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002153 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002154 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002155 sizeof(PyUnicodeErrorObject), 0,
2156 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2157 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2158 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002159 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002160 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2161 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002162 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002163};
2164PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2165
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002166/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002167PyObject *
2168PyUnicodeTranslateError_Create(
2169 const Py_UNICODE *object, Py_ssize_t length,
2170 Py_ssize_t start, Py_ssize_t end, const char *reason)
2171{
2172 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002173 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002174}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002175
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002176PyObject *
2177_PyUnicodeTranslateError_Create(
2178 PyObject *object,
2179 Py_ssize_t start, Py_ssize_t end, const char *reason)
2180{
Victor Stinner69598d42014-04-04 20:59:44 +02002181 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002182 object, start, end, reason);
2183}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002184
2185/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002186 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002187 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002188SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002189 "Assertion failed.");
2190
2191
2192/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002193 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002194 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002195SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196 "Base class for arithmetic errors.");
2197
2198
2199/*
2200 * FloatingPointError extends ArithmeticError
2201 */
2202SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2203 "Floating point operation failed.");
2204
2205
2206/*
2207 * OverflowError extends ArithmeticError
2208 */
2209SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2210 "Result too large to be represented.");
2211
2212
2213/*
2214 * ZeroDivisionError extends ArithmeticError
2215 */
2216SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2217 "Second argument to a division or modulo operation was zero.");
2218
2219
2220/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002221 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002222 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002223SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 "Internal error in the Python interpreter.\n"
2225 "\n"
2226 "Please report this to the Python maintainer, along with the traceback,\n"
2227 "the Python version, and the hardware/OS platform and version.");
2228
2229
2230/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002231 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002232 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002233SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002234 "Weak ref proxy used after referent went away.");
2235
2236
2237/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002238 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002239 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002240
2241#define MEMERRORS_SAVE 16
2242static PyBaseExceptionObject *memerrors_freelist = NULL;
2243static int memerrors_numfree = 0;
2244
2245static PyObject *
2246MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2247{
2248 PyBaseExceptionObject *self;
2249
2250 if (type != (PyTypeObject *) PyExc_MemoryError)
2251 return BaseException_new(type, args, kwds);
2252 if (memerrors_freelist == NULL)
2253 return BaseException_new(type, args, kwds);
2254 /* Fetch object from freelist and revive it */
2255 self = memerrors_freelist;
2256 self->args = PyTuple_New(0);
2257 /* This shouldn't happen since the empty tuple is persistent */
2258 if (self->args == NULL)
2259 return NULL;
2260 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2261 memerrors_numfree--;
2262 self->dict = NULL;
2263 _Py_NewReference((PyObject *)self);
2264 _PyObject_GC_TRACK(self);
2265 return (PyObject *)self;
2266}
2267
2268static void
2269MemoryError_dealloc(PyBaseExceptionObject *self)
2270{
2271 _PyObject_GC_UNTRACK(self);
2272 BaseException_clear(self);
2273 if (memerrors_numfree >= MEMERRORS_SAVE)
2274 Py_TYPE(self)->tp_free((PyObject *)self);
2275 else {
2276 self->dict = (PyObject *) memerrors_freelist;
2277 memerrors_freelist = self;
2278 memerrors_numfree++;
2279 }
2280}
2281
2282static void
2283preallocate_memerrors(void)
2284{
2285 /* We create enough MemoryErrors and then decref them, which will fill
2286 up the freelist. */
2287 int i;
2288 PyObject *errors[MEMERRORS_SAVE];
2289 for (i = 0; i < MEMERRORS_SAVE; i++) {
2290 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2291 NULL, NULL);
2292 if (!errors[i])
2293 Py_FatalError("Could not preallocate MemoryError object");
2294 }
2295 for (i = 0; i < MEMERRORS_SAVE; i++) {
2296 Py_DECREF(errors[i]);
2297 }
2298}
2299
2300static void
2301free_preallocated_memerrors(void)
2302{
2303 while (memerrors_freelist != NULL) {
2304 PyObject *self = (PyObject *) memerrors_freelist;
2305 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2306 Py_TYPE(self)->tp_free((PyObject *)self);
2307 }
2308}
2309
2310
2311static PyTypeObject _PyExc_MemoryError = {
2312 PyVarObject_HEAD_INIT(NULL, 0)
2313 "MemoryError",
2314 sizeof(PyBaseExceptionObject),
2315 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2316 0, 0, 0, 0, 0, 0, 0,
2317 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2318 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2319 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2320 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2321 (initproc)BaseException_init, 0, MemoryError_new
2322};
2323PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2324
Thomas Wouters477c8d52006-05-27 19:21:47 +00002325
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002326/*
2327 * BufferError extends Exception
2328 */
2329SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2330
Thomas Wouters477c8d52006-05-27 19:21:47 +00002331
2332/* Warning category docstrings */
2333
2334/*
2335 * Warning extends Exception
2336 */
2337SimpleExtendsException(PyExc_Exception, Warning,
2338 "Base class for warning categories.");
2339
2340
2341/*
2342 * UserWarning extends Warning
2343 */
2344SimpleExtendsException(PyExc_Warning, UserWarning,
2345 "Base class for warnings generated by user code.");
2346
2347
2348/*
2349 * DeprecationWarning extends Warning
2350 */
2351SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2352 "Base class for warnings about deprecated features.");
2353
2354
2355/*
2356 * PendingDeprecationWarning extends Warning
2357 */
2358SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2359 "Base class for warnings about features which will be deprecated\n"
2360 "in the future.");
2361
2362
2363/*
2364 * SyntaxWarning extends Warning
2365 */
2366SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2367 "Base class for warnings about dubious syntax.");
2368
2369
2370/*
2371 * RuntimeWarning extends Warning
2372 */
2373SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2374 "Base class for warnings about dubious runtime behavior.");
2375
2376
2377/*
2378 * FutureWarning extends Warning
2379 */
2380SimpleExtendsException(PyExc_Warning, FutureWarning,
2381 "Base class for warnings about constructs that will change semantically\n"
2382 "in the future.");
2383
2384
2385/*
2386 * ImportWarning extends Warning
2387 */
2388SimpleExtendsException(PyExc_Warning, ImportWarning,
2389 "Base class for warnings about probable mistakes in module imports");
2390
2391
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002392/*
2393 * UnicodeWarning extends Warning
2394 */
2395SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2396 "Base class for warnings about Unicode related problems, mostly\n"
2397 "related to conversion problems.");
2398
Georg Brandl08be72d2010-10-24 15:11:22 +00002399
Guido van Rossum98297ee2007-11-06 21:34:58 +00002400/*
2401 * BytesWarning extends Warning
2402 */
2403SimpleExtendsException(PyExc_Warning, BytesWarning,
2404 "Base class for warnings about bytes and buffer related problems, mostly\n"
2405 "related to conversion from str or comparing to str.");
2406
2407
Georg Brandl08be72d2010-10-24 15:11:22 +00002408/*
2409 * ResourceWarning extends Warning
2410 */
2411SimpleExtendsException(PyExc_Warning, ResourceWarning,
2412 "Base class for warnings about resource usage.");
2413
2414
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002415
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002416#define PRE_INIT(TYPE) \
2417 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2418 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2419 Py_FatalError("exceptions bootstrapping error."); \
2420 Py_INCREF(PyExc_ ## TYPE); \
2421 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002422
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002423#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002424 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2425 Py_FatalError("Module dictionary insertion problem.");
2426
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002427#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002428 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002429 PyExc_ ## NAME = PyExc_ ## TYPE; \
2430 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2431 Py_FatalError("Module dictionary insertion problem.");
2432
2433#define ADD_ERRNO(TYPE, CODE) { \
2434 PyObject *_code = PyLong_FromLong(CODE); \
2435 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2436 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2437 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002438 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002439 }
2440
2441#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002442#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002443/* The following constants were added to errno.h in VS2010 but have
2444 preferred WSA equivalents. */
2445#undef EADDRINUSE
2446#undef EADDRNOTAVAIL
2447#undef EAFNOSUPPORT
2448#undef EALREADY
2449#undef ECONNABORTED
2450#undef ECONNREFUSED
2451#undef ECONNRESET
2452#undef EDESTADDRREQ
2453#undef EHOSTUNREACH
2454#undef EINPROGRESS
2455#undef EISCONN
2456#undef ELOOP
2457#undef EMSGSIZE
2458#undef ENETDOWN
2459#undef ENETRESET
2460#undef ENETUNREACH
2461#undef ENOBUFS
2462#undef ENOPROTOOPT
2463#undef ENOTCONN
2464#undef ENOTSOCK
2465#undef EOPNOTSUPP
2466#undef EPROTONOSUPPORT
2467#undef EPROTOTYPE
2468#undef ETIMEDOUT
2469#undef EWOULDBLOCK
2470
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002471#if defined(WSAEALREADY) && !defined(EALREADY)
2472#define EALREADY WSAEALREADY
2473#endif
2474#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2475#define ECONNABORTED WSAECONNABORTED
2476#endif
2477#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2478#define ECONNREFUSED WSAECONNREFUSED
2479#endif
2480#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2481#define ECONNRESET WSAECONNRESET
2482#endif
2483#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2484#define EINPROGRESS WSAEINPROGRESS
2485#endif
2486#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2487#define ESHUTDOWN WSAESHUTDOWN
2488#endif
2489#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2490#define ETIMEDOUT WSAETIMEDOUT
2491#endif
2492#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2493#define EWOULDBLOCK WSAEWOULDBLOCK
2494#endif
2495#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002496
Martin v. Löwis1a214512008-06-11 05:26:20 +00002497void
Brett Cannonfd074152012-04-14 14:10:13 -04002498_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002499{
Brett Cannonfd074152012-04-14 14:10:13 -04002500 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002501
2502 PRE_INIT(BaseException)
2503 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002504 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002505 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506 PRE_INIT(StopIteration)
2507 PRE_INIT(GeneratorExit)
2508 PRE_INIT(SystemExit)
2509 PRE_INIT(KeyboardInterrupt)
2510 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002511 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002512 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513 PRE_INIT(EOFError)
2514 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002515 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002516 PRE_INIT(NotImplementedError)
2517 PRE_INIT(NameError)
2518 PRE_INIT(UnboundLocalError)
2519 PRE_INIT(AttributeError)
2520 PRE_INIT(SyntaxError)
2521 PRE_INIT(IndentationError)
2522 PRE_INIT(TabError)
2523 PRE_INIT(LookupError)
2524 PRE_INIT(IndexError)
2525 PRE_INIT(KeyError)
2526 PRE_INIT(ValueError)
2527 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002528 PRE_INIT(UnicodeEncodeError)
2529 PRE_INIT(UnicodeDecodeError)
2530 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531 PRE_INIT(AssertionError)
2532 PRE_INIT(ArithmeticError)
2533 PRE_INIT(FloatingPointError)
2534 PRE_INIT(OverflowError)
2535 PRE_INIT(ZeroDivisionError)
2536 PRE_INIT(SystemError)
2537 PRE_INIT(ReferenceError)
2538 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002539 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540 PRE_INIT(Warning)
2541 PRE_INIT(UserWarning)
2542 PRE_INIT(DeprecationWarning)
2543 PRE_INIT(PendingDeprecationWarning)
2544 PRE_INIT(SyntaxWarning)
2545 PRE_INIT(RuntimeWarning)
2546 PRE_INIT(FutureWarning)
2547 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002548 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002549 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002550 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002551
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002552 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002553 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002554
Louie Luc4318542017-03-29 13:28:15 +08002555 PRE_INIT(BlockingIOError)
2556 PRE_INIT(BrokenPipeError)
2557 PRE_INIT(ChildProcessError)
2558 PRE_INIT(ConnectionAbortedError)
2559 PRE_INIT(ConnectionRefusedError)
2560 PRE_INIT(ConnectionResetError)
2561 PRE_INIT(FileExistsError)
2562 PRE_INIT(FileNotFoundError)
2563 PRE_INIT(IsADirectoryError)
2564 PRE_INIT(NotADirectoryError)
2565 PRE_INIT(InterruptedError)
2566 PRE_INIT(PermissionError)
2567 PRE_INIT(ProcessLookupError)
2568 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002569
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570 bdict = PyModule_GetDict(bltinmod);
2571 if (bdict == NULL)
2572 Py_FatalError("exceptions bootstrapping error.");
2573
2574 POST_INIT(BaseException)
2575 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002576 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002577 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578 POST_INIT(StopIteration)
2579 POST_INIT(GeneratorExit)
2580 POST_INIT(SystemExit)
2581 POST_INIT(KeyboardInterrupt)
2582 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002583 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002585 INIT_ALIAS(EnvironmentError, OSError)
2586 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002588 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002589#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590 POST_INIT(EOFError)
2591 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002592 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002593 POST_INIT(NotImplementedError)
2594 POST_INIT(NameError)
2595 POST_INIT(UnboundLocalError)
2596 POST_INIT(AttributeError)
2597 POST_INIT(SyntaxError)
2598 POST_INIT(IndentationError)
2599 POST_INIT(TabError)
2600 POST_INIT(LookupError)
2601 POST_INIT(IndexError)
2602 POST_INIT(KeyError)
2603 POST_INIT(ValueError)
2604 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002605 POST_INIT(UnicodeEncodeError)
2606 POST_INIT(UnicodeDecodeError)
2607 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002608 POST_INIT(AssertionError)
2609 POST_INIT(ArithmeticError)
2610 POST_INIT(FloatingPointError)
2611 POST_INIT(OverflowError)
2612 POST_INIT(ZeroDivisionError)
2613 POST_INIT(SystemError)
2614 POST_INIT(ReferenceError)
2615 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002616 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002617 POST_INIT(Warning)
2618 POST_INIT(UserWarning)
2619 POST_INIT(DeprecationWarning)
2620 POST_INIT(PendingDeprecationWarning)
2621 POST_INIT(SyntaxWarning)
2622 POST_INIT(RuntimeWarning)
2623 POST_INIT(FutureWarning)
2624 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002625 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002626 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002627 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002628
Antoine Pitrouac456a12012-01-18 21:35:21 +01002629 if (!errnomap) {
2630 errnomap = PyDict_New();
2631 if (!errnomap)
2632 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2633 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002634
2635 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002636 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002637
Louie Luc4318542017-03-29 13:28:15 +08002638 POST_INIT(BlockingIOError)
2639 ADD_ERRNO(BlockingIOError, EAGAIN)
2640 ADD_ERRNO(BlockingIOError, EALREADY)
2641 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2642 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2643 POST_INIT(BrokenPipeError)
2644 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002645#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002646 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002647#endif
Louie Luc4318542017-03-29 13:28:15 +08002648 POST_INIT(ChildProcessError)
2649 ADD_ERRNO(ChildProcessError, ECHILD)
2650 POST_INIT(ConnectionAbortedError)
2651 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2652 POST_INIT(ConnectionRefusedError)
2653 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2654 POST_INIT(ConnectionResetError)
2655 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2656 POST_INIT(FileExistsError)
2657 ADD_ERRNO(FileExistsError, EEXIST)
2658 POST_INIT(FileNotFoundError)
2659 ADD_ERRNO(FileNotFoundError, ENOENT)
2660 POST_INIT(IsADirectoryError)
2661 ADD_ERRNO(IsADirectoryError, EISDIR)
2662 POST_INIT(NotADirectoryError)
2663 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2664 POST_INIT(InterruptedError)
2665 ADD_ERRNO(InterruptedError, EINTR)
2666 POST_INIT(PermissionError)
2667 ADD_ERRNO(PermissionError, EACCES)
2668 ADD_ERRNO(PermissionError, EPERM)
2669 POST_INIT(ProcessLookupError)
2670 ADD_ERRNO(ProcessLookupError, ESRCH)
2671 POST_INIT(TimeoutError)
2672 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002673
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002674 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002675}
2676
2677void
2678_PyExc_Fini(void)
2679{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002680 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002681 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002682}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002683
2684/* Helper to do the equivalent of "raise X from Y" in C, but always using
2685 * the current exception rather than passing one in.
2686 *
2687 * We currently limit this to *only* exceptions that use the BaseException
2688 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2689 * those correctly without losing data and without losing backwards
2690 * compatibility.
2691 *
2692 * We also aim to rule out *all* exceptions that might be storing additional
2693 * state, whether by having a size difference relative to BaseException,
2694 * additional arguments passed in during construction or by having a
2695 * non-empty instance dict.
2696 *
2697 * We need to be very careful with what we wrap, since changing types to
2698 * a broader exception type would be backwards incompatible for
2699 * existing codecs, and with different init or new method implementations
2700 * may either not support instantiation with PyErr_Format or lose
2701 * information when instantiated that way.
2702 *
2703 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2704 * fact that exceptions are expected to support pickling. If more builtin
2705 * exceptions (e.g. AttributeError) start to be converted to rich
2706 * exceptions with additional attributes, that's probably a better approach
2707 * to pursue over adding special cases for particular stateful subclasses.
2708 *
2709 * Returns a borrowed reference to the new exception (if any), NULL if the
2710 * existing exception was left in place.
2711 */
2712PyObject *
2713_PyErr_TrySetFromCause(const char *format, ...)
2714{
2715 PyObject* msg_prefix;
2716 PyObject *exc, *val, *tb;
2717 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002718 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002719 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002720 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002721 PyObject *new_exc, *new_val, *new_tb;
2722 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002723 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002724
Nick Coghlan8b097b42013-11-13 23:49:21 +10002725 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002726 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002727 /* Ensure type info indicates no extra state is stored at the C level
2728 * and that the type can be reinstantiated using PyErr_Format
2729 */
2730 caught_type_size = caught_type->tp_basicsize;
2731 base_exc_size = _PyExc_BaseException.tp_basicsize;
2732 same_basic_size = (
2733 caught_type_size == base_exc_size ||
2734 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002735 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002736 )
2737 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002738 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002739 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002740 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002741 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002742 /* We can't be sure we can wrap this safely, since it may contain
2743 * more state than just the exception type. Accordingly, we just
2744 * leave it alone.
2745 */
2746 PyErr_Restore(exc, val, tb);
2747 return NULL;
2748 }
2749
2750 /* Check the args are empty or contain a single string */
2751 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002752 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002753 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002754 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002755 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002756 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002757 /* More than 1 arg, or the one arg we do have isn't a string
2758 */
2759 PyErr_Restore(exc, val, tb);
2760 return NULL;
2761 }
2762
2763 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002764 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002765 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002766 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002767 /* While we could potentially copy a non-empty instance dictionary
2768 * to the replacement exception, for now we take the more
2769 * conservative path of leaving exceptions with attributes set
2770 * alone.
2771 */
2772 PyErr_Restore(exc, val, tb);
2773 return NULL;
2774 }
2775
2776 /* For exceptions that we can wrap safely, we chain the original
2777 * exception to a new one of the exact same type with an
2778 * error message that mentions the additional details and the
2779 * original exception.
2780 *
2781 * It would be nice to wrap OSError and various other exception
2782 * types as well, but that's quite a bit trickier due to the extra
2783 * state potentially stored on OSError instances.
2784 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002785 /* Ensure the traceback is set correctly on the existing exception */
2786 if (tb != NULL) {
2787 PyException_SetTraceback(val, tb);
2788 Py_DECREF(tb);
2789 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002790
Christian Heimes507eabd2013-11-14 01:39:35 +01002791#ifdef HAVE_STDARG_PROTOTYPES
2792 va_start(vargs, format);
2793#else
2794 va_start(vargs);
2795#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002796 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002797 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002798 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002799 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002800 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002801 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002802 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002803
2804 PyErr_Format(exc, "%U (%s: %S)",
2805 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002806 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002807 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002808 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2809 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2810 PyException_SetCause(new_val, val);
2811 PyErr_Restore(new_exc, new_val, new_tb);
2812 return new_val;
2813}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002814
2815
2816/* To help with migration from Python 2, SyntaxError.__init__ applies some
2817 * heuristics to try to report a more meaningful exception when print and
2818 * exec are used like statements.
2819 *
2820 * The heuristics are currently expected to detect the following cases:
2821 * - top level statement
2822 * - statement in a nested suite
2823 * - trailing section of a one line complex statement
2824 *
2825 * They're currently known not to trigger:
2826 * - after a semi-colon
2827 *
2828 * The error message can be a bit odd in cases where the "arguments" are
2829 * completely illegal syntactically, but that isn't worth the hassle of
2830 * fixing.
2831 *
2832 * We also can't do anything about cases that are legal Python 3 syntax
2833 * but mean something entirely different from what they did in Python 2
2834 * (omitting the arguments entirely, printing items preceded by a unary plus
2835 * or minus, using the stream redirection syntax).
2836 */
2837
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302838
2839// Static helper for setting legacy print error message
2840static int
2841_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2842{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302843 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302844 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302845 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302846 Py_ssize_t start_pos = start + PRINT_OFFSET;
2847 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2848 Py_UCS4 semicolon = ';';
2849 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2850 start_pos, text_len, 1);
2851 if (end_pos < -1) {
2852 return -1;
2853 } else if (end_pos == -1) {
2854 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302855 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302856
2857 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302858 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302859 return -1;
2860 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302861
2862 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2863 if (strip_sep_obj == NULL) {
2864 Py_DECREF(data);
2865 return -1;
2866 }
2867
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302868 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302869 Py_DECREF(data);
2870 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302871 if (new_data == NULL) {
2872 return -1;
2873 }
2874 // gets the modified text_len after stripping `print `
2875 text_len = PyUnicode_GET_LENGTH(new_data);
2876 const char *maybe_end_arg = "";
2877 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2878 maybe_end_arg = " end=\" \"";
2879 }
2880 PyObject *error_msg = PyUnicode_FromFormat(
2881 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2882 new_data, maybe_end_arg
2883 );
2884 Py_DECREF(new_data);
2885 if (error_msg == NULL)
2886 return -1;
2887
2888 Py_XSETREF(self->msg, error_msg);
2889 return 1;
2890}
2891
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002892static int
2893_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2894{
2895 /* Return values:
2896 * -1: an error occurred
2897 * 0: nothing happened
2898 * 1: the check triggered & the error message was changed
2899 */
2900 static PyObject *print_prefix = NULL;
2901 static PyObject *exec_prefix = NULL;
2902 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2903 int kind = PyUnicode_KIND(self->text);
2904 void *data = PyUnicode_DATA(self->text);
2905
2906 /* Ignore leading whitespace */
2907 while (start < text_len) {
2908 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2909 if (!Py_UNICODE_ISSPACE(ch))
2910 break;
2911 start++;
2912 }
2913 /* Checking against an empty or whitespace-only part of the string */
2914 if (start == text_len) {
2915 return 0;
2916 }
2917
2918 /* Check for legacy print statements */
2919 if (print_prefix == NULL) {
2920 print_prefix = PyUnicode_InternFromString("print ");
2921 if (print_prefix == NULL) {
2922 return -1;
2923 }
2924 }
2925 if (PyUnicode_Tailmatch(self->text, print_prefix,
2926 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302927
2928 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002929 }
2930
2931 /* Check for legacy exec statements */
2932 if (exec_prefix == NULL) {
2933 exec_prefix = PyUnicode_InternFromString("exec ");
2934 if (exec_prefix == NULL) {
2935 return -1;
2936 }
2937 }
2938 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2939 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002940 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002941 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002942 return 1;
2943 }
2944 /* Fall back to the default error message */
2945 return 0;
2946}
2947
2948static int
2949_report_missing_parentheses(PySyntaxErrorObject *self)
2950{
2951 Py_UCS4 left_paren = 40;
2952 Py_ssize_t left_paren_index;
2953 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2954 int legacy_check_result = 0;
2955
2956 /* Skip entirely if there is an opening parenthesis */
2957 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2958 0, text_len, 1);
2959 if (left_paren_index < -1) {
2960 return -1;
2961 }
2962 if (left_paren_index != -1) {
2963 /* Use default error message for any line with an opening paren */
2964 return 0;
2965 }
2966 /* Handle the simple statement case */
2967 legacy_check_result = _check_for_legacy_statements(self, 0);
2968 if (legacy_check_result < 0) {
2969 return -1;
2970
2971 }
2972 if (legacy_check_result == 0) {
2973 /* Handle the one-line complex statement case */
2974 Py_UCS4 colon = 58;
2975 Py_ssize_t colon_index;
2976 colon_index = PyUnicode_FindChar(self->text, colon,
2977 0, text_len, 1);
2978 if (colon_index < -1) {
2979 return -1;
2980 }
2981 if (colon_index >= 0 && colon_index < text_len) {
2982 /* Check again, starting from just after the colon */
2983 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2984 return -1;
2985 }
2986 }
2987 }
2988 return 0;
2989}