blob: 190ad0654024b09a52157a4dd784bc27685ca392 [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>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020019
20/* The dict map from errno codes to OSError subclasses */
21static PyObject *errnomap = NULL;
22
23
Thomas Wouters477c8d52006-05-27 19:21:47 +000024/* NOTE: If the exception class hierarchy changes, don't forget to update
25 * Lib/test/exception_hierarchy.txt
26 */
27
Thomas Wouters477c8d52006-05-27 19:21:47 +000028/*
29 * BaseException
30 */
31static PyObject *
32BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
33{
34 PyBaseExceptionObject *self;
35
36 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 if (!self)
38 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000039 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000040 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000041 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070042 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000043
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010044 if (args) {
45 self->args = args;
46 Py_INCREF(args);
47 return (PyObject *)self;
48 }
49
Thomas Wouters477c8d52006-05-27 19:21:47 +000050 self->args = PyTuple_New(0);
51 if (!self->args) {
52 Py_DECREF(self);
53 return NULL;
54 }
55
Thomas Wouters477c8d52006-05-27 19:21:47 +000056 return (PyObject *)self;
57}
58
59static int
60BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
61{
Christian Heimes90aa7642007-12-19 02:45:37 +000062 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000063 return -1;
64
Serhiy Storchaka576f1322016-01-05 21:27:54 +020065 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030066 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068 return 0;
69}
70
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000071static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000072BaseException_clear(PyBaseExceptionObject *self)
73{
74 Py_CLEAR(self->dict);
75 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000076 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000077 Py_CLEAR(self->cause);
78 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000079 return 0;
80}
81
82static void
83BaseException_dealloc(PyBaseExceptionObject *self)
84{
Thomas Wouters89f507f2006-12-13 04:49:30 +000085 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000087 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088}
89
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000090static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000091BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
92{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000095 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000096 Py_VISIT(self->cause);
97 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000098 return 0;
99}
100
101static PyObject *
102BaseException_str(PyBaseExceptionObject *self)
103{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000104 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000106 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112}
113
114static PyObject *
115BaseException_repr(PyBaseExceptionObject *self)
116{
Serhiy Storchakac6792272013-10-19 21:03:34 +0300117 const char *name;
118 const char *dot;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119
Serhiy Storchakac6792272013-10-19 21:03:34 +0300120 name = Py_TYPE(self)->tp_name;
121 dot = (const char *) strrchr(name, '.');
Thomas Wouters477c8d52006-05-27 19:21:47 +0000122 if (dot != NULL) name = dot+1;
123
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000124 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
1355 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1356 if (self->text && PyUnicode_Check(self->text)) {
1357 if (_report_missing_parentheses(self) < 0) {
1358 return -1;
1359 }
1360 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001361 }
1362 return 0;
1363}
1364
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001365static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366SyntaxError_clear(PySyntaxErrorObject *self)
1367{
1368 Py_CLEAR(self->msg);
1369 Py_CLEAR(self->filename);
1370 Py_CLEAR(self->lineno);
1371 Py_CLEAR(self->offset);
1372 Py_CLEAR(self->text);
1373 Py_CLEAR(self->print_file_and_line);
1374 return BaseException_clear((PyBaseExceptionObject *)self);
1375}
1376
1377static void
1378SyntaxError_dealloc(PySyntaxErrorObject *self)
1379{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001381 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001382 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001383}
1384
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001385static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1387{
1388 Py_VISIT(self->msg);
1389 Py_VISIT(self->filename);
1390 Py_VISIT(self->lineno);
1391 Py_VISIT(self->offset);
1392 Py_VISIT(self->text);
1393 Py_VISIT(self->print_file_and_line);
1394 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1395}
1396
1397/* This is called "my_basename" instead of just "basename" to avoid name
1398 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1399 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001400static PyObject*
1401my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001402{
Victor Stinner6237daf2010-04-28 17:26:19 +00001403 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001404 int kind;
1405 void *data;
1406
1407 if (PyUnicode_READY(name))
1408 return NULL;
1409 kind = PyUnicode_KIND(name);
1410 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001411 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001412 offset = 0;
1413 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001414 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001415 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001416 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001417 if (offset != 0)
1418 return PyUnicode_Substring(name, offset, size);
1419 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001420 Py_INCREF(name);
1421 return name;
1422 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001423}
1424
1425
1426static PyObject *
1427SyntaxError_str(PySyntaxErrorObject *self)
1428{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001429 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001430 PyObject *filename;
1431 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001432 /* Below, we always ignore overflow errors, just printing -1.
1433 Still, we cannot allow an OverflowError to be raised, so
1434 we need to call PyLong_AsLongAndOverflow. */
1435 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001436
1437 /* XXX -- do all the additional formatting with filename and
1438 lineno here */
1439
Neal Norwitzed2b7392007-08-26 04:51:10 +00001440 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001441 filename = my_basename(self->filename);
1442 if (filename == NULL)
1443 return NULL;
1444 } else {
1445 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001446 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001447 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001448
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001449 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001450 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001451
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001452 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001453 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001454 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001455 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001457 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001458 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001459 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001460 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001461 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001462 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001463 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001464 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001465 Py_XDECREF(filename);
1466 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001467}
1468
1469static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001470 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1471 PyDoc_STR("exception msg")},
1472 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1473 PyDoc_STR("exception filename")},
1474 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1475 PyDoc_STR("exception lineno")},
1476 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1477 PyDoc_STR("exception offset")},
1478 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1479 PyDoc_STR("exception text")},
1480 {"print_file_and_line", T_OBJECT,
1481 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1482 PyDoc_STR("exception print_file_and_line")},
1483 {NULL} /* Sentinel */
1484};
1485
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001486ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001487 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001488 SyntaxError_str, "Invalid syntax.");
1489
1490
1491/*
1492 * IndentationError extends SyntaxError
1493 */
1494MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1495 "Improper indentation.");
1496
1497
1498/*
1499 * TabError extends IndentationError
1500 */
1501MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1502 "Improper mixture of spaces and tabs.");
1503
1504
1505/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001506 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001507 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001508SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001509 "Base class for lookup errors.");
1510
1511
1512/*
1513 * IndexError extends LookupError
1514 */
1515SimpleExtendsException(PyExc_LookupError, IndexError,
1516 "Sequence index out of range.");
1517
1518
1519/*
1520 * KeyError extends LookupError
1521 */
1522static PyObject *
1523KeyError_str(PyBaseExceptionObject *self)
1524{
1525 /* If args is a tuple of exactly one item, apply repr to args[0].
1526 This is done so that e.g. the exception raised by {}[''] prints
1527 KeyError: ''
1528 rather than the confusing
1529 KeyError
1530 alone. The downside is that if KeyError is raised with an explanatory
1531 string, that string will be displayed in quotes. Too bad.
1532 If args is anything else, use the default BaseException__str__().
1533 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001534 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001535 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001536 }
1537 return BaseException_str(self);
1538}
1539
1540ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001541 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001542
1543
1544/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001545 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001546 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001547SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001548 "Inappropriate argument value (of correct type).");
1549
1550/*
1551 * UnicodeError extends ValueError
1552 */
1553
1554SimpleExtendsException(PyExc_ValueError, UnicodeError,
1555 "Unicode related error.");
1556
Thomas Wouters477c8d52006-05-27 19:21:47 +00001557static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001558get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001559{
1560 if (!attr) {
1561 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1562 return NULL;
1563 }
1564
Christian Heimes72b710a2008-05-26 13:28:38 +00001565 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001566 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1567 return NULL;
1568 }
1569 Py_INCREF(attr);
1570 return attr;
1571}
1572
1573static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574get_unicode(PyObject *attr, const char *name)
1575{
1576 if (!attr) {
1577 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1578 return NULL;
1579 }
1580
1581 if (!PyUnicode_Check(attr)) {
1582 PyErr_Format(PyExc_TypeError,
1583 "%.200s attribute must be unicode", name);
1584 return NULL;
1585 }
1586 Py_INCREF(attr);
1587 return attr;
1588}
1589
Walter Dörwaldd2034312007-05-18 16:29:38 +00001590static int
1591set_unicodefromstring(PyObject **attr, const char *value)
1592{
1593 PyObject *obj = PyUnicode_FromString(value);
1594 if (!obj)
1595 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001596 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001597 return 0;
1598}
1599
Thomas Wouters477c8d52006-05-27 19:21:47 +00001600PyObject *
1601PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1602{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001603 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001604}
1605
1606PyObject *
1607PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1608{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001609 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001610}
1611
1612PyObject *
1613PyUnicodeEncodeError_GetObject(PyObject *exc)
1614{
1615 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1616}
1617
1618PyObject *
1619PyUnicodeDecodeError_GetObject(PyObject *exc)
1620{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001621 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001622}
1623
1624PyObject *
1625PyUnicodeTranslateError_GetObject(PyObject *exc)
1626{
1627 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1628}
1629
1630int
1631PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1632{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001633 Py_ssize_t size;
1634 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1635 "object");
1636 if (!obj)
1637 return -1;
1638 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001639 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001640 if (*start<0)
1641 *start = 0; /*XXX check for values <0*/
1642 if (*start>=size)
1643 *start = size-1;
1644 Py_DECREF(obj);
1645 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001646}
1647
1648
1649int
1650PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1651{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001652 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001653 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001654 if (!obj)
1655 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001656 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001657 *start = ((PyUnicodeErrorObject *)exc)->start;
1658 if (*start<0)
1659 *start = 0;
1660 if (*start>=size)
1661 *start = size-1;
1662 Py_DECREF(obj);
1663 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001664}
1665
1666
1667int
1668PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1669{
1670 return PyUnicodeEncodeError_GetStart(exc, start);
1671}
1672
1673
1674int
1675PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1676{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001677 ((PyUnicodeErrorObject *)exc)->start = start;
1678 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001679}
1680
1681
1682int
1683PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1684{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001685 ((PyUnicodeErrorObject *)exc)->start = start;
1686 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001687}
1688
1689
1690int
1691PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1692{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001693 ((PyUnicodeErrorObject *)exc)->start = start;
1694 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001695}
1696
1697
1698int
1699PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1700{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001701 Py_ssize_t size;
1702 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1703 "object");
1704 if (!obj)
1705 return -1;
1706 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001707 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001708 if (*end<1)
1709 *end = 1;
1710 if (*end>size)
1711 *end = size;
1712 Py_DECREF(obj);
1713 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001714}
1715
1716
1717int
1718PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1719{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001720 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001721 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001722 if (!obj)
1723 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001724 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001725 *end = ((PyUnicodeErrorObject *)exc)->end;
1726 if (*end<1)
1727 *end = 1;
1728 if (*end>size)
1729 *end = size;
1730 Py_DECREF(obj);
1731 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001732}
1733
1734
1735int
1736PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1737{
1738 return PyUnicodeEncodeError_GetEnd(exc, start);
1739}
1740
1741
1742int
1743PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1744{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001745 ((PyUnicodeErrorObject *)exc)->end = end;
1746 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001747}
1748
1749
1750int
1751PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1752{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001753 ((PyUnicodeErrorObject *)exc)->end = end;
1754 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001755}
1756
1757
1758int
1759PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1760{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001761 ((PyUnicodeErrorObject *)exc)->end = end;
1762 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763}
1764
1765PyObject *
1766PyUnicodeEncodeError_GetReason(PyObject *exc)
1767{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001768 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001769}
1770
1771
1772PyObject *
1773PyUnicodeDecodeError_GetReason(PyObject *exc)
1774{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001775 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776}
1777
1778
1779PyObject *
1780PyUnicodeTranslateError_GetReason(PyObject *exc)
1781{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001782 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001783}
1784
1785
1786int
1787PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1788{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001789 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1790 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791}
1792
1793
1794int
1795PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1796{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001797 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1798 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001799}
1800
1801
1802int
1803PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1804{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001805 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1806 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001807}
1808
1809
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001811UnicodeError_clear(PyUnicodeErrorObject *self)
1812{
1813 Py_CLEAR(self->encoding);
1814 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815 Py_CLEAR(self->reason);
1816 return BaseException_clear((PyBaseExceptionObject *)self);
1817}
1818
1819static void
1820UnicodeError_dealloc(PyUnicodeErrorObject *self)
1821{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001822 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001824 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001825}
1826
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001827static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001828UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1829{
1830 Py_VISIT(self->encoding);
1831 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832 Py_VISIT(self->reason);
1833 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1834}
1835
1836static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1838 PyDoc_STR("exception encoding")},
1839 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1840 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001841 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001842 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001843 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844 PyDoc_STR("exception end")},
1845 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1846 PyDoc_STR("exception reason")},
1847 {NULL} /* Sentinel */
1848};
1849
1850
1851/*
1852 * UnicodeEncodeError extends UnicodeError
1853 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854
1855static int
1856UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1857{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001858 PyUnicodeErrorObject *err;
1859
Thomas Wouters477c8d52006-05-27 19:21:47 +00001860 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1861 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001862
1863 err = (PyUnicodeErrorObject *)self;
1864
1865 Py_CLEAR(err->encoding);
1866 Py_CLEAR(err->object);
1867 Py_CLEAR(err->reason);
1868
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001869 if (!PyArg_ParseTuple(args, "UUnnU",
1870 &err->encoding, &err->object,
1871 &err->start, &err->end, &err->reason)) {
1872 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001873 return -1;
1874 }
1875
Guido van Rossum98297ee2007-11-06 21:34:58 +00001876 Py_INCREF(err->encoding);
1877 Py_INCREF(err->object);
1878 Py_INCREF(err->reason);
1879
1880 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001881}
1882
1883static PyObject *
1884UnicodeEncodeError_str(PyObject *self)
1885{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001886 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001887 PyObject *result = NULL;
1888 PyObject *reason_str = NULL;
1889 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001890
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001891 if (!uself->object)
1892 /* Not properly initialized. */
1893 return PyUnicode_FromString("");
1894
Eric Smith0facd772010-02-24 15:42:29 +00001895 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001896 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001897 reason_str = PyObject_Str(uself->reason);
1898 if (reason_str == NULL)
1899 goto done;
1900 encoding_str = PyObject_Str(uself->encoding);
1901 if (encoding_str == NULL)
1902 goto done;
1903
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001904 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1905 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001906 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001907 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001908 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001909 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001910 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001911 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001912 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001913 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001914 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001915 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001916 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001917 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001918 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919 }
Eric Smith0facd772010-02-24 15:42:29 +00001920 else {
1921 result = PyUnicode_FromFormat(
1922 "'%U' codec can't encode characters in position %zd-%zd: %U",
1923 encoding_str,
1924 uself->start,
1925 uself->end-1,
1926 reason_str);
1927 }
1928done:
1929 Py_XDECREF(reason_str);
1930 Py_XDECREF(encoding_str);
1931 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001932}
1933
1934static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001935 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001936 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001937 sizeof(PyUnicodeErrorObject), 0,
1938 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1939 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1940 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001941 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1942 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001943 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001944 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945};
1946PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1947
1948PyObject *
1949PyUnicodeEncodeError_Create(
1950 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1951 Py_ssize_t start, Py_ssize_t end, const char *reason)
1952{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001953 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001954 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001955}
1956
1957
1958/*
1959 * UnicodeDecodeError extends UnicodeError
1960 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001961
1962static int
1963UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1964{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001965 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001966
Thomas Wouters477c8d52006-05-27 19:21:47 +00001967 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1968 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001969
1970 ude = (PyUnicodeErrorObject *)self;
1971
1972 Py_CLEAR(ude->encoding);
1973 Py_CLEAR(ude->object);
1974 Py_CLEAR(ude->reason);
1975
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001976 if (!PyArg_ParseTuple(args, "UOnnU",
1977 &ude->encoding, &ude->object,
1978 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001979 ude->encoding = ude->object = ude->reason = NULL;
1980 return -1;
1981 }
1982
Guido van Rossum98297ee2007-11-06 21:34:58 +00001983 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001984 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001985 Py_INCREF(ude->reason);
1986
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001987 if (!PyBytes_Check(ude->object)) {
1988 Py_buffer view;
1989 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1990 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001991 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001992 PyBuffer_Release(&view);
1993 if (!ude->object)
1994 goto error;
1995 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001996 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001997
1998error:
1999 Py_CLEAR(ude->encoding);
2000 Py_CLEAR(ude->object);
2001 Py_CLEAR(ude->reason);
2002 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002003}
2004
2005static PyObject *
2006UnicodeDecodeError_str(PyObject *self)
2007{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002008 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002009 PyObject *result = NULL;
2010 PyObject *reason_str = NULL;
2011 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002012
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002013 if (!uself->object)
2014 /* Not properly initialized. */
2015 return PyUnicode_FromString("");
2016
Eric Smith0facd772010-02-24 15:42:29 +00002017 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002018 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002019 reason_str = PyObject_Str(uself->reason);
2020 if (reason_str == NULL)
2021 goto done;
2022 encoding_str = PyObject_Str(uself->encoding);
2023 if (encoding_str == NULL)
2024 goto done;
2025
2026 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002027 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002028 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002029 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002030 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002031 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002032 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002033 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002034 }
Eric Smith0facd772010-02-24 15:42:29 +00002035 else {
2036 result = PyUnicode_FromFormat(
2037 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2038 encoding_str,
2039 uself->start,
2040 uself->end-1,
2041 reason_str
2042 );
2043 }
2044done:
2045 Py_XDECREF(reason_str);
2046 Py_XDECREF(encoding_str);
2047 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002048}
2049
2050static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002051 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002052 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002053 sizeof(PyUnicodeErrorObject), 0,
2054 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2055 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2056 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002057 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2058 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002059 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002060 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002061};
2062PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2063
2064PyObject *
2065PyUnicodeDecodeError_Create(
2066 const char *encoding, const char *object, Py_ssize_t length,
2067 Py_ssize_t start, Py_ssize_t end, const char *reason)
2068{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002069 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002070 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002071}
2072
2073
2074/*
2075 * UnicodeTranslateError extends UnicodeError
2076 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002077
2078static int
2079UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2080 PyObject *kwds)
2081{
2082 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2083 return -1;
2084
2085 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002086 Py_CLEAR(self->reason);
2087
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002088 if (!PyArg_ParseTuple(args, "UnnU",
2089 &self->object,
2090 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002091 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002092 return -1;
2093 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002094
Thomas Wouters477c8d52006-05-27 19:21:47 +00002095 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002096 Py_INCREF(self->reason);
2097
2098 return 0;
2099}
2100
2101
2102static PyObject *
2103UnicodeTranslateError_str(PyObject *self)
2104{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002105 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002106 PyObject *result = NULL;
2107 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002108
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002109 if (!uself->object)
2110 /* Not properly initialized. */
2111 return PyUnicode_FromString("");
2112
Eric Smith0facd772010-02-24 15:42:29 +00002113 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002114 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002115 reason_str = PyObject_Str(uself->reason);
2116 if (reason_str == NULL)
2117 goto done;
2118
Victor Stinner53b33e72011-11-21 01:17:27 +01002119 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2120 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002121 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002122 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002123 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002124 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002125 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002126 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002127 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002128 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002129 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002130 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002131 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002132 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002133 );
Eric Smith0facd772010-02-24 15:42:29 +00002134 } else {
2135 result = PyUnicode_FromFormat(
2136 "can't translate characters in position %zd-%zd: %U",
2137 uself->start,
2138 uself->end-1,
2139 reason_str
2140 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002141 }
Eric Smith0facd772010-02-24 15:42:29 +00002142done:
2143 Py_XDECREF(reason_str);
2144 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002145}
2146
2147static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002148 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002149 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002150 sizeof(PyUnicodeErrorObject), 0,
2151 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2152 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2153 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002155 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2156 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002157 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002158};
2159PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2160
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002161/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162PyObject *
2163PyUnicodeTranslateError_Create(
2164 const Py_UNICODE *object, Py_ssize_t length,
2165 Py_ssize_t start, Py_ssize_t end, const char *reason)
2166{
2167 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002168 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002169}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002170
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002171PyObject *
2172_PyUnicodeTranslateError_Create(
2173 PyObject *object,
2174 Py_ssize_t start, Py_ssize_t end, const char *reason)
2175{
Victor Stinner69598d4c2014-04-04 20:59:44 +02002176 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002177 object, start, end, reason);
2178}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002179
2180/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002181 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002182 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002183SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002184 "Assertion failed.");
2185
2186
2187/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002188 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002189 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002190SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002191 "Base class for arithmetic errors.");
2192
2193
2194/*
2195 * FloatingPointError extends ArithmeticError
2196 */
2197SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2198 "Floating point operation failed.");
2199
2200
2201/*
2202 * OverflowError extends ArithmeticError
2203 */
2204SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2205 "Result too large to be represented.");
2206
2207
2208/*
2209 * ZeroDivisionError extends ArithmeticError
2210 */
2211SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2212 "Second argument to a division or modulo operation was zero.");
2213
2214
2215/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002216 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002217 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002218SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002219 "Internal error in the Python interpreter.\n"
2220 "\n"
2221 "Please report this to the Python maintainer, along with the traceback,\n"
2222 "the Python version, and the hardware/OS platform and version.");
2223
2224
2225/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002226 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002227 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002228SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002229 "Weak ref proxy used after referent went away.");
2230
2231
2232/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002233 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002234 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002235
2236#define MEMERRORS_SAVE 16
2237static PyBaseExceptionObject *memerrors_freelist = NULL;
2238static int memerrors_numfree = 0;
2239
2240static PyObject *
2241MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2242{
2243 PyBaseExceptionObject *self;
2244
2245 if (type != (PyTypeObject *) PyExc_MemoryError)
2246 return BaseException_new(type, args, kwds);
2247 if (memerrors_freelist == NULL)
2248 return BaseException_new(type, args, kwds);
2249 /* Fetch object from freelist and revive it */
2250 self = memerrors_freelist;
2251 self->args = PyTuple_New(0);
2252 /* This shouldn't happen since the empty tuple is persistent */
2253 if (self->args == NULL)
2254 return NULL;
2255 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2256 memerrors_numfree--;
2257 self->dict = NULL;
2258 _Py_NewReference((PyObject *)self);
2259 _PyObject_GC_TRACK(self);
2260 return (PyObject *)self;
2261}
2262
2263static void
2264MemoryError_dealloc(PyBaseExceptionObject *self)
2265{
2266 _PyObject_GC_UNTRACK(self);
2267 BaseException_clear(self);
2268 if (memerrors_numfree >= MEMERRORS_SAVE)
2269 Py_TYPE(self)->tp_free((PyObject *)self);
2270 else {
2271 self->dict = (PyObject *) memerrors_freelist;
2272 memerrors_freelist = self;
2273 memerrors_numfree++;
2274 }
2275}
2276
2277static void
2278preallocate_memerrors(void)
2279{
2280 /* We create enough MemoryErrors and then decref them, which will fill
2281 up the freelist. */
2282 int i;
2283 PyObject *errors[MEMERRORS_SAVE];
2284 for (i = 0; i < MEMERRORS_SAVE; i++) {
2285 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2286 NULL, NULL);
2287 if (!errors[i])
2288 Py_FatalError("Could not preallocate MemoryError object");
2289 }
2290 for (i = 0; i < MEMERRORS_SAVE; i++) {
2291 Py_DECREF(errors[i]);
2292 }
2293}
2294
2295static void
2296free_preallocated_memerrors(void)
2297{
2298 while (memerrors_freelist != NULL) {
2299 PyObject *self = (PyObject *) memerrors_freelist;
2300 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2301 Py_TYPE(self)->tp_free((PyObject *)self);
2302 }
2303}
2304
2305
2306static PyTypeObject _PyExc_MemoryError = {
2307 PyVarObject_HEAD_INIT(NULL, 0)
2308 "MemoryError",
2309 sizeof(PyBaseExceptionObject),
2310 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2311 0, 0, 0, 0, 0, 0, 0,
2312 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2313 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2314 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2315 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2316 (initproc)BaseException_init, 0, MemoryError_new
2317};
2318PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2319
Thomas Wouters477c8d52006-05-27 19:21:47 +00002320
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002321/*
2322 * BufferError extends Exception
2323 */
2324SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2325
Thomas Wouters477c8d52006-05-27 19:21:47 +00002326
2327/* Warning category docstrings */
2328
2329/*
2330 * Warning extends Exception
2331 */
2332SimpleExtendsException(PyExc_Exception, Warning,
2333 "Base class for warning categories.");
2334
2335
2336/*
2337 * UserWarning extends Warning
2338 */
2339SimpleExtendsException(PyExc_Warning, UserWarning,
2340 "Base class for warnings generated by user code.");
2341
2342
2343/*
2344 * DeprecationWarning extends Warning
2345 */
2346SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2347 "Base class for warnings about deprecated features.");
2348
2349
2350/*
2351 * PendingDeprecationWarning extends Warning
2352 */
2353SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2354 "Base class for warnings about features which will be deprecated\n"
2355 "in the future.");
2356
2357
2358/*
2359 * SyntaxWarning extends Warning
2360 */
2361SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2362 "Base class for warnings about dubious syntax.");
2363
2364
2365/*
2366 * RuntimeWarning extends Warning
2367 */
2368SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2369 "Base class for warnings about dubious runtime behavior.");
2370
2371
2372/*
2373 * FutureWarning extends Warning
2374 */
2375SimpleExtendsException(PyExc_Warning, FutureWarning,
2376 "Base class for warnings about constructs that will change semantically\n"
2377 "in the future.");
2378
2379
2380/*
2381 * ImportWarning extends Warning
2382 */
2383SimpleExtendsException(PyExc_Warning, ImportWarning,
2384 "Base class for warnings about probable mistakes in module imports");
2385
2386
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002387/*
2388 * UnicodeWarning extends Warning
2389 */
2390SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2391 "Base class for warnings about Unicode related problems, mostly\n"
2392 "related to conversion problems.");
2393
Georg Brandl08be72d2010-10-24 15:11:22 +00002394
Guido van Rossum98297ee2007-11-06 21:34:58 +00002395/*
2396 * BytesWarning extends Warning
2397 */
2398SimpleExtendsException(PyExc_Warning, BytesWarning,
2399 "Base class for warnings about bytes and buffer related problems, mostly\n"
2400 "related to conversion from str or comparing to str.");
2401
2402
Georg Brandl08be72d2010-10-24 15:11:22 +00002403/*
2404 * ResourceWarning extends Warning
2405 */
2406SimpleExtendsException(PyExc_Warning, ResourceWarning,
2407 "Base class for warnings about resource usage.");
2408
2409
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002410
Yury Selivanovf488fb42015-07-03 01:04:23 -04002411/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002412 Meant to be used when normalizing the exception for exceeding the recursion
2413 depth will cause its own infinite recursion.
2414*/
2415PyObject *PyExc_RecursionErrorInst = NULL;
2416
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002417#define PRE_INIT(TYPE) \
2418 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2419 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2420 Py_FatalError("exceptions bootstrapping error."); \
2421 Py_INCREF(PyExc_ ## TYPE); \
2422 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002423
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002424#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002425 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2426 Py_FatalError("Module dictionary insertion problem.");
2427
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002428#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002429 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002430 PyExc_ ## NAME = PyExc_ ## TYPE; \
2431 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2432 Py_FatalError("Module dictionary insertion problem.");
2433
2434#define ADD_ERRNO(TYPE, CODE) { \
2435 PyObject *_code = PyLong_FromLong(CODE); \
2436 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2437 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2438 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002439 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002440 }
2441
2442#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002443#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002444/* The following constants were added to errno.h in VS2010 but have
2445 preferred WSA equivalents. */
2446#undef EADDRINUSE
2447#undef EADDRNOTAVAIL
2448#undef EAFNOSUPPORT
2449#undef EALREADY
2450#undef ECONNABORTED
2451#undef ECONNREFUSED
2452#undef ECONNRESET
2453#undef EDESTADDRREQ
2454#undef EHOSTUNREACH
2455#undef EINPROGRESS
2456#undef EISCONN
2457#undef ELOOP
2458#undef EMSGSIZE
2459#undef ENETDOWN
2460#undef ENETRESET
2461#undef ENETUNREACH
2462#undef ENOBUFS
2463#undef ENOPROTOOPT
2464#undef ENOTCONN
2465#undef ENOTSOCK
2466#undef EOPNOTSUPP
2467#undef EPROTONOSUPPORT
2468#undef EPROTOTYPE
2469#undef ETIMEDOUT
2470#undef EWOULDBLOCK
2471
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002472#if defined(WSAEALREADY) && !defined(EALREADY)
2473#define EALREADY WSAEALREADY
2474#endif
2475#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2476#define ECONNABORTED WSAECONNABORTED
2477#endif
2478#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2479#define ECONNREFUSED WSAECONNREFUSED
2480#endif
2481#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2482#define ECONNRESET WSAECONNRESET
2483#endif
2484#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2485#define EINPROGRESS WSAEINPROGRESS
2486#endif
2487#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2488#define ESHUTDOWN WSAESHUTDOWN
2489#endif
2490#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2491#define ETIMEDOUT WSAETIMEDOUT
2492#endif
2493#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2494#define EWOULDBLOCK WSAEWOULDBLOCK
2495#endif
2496#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002497
Martin v. Löwis1a214512008-06-11 05:26:20 +00002498void
Brett Cannonfd074152012-04-14 14:10:13 -04002499_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500{
Brett Cannonfd074152012-04-14 14:10:13 -04002501 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002502
2503 PRE_INIT(BaseException)
2504 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002506 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002507 PRE_INIT(StopIteration)
2508 PRE_INIT(GeneratorExit)
2509 PRE_INIT(SystemExit)
2510 PRE_INIT(KeyboardInterrupt)
2511 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002512 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002514 PRE_INIT(EOFError)
2515 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002516 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002517 PRE_INIT(NotImplementedError)
2518 PRE_INIT(NameError)
2519 PRE_INIT(UnboundLocalError)
2520 PRE_INIT(AttributeError)
2521 PRE_INIT(SyntaxError)
2522 PRE_INIT(IndentationError)
2523 PRE_INIT(TabError)
2524 PRE_INIT(LookupError)
2525 PRE_INIT(IndexError)
2526 PRE_INIT(KeyError)
2527 PRE_INIT(ValueError)
2528 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002529 PRE_INIT(UnicodeEncodeError)
2530 PRE_INIT(UnicodeDecodeError)
2531 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 PRE_INIT(AssertionError)
2533 PRE_INIT(ArithmeticError)
2534 PRE_INIT(FloatingPointError)
2535 PRE_INIT(OverflowError)
2536 PRE_INIT(ZeroDivisionError)
2537 PRE_INIT(SystemError)
2538 PRE_INIT(ReferenceError)
2539 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002540 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002541 PRE_INIT(Warning)
2542 PRE_INIT(UserWarning)
2543 PRE_INIT(DeprecationWarning)
2544 PRE_INIT(PendingDeprecationWarning)
2545 PRE_INIT(SyntaxWarning)
2546 PRE_INIT(RuntimeWarning)
2547 PRE_INIT(FutureWarning)
2548 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002549 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002550 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002551 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002553 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002554 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002555
Louie Luc4318542017-03-29 13:28:15 +08002556 PRE_INIT(BlockingIOError)
2557 PRE_INIT(BrokenPipeError)
2558 PRE_INIT(ChildProcessError)
2559 PRE_INIT(ConnectionAbortedError)
2560 PRE_INIT(ConnectionRefusedError)
2561 PRE_INIT(ConnectionResetError)
2562 PRE_INIT(FileExistsError)
2563 PRE_INIT(FileNotFoundError)
2564 PRE_INIT(IsADirectoryError)
2565 PRE_INIT(NotADirectoryError)
2566 PRE_INIT(InterruptedError)
2567 PRE_INIT(PermissionError)
2568 PRE_INIT(ProcessLookupError)
2569 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002570
Thomas Wouters477c8d52006-05-27 19:21:47 +00002571 bdict = PyModule_GetDict(bltinmod);
2572 if (bdict == NULL)
2573 Py_FatalError("exceptions bootstrapping error.");
2574
2575 POST_INIT(BaseException)
2576 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002577 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002578 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579 POST_INIT(StopIteration)
2580 POST_INIT(GeneratorExit)
2581 POST_INIT(SystemExit)
2582 POST_INIT(KeyboardInterrupt)
2583 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002584 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002585 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002586 INIT_ALIAS(EnvironmentError, OSError)
2587 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002588#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002589 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591 POST_INIT(EOFError)
2592 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002593 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594 POST_INIT(NotImplementedError)
2595 POST_INIT(NameError)
2596 POST_INIT(UnboundLocalError)
2597 POST_INIT(AttributeError)
2598 POST_INIT(SyntaxError)
2599 POST_INIT(IndentationError)
2600 POST_INIT(TabError)
2601 POST_INIT(LookupError)
2602 POST_INIT(IndexError)
2603 POST_INIT(KeyError)
2604 POST_INIT(ValueError)
2605 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002606 POST_INIT(UnicodeEncodeError)
2607 POST_INIT(UnicodeDecodeError)
2608 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609 POST_INIT(AssertionError)
2610 POST_INIT(ArithmeticError)
2611 POST_INIT(FloatingPointError)
2612 POST_INIT(OverflowError)
2613 POST_INIT(ZeroDivisionError)
2614 POST_INIT(SystemError)
2615 POST_INIT(ReferenceError)
2616 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002617 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002618 POST_INIT(Warning)
2619 POST_INIT(UserWarning)
2620 POST_INIT(DeprecationWarning)
2621 POST_INIT(PendingDeprecationWarning)
2622 POST_INIT(SyntaxWarning)
2623 POST_INIT(RuntimeWarning)
2624 POST_INIT(FutureWarning)
2625 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002626 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002627 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002628 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002629
Antoine Pitrouac456a12012-01-18 21:35:21 +01002630 if (!errnomap) {
2631 errnomap = PyDict_New();
2632 if (!errnomap)
2633 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2634 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002635
2636 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002637 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002638
Louie Luc4318542017-03-29 13:28:15 +08002639 POST_INIT(BlockingIOError)
2640 ADD_ERRNO(BlockingIOError, EAGAIN)
2641 ADD_ERRNO(BlockingIOError, EALREADY)
2642 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2643 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2644 POST_INIT(BrokenPipeError)
2645 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002646#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002647 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002648#endif
Louie Luc4318542017-03-29 13:28:15 +08002649 POST_INIT(ChildProcessError)
2650 ADD_ERRNO(ChildProcessError, ECHILD)
2651 POST_INIT(ConnectionAbortedError)
2652 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2653 POST_INIT(ConnectionRefusedError)
2654 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2655 POST_INIT(ConnectionResetError)
2656 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2657 POST_INIT(FileExistsError)
2658 ADD_ERRNO(FileExistsError, EEXIST)
2659 POST_INIT(FileNotFoundError)
2660 ADD_ERRNO(FileNotFoundError, ENOENT)
2661 POST_INIT(IsADirectoryError)
2662 ADD_ERRNO(IsADirectoryError, EISDIR)
2663 POST_INIT(NotADirectoryError)
2664 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2665 POST_INIT(InterruptedError)
2666 ADD_ERRNO(InterruptedError, EINTR)
2667 POST_INIT(PermissionError)
2668 ADD_ERRNO(PermissionError, EACCES)
2669 ADD_ERRNO(PermissionError, EPERM)
2670 POST_INIT(ProcessLookupError)
2671 ADD_ERRNO(ProcessLookupError, ESRCH)
2672 POST_INIT(TimeoutError)
2673 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002674
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002675 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002677 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002678 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002679 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002680 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002681 "recursion errors");
2682 else {
2683 PyBaseExceptionObject *err_inst =
2684 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2685 PyObject *args_tuple;
2686 PyObject *exc_message;
2687 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2688 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002689 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002690 "pre-allocation");
2691 args_tuple = PyTuple_Pack(1, exc_message);
2692 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002693 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002694 "pre-allocation");
2695 Py_DECREF(exc_message);
2696 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002697 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002698 Py_DECREF(args_tuple);
2699 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002700 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002701}
2702
2703void
2704_PyExc_Fini(void)
2705{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002706 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002707 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002708 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002709}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002710
2711/* Helper to do the equivalent of "raise X from Y" in C, but always using
2712 * the current exception rather than passing one in.
2713 *
2714 * We currently limit this to *only* exceptions that use the BaseException
2715 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2716 * those correctly without losing data and without losing backwards
2717 * compatibility.
2718 *
2719 * We also aim to rule out *all* exceptions that might be storing additional
2720 * state, whether by having a size difference relative to BaseException,
2721 * additional arguments passed in during construction or by having a
2722 * non-empty instance dict.
2723 *
2724 * We need to be very careful with what we wrap, since changing types to
2725 * a broader exception type would be backwards incompatible for
2726 * existing codecs, and with different init or new method implementations
2727 * may either not support instantiation with PyErr_Format or lose
2728 * information when instantiated that way.
2729 *
2730 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2731 * fact that exceptions are expected to support pickling. If more builtin
2732 * exceptions (e.g. AttributeError) start to be converted to rich
2733 * exceptions with additional attributes, that's probably a better approach
2734 * to pursue over adding special cases for particular stateful subclasses.
2735 *
2736 * Returns a borrowed reference to the new exception (if any), NULL if the
2737 * existing exception was left in place.
2738 */
2739PyObject *
2740_PyErr_TrySetFromCause(const char *format, ...)
2741{
2742 PyObject* msg_prefix;
2743 PyObject *exc, *val, *tb;
2744 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002745 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002746 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002747 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002748 PyObject *new_exc, *new_val, *new_tb;
2749 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002750 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002751
Nick Coghlan8b097b42013-11-13 23:49:21 +10002752 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002753 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002754 /* Ensure type info indicates no extra state is stored at the C level
2755 * and that the type can be reinstantiated using PyErr_Format
2756 */
2757 caught_type_size = caught_type->tp_basicsize;
2758 base_exc_size = _PyExc_BaseException.tp_basicsize;
2759 same_basic_size = (
2760 caught_type_size == base_exc_size ||
2761 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002762 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002763 )
2764 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002765 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002766 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002767 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002768 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002769 /* We can't be sure we can wrap this safely, since it may contain
2770 * more state than just the exception type. Accordingly, we just
2771 * leave it alone.
2772 */
2773 PyErr_Restore(exc, val, tb);
2774 return NULL;
2775 }
2776
2777 /* Check the args are empty or contain a single string */
2778 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002779 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002780 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002781 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002782 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002783 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002784 /* More than 1 arg, or the one arg we do have isn't a string
2785 */
2786 PyErr_Restore(exc, val, tb);
2787 return NULL;
2788 }
2789
2790 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002791 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002792 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002793 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002794 /* While we could potentially copy a non-empty instance dictionary
2795 * to the replacement exception, for now we take the more
2796 * conservative path of leaving exceptions with attributes set
2797 * alone.
2798 */
2799 PyErr_Restore(exc, val, tb);
2800 return NULL;
2801 }
2802
2803 /* For exceptions that we can wrap safely, we chain the original
2804 * exception to a new one of the exact same type with an
2805 * error message that mentions the additional details and the
2806 * original exception.
2807 *
2808 * It would be nice to wrap OSError and various other exception
2809 * types as well, but that's quite a bit trickier due to the extra
2810 * state potentially stored on OSError instances.
2811 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002812 /* Ensure the traceback is set correctly on the existing exception */
2813 if (tb != NULL) {
2814 PyException_SetTraceback(val, tb);
2815 Py_DECREF(tb);
2816 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002817
Christian Heimes507eabd2013-11-14 01:39:35 +01002818#ifdef HAVE_STDARG_PROTOTYPES
2819 va_start(vargs, format);
2820#else
2821 va_start(vargs);
2822#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002823 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002824 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002825 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002826 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002827 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002828 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002829 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002830
2831 PyErr_Format(exc, "%U (%s: %S)",
2832 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002833 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002834 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002835 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2836 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2837 PyException_SetCause(new_val, val);
2838 PyErr_Restore(new_exc, new_val, new_tb);
2839 return new_val;
2840}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002841
2842
2843/* To help with migration from Python 2, SyntaxError.__init__ applies some
2844 * heuristics to try to report a more meaningful exception when print and
2845 * exec are used like statements.
2846 *
2847 * The heuristics are currently expected to detect the following cases:
2848 * - top level statement
2849 * - statement in a nested suite
2850 * - trailing section of a one line complex statement
2851 *
2852 * They're currently known not to trigger:
2853 * - after a semi-colon
2854 *
2855 * The error message can be a bit odd in cases where the "arguments" are
2856 * completely illegal syntactically, but that isn't worth the hassle of
2857 * fixing.
2858 *
2859 * We also can't do anything about cases that are legal Python 3 syntax
2860 * but mean something entirely different from what they did in Python 2
2861 * (omitting the arguments entirely, printing items preceded by a unary plus
2862 * or minus, using the stream redirection syntax).
2863 */
2864
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302865
2866// Static helper for setting legacy print error message
2867static int
2868_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2869{
2870 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2871 if (strip_sep_obj == NULL)
2872 return -1;
2873
2874 // PRINT_OFFSET is to remove `print ` word from the data.
2875 const int PRINT_OFFSET = 6;
2876 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2877 PyObject *data = PyUnicode_Substring(self->text, PRINT_OFFSET, text_len);
2878
2879 if (data == NULL) {
2880 Py_DECREF(strip_sep_obj);
2881 return -1;
2882 }
2883 PyObject *new_data = _PyUnicode_XStrip(data, 2, strip_sep_obj);
2884 Py_DECREF(data);
2885 Py_DECREF(strip_sep_obj);
2886
2887 if (new_data == NULL) {
2888 return -1;
2889 }
2890 // gets the modified text_len after stripping `print `
2891 text_len = PyUnicode_GET_LENGTH(new_data);
2892 const char *maybe_end_arg = "";
2893 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2894 maybe_end_arg = " end=\" \"";
2895 }
2896 PyObject *error_msg = PyUnicode_FromFormat(
2897 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2898 new_data, maybe_end_arg
2899 );
2900 Py_DECREF(new_data);
2901 if (error_msg == NULL)
2902 return -1;
2903
2904 Py_XSETREF(self->msg, error_msg);
2905 return 1;
2906}
2907
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002908static int
2909_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2910{
2911 /* Return values:
2912 * -1: an error occurred
2913 * 0: nothing happened
2914 * 1: the check triggered & the error message was changed
2915 */
2916 static PyObject *print_prefix = NULL;
2917 static PyObject *exec_prefix = NULL;
2918 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2919 int kind = PyUnicode_KIND(self->text);
2920 void *data = PyUnicode_DATA(self->text);
2921
2922 /* Ignore leading whitespace */
2923 while (start < text_len) {
2924 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2925 if (!Py_UNICODE_ISSPACE(ch))
2926 break;
2927 start++;
2928 }
2929 /* Checking against an empty or whitespace-only part of the string */
2930 if (start == text_len) {
2931 return 0;
2932 }
2933
2934 /* Check for legacy print statements */
2935 if (print_prefix == NULL) {
2936 print_prefix = PyUnicode_InternFromString("print ");
2937 if (print_prefix == NULL) {
2938 return -1;
2939 }
2940 }
2941 if (PyUnicode_Tailmatch(self->text, print_prefix,
2942 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302943
2944 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002945 }
2946
2947 /* Check for legacy exec statements */
2948 if (exec_prefix == NULL) {
2949 exec_prefix = PyUnicode_InternFromString("exec ");
2950 if (exec_prefix == NULL) {
2951 return -1;
2952 }
2953 }
2954 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2955 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002956 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002957 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002958 return 1;
2959 }
2960 /* Fall back to the default error message */
2961 return 0;
2962}
2963
2964static int
2965_report_missing_parentheses(PySyntaxErrorObject *self)
2966{
2967 Py_UCS4 left_paren = 40;
2968 Py_ssize_t left_paren_index;
2969 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2970 int legacy_check_result = 0;
2971
2972 /* Skip entirely if there is an opening parenthesis */
2973 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2974 0, text_len, 1);
2975 if (left_paren_index < -1) {
2976 return -1;
2977 }
2978 if (left_paren_index != -1) {
2979 /* Use default error message for any line with an opening paren */
2980 return 0;
2981 }
2982 /* Handle the simple statement case */
2983 legacy_check_result = _check_for_legacy_statements(self, 0);
2984 if (legacy_check_result < 0) {
2985 return -1;
2986
2987 }
2988 if (legacy_check_result == 0) {
2989 /* Handle the one-line complex statement case */
2990 Py_UCS4 colon = 58;
2991 Py_ssize_t colon_index;
2992 colon_index = PyUnicode_FindChar(self->text, colon,
2993 0, text_len, 1);
2994 if (colon_index < -1) {
2995 return -1;
2996 }
2997 if (colon_index >= 0 && colon_index < text_len) {
2998 /* Check again, starting from just after the colon */
2999 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3000 return -1;
3001 }
3002 }
3003 }
3004 return 0;
3005}