blob: 42b3fc7bb1b7236ea7917cd6dbb9c6af867e40f3 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#include "internal/mem.h"
10#include "internal/pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000011#include "structmember.h"
12#include "osdefs.h"
13
Thomas Wouters477c8d52006-05-27 19:21:47 +000014
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020015/* Compatibility aliases */
16PyObject *PyExc_EnvironmentError = NULL;
17PyObject *PyExc_IOError = NULL;
18#ifdef MS_WINDOWS
19PyObject *PyExc_WindowsError = NULL;
20#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020021
22/* The dict map from errno codes to OSError subclasses */
23static PyObject *errnomap = NULL;
24
25
Thomas Wouters477c8d52006-05-27 19:21:47 +000026/* NOTE: If the exception class hierarchy changes, don't forget to update
27 * Lib/test/exception_hierarchy.txt
28 */
29
Thomas Wouters477c8d52006-05-27 19:21:47 +000030/*
31 * BaseException
32 */
33static PyObject *
34BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35{
36 PyBaseExceptionObject *self;
37
38 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000039 if (!self)
40 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000041 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000042 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000043 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070044 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000045
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010046 if (args) {
47 self->args = args;
48 Py_INCREF(args);
49 return (PyObject *)self;
50 }
51
Thomas Wouters477c8d52006-05-27 19:21:47 +000052 self->args = PyTuple_New(0);
53 if (!self->args) {
54 Py_DECREF(self);
55 return NULL;
56 }
57
Thomas Wouters477c8d52006-05-27 19:21:47 +000058 return (PyObject *)self;
59}
60
61static int
62BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
63{
Christian Heimes90aa7642007-12-19 02:45:37 +000064 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000065 return -1;
66
Serhiy Storchaka576f1322016-01-05 21:27:54 +020067 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030068 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000069
Thomas Wouters477c8d52006-05-27 19:21:47 +000070 return 0;
71}
72
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000073static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000074BaseException_clear(PyBaseExceptionObject *self)
75{
76 Py_CLEAR(self->dict);
77 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000078 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000079 Py_CLEAR(self->cause);
80 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000081 return 0;
82}
83
84static void
85BaseException_dealloc(PyBaseExceptionObject *self)
86{
Thomas Wouters89f507f2006-12-13 04:49:30 +000087 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000089 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000090}
91
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000092static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000093BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
94{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000095 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000097 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000098 Py_VISIT(self->cause);
99 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000100 return 0;
101}
102
103static PyObject *
104BaseException_str(PyBaseExceptionObject *self)
105{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000108 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000112 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000113 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114}
115
116static PyObject *
117BaseException_repr(PyBaseExceptionObject *self)
118{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300119 const char *name = _PyType_Name(Py_TYPE(self));
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000120 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000121}
122
123/* Pickling support */
124static PyObject *
125BaseException_reduce(PyBaseExceptionObject *self)
126{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000127 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000128 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000129 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000130 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131}
132
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133/*
134 * Needed for backward compatibility, since exceptions used to store
135 * all their attributes in the __dict__. Code is taken from cPickle's
136 * load_build function.
137 */
138static PyObject *
139BaseException_setstate(PyObject *self, PyObject *state)
140{
141 PyObject *d_key, *d_value;
142 Py_ssize_t i = 0;
143
144 if (state != Py_None) {
145 if (!PyDict_Check(state)) {
146 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
147 return NULL;
148 }
149 while (PyDict_Next(state, &i, &d_key, &d_value)) {
150 if (PyObject_SetAttr(self, d_key, d_value) < 0)
151 return NULL;
152 }
153 }
154 Py_RETURN_NONE;
155}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000156
Collin Winter828f04a2007-08-31 00:04:24 +0000157static PyObject *
158BaseException_with_traceback(PyObject *self, PyObject *tb) {
159 if (PyException_SetTraceback(self, tb))
160 return NULL;
161
162 Py_INCREF(self);
163 return self;
164}
165
Georg Brandl76941002008-05-05 21:38:47 +0000166PyDoc_STRVAR(with_traceback_doc,
167"Exception.with_traceback(tb) --\n\
168 set self.__traceback__ to tb and return self.");
169
Thomas Wouters477c8d52006-05-27 19:21:47 +0000170
171static PyMethodDef BaseException_methods[] = {
172 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000173 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000174 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
175 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000176 {NULL, NULL, 0, NULL},
177};
178
Thomas Wouters477c8d52006-05-27 19:21:47 +0000179static PyObject *
180BaseException_get_args(PyBaseExceptionObject *self)
181{
182 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200183 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000184 }
185 Py_INCREF(self->args);
186 return self->args;
187}
188
189static int
190BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
191{
192 PyObject *seq;
193 if (val == NULL) {
194 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
195 return -1;
196 }
197 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500198 if (!seq)
199 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300200 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000201 return 0;
202}
203
Collin Winter828f04a2007-08-31 00:04:24 +0000204static PyObject *
205BaseException_get_tb(PyBaseExceptionObject *self)
206{
207 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200208 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000209 }
210 Py_INCREF(self->traceback);
211 return self->traceback;
212}
213
214static int
215BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
216{
217 if (tb == NULL) {
218 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
219 return -1;
220 }
221 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
222 PyErr_SetString(PyExc_TypeError,
223 "__traceback__ must be a traceback or None");
224 return -1;
225 }
226
Serhiy Storchaka37665722016-08-20 21:22:03 +0300227 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300228 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000229 return 0;
230}
231
Georg Brandlab6f2f62009-03-31 04:16:10 +0000232static PyObject *
233BaseException_get_context(PyObject *self) {
234 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500235 if (res)
236 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000237 Py_RETURN_NONE;
238}
239
240static int
241BaseException_set_context(PyObject *self, PyObject *arg) {
242 if (arg == NULL) {
243 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
244 return -1;
245 } else if (arg == Py_None) {
246 arg = NULL;
247 } else if (!PyExceptionInstance_Check(arg)) {
248 PyErr_SetString(PyExc_TypeError, "exception context must be None "
249 "or derive from BaseException");
250 return -1;
251 } else {
252 /* PyException_SetContext steals this reference */
253 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000255 PyException_SetContext(self, arg);
256 return 0;
257}
258
259static PyObject *
260BaseException_get_cause(PyObject *self) {
261 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500262 if (res)
263 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700264 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000265}
266
267static int
268BaseException_set_cause(PyObject *self, PyObject *arg) {
269 if (arg == NULL) {
270 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
271 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700272 } else if (arg == Py_None) {
273 arg = NULL;
274 } else if (!PyExceptionInstance_Check(arg)) {
275 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
276 "or derive from BaseException");
277 return -1;
278 } else {
279 /* PyException_SetCause steals this reference */
280 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700282 PyException_SetCause(self, arg);
283 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000284}
285
Guido van Rossum360e4b82007-05-14 22:51:27 +0000286
Thomas Wouters477c8d52006-05-27 19:21:47 +0000287static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500288 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000289 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000290 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000291 {"__context__", (getter)BaseException_get_context,
292 (setter)BaseException_set_context, PyDoc_STR("exception context")},
293 {"__cause__", (getter)BaseException_get_cause,
294 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295 {NULL},
296};
297
298
Collin Winter828f04a2007-08-31 00:04:24 +0000299PyObject *
300PyException_GetTraceback(PyObject *self) {
301 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
302 Py_XINCREF(base_self->traceback);
303 return base_self->traceback;
304}
305
306
307int
308PyException_SetTraceback(PyObject *self, PyObject *tb) {
309 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
310}
311
312PyObject *
313PyException_GetCause(PyObject *self) {
314 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
315 Py_XINCREF(cause);
316 return cause;
317}
318
319/* Steals a reference to cause */
320void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200321PyException_SetCause(PyObject *self, PyObject *cause)
322{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700323 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300324 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000325}
326
327PyObject *
328PyException_GetContext(PyObject *self) {
329 PyObject *context = ((PyBaseExceptionObject *)self)->context;
330 Py_XINCREF(context);
331 return context;
332}
333
334/* Steals a reference to context */
335void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200336PyException_SetContext(PyObject *self, PyObject *context)
337{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300338 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000339}
340
341
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700342static struct PyMemberDef BaseException_members[] = {
343 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200344 offsetof(PyBaseExceptionObject, suppress_context)},
345 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700346};
347
348
Thomas Wouters477c8d52006-05-27 19:21:47 +0000349static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000350 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000351 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000352 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
353 0, /*tp_itemsize*/
354 (destructor)BaseException_dealloc, /*tp_dealloc*/
355 0, /*tp_print*/
356 0, /*tp_getattr*/
357 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000358 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000359 (reprfunc)BaseException_repr, /*tp_repr*/
360 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000361 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000362 0, /*tp_as_mapping*/
363 0, /*tp_hash */
364 0, /*tp_call*/
365 (reprfunc)BaseException_str, /*tp_str*/
366 PyObject_GenericGetAttr, /*tp_getattro*/
367 PyObject_GenericSetAttr, /*tp_setattro*/
368 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000369 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000371 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
372 (traverseproc)BaseException_traverse, /* tp_traverse */
373 (inquiry)BaseException_clear, /* tp_clear */
374 0, /* tp_richcompare */
375 0, /* tp_weaklistoffset */
376 0, /* tp_iter */
377 0, /* tp_iternext */
378 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700379 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000380 BaseException_getset, /* tp_getset */
381 0, /* tp_base */
382 0, /* tp_dict */
383 0, /* tp_descr_get */
384 0, /* tp_descr_set */
385 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
386 (initproc)BaseException_init, /* tp_init */
387 0, /* tp_alloc */
388 BaseException_new, /* tp_new */
389};
390/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
391from the previous implmentation and also allowing Python objects to be used
392in the API */
393PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
394
395/* note these macros omit the last semicolon so the macro invocation may
396 * include it and not look strange.
397 */
398#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
399static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000400 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000401 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000402 sizeof(PyBaseExceptionObject), \
403 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
404 0, 0, 0, 0, 0, 0, 0, \
405 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
406 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
407 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
408 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
409 (initproc)BaseException_init, 0, BaseException_new,\
410}; \
411PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
412
413#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
414static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000415 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000416 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000417 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000418 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419 0, 0, 0, 0, 0, \
420 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000421 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
422 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200424 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425}; \
426PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
427
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200428#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
429 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
430 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000432 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000433 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000434 sizeof(Py ## EXCSTORE ## Object), 0, \
435 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
436 (reprfunc)EXCSTR, 0, 0, 0, \
437 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
438 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
439 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200440 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000441 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200442 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000443}; \
444PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
445
446
447/*
448 * Exception extends BaseException
449 */
450SimpleExtendsException(PyExc_BaseException, Exception,
451 "Common base class for all non-exit exceptions.");
452
453
454/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000455 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000456 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000457SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000458 "Inappropriate argument type.");
459
460
461/*
Yury Selivanov75445082015-05-11 22:57:16 -0400462 * StopAsyncIteration extends Exception
463 */
464SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
465 "Signal the end from iterator.__anext__().");
466
467
468/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469 * StopIteration extends Exception
470 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000471
472static PyMemberDef StopIteration_members[] = {
473 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
474 PyDoc_STR("generator return value")},
475 {NULL} /* Sentinel */
476};
477
478static int
479StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
480{
481 Py_ssize_t size = PyTuple_GET_SIZE(args);
482 PyObject *value;
483
484 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
485 return -1;
486 Py_CLEAR(self->value);
487 if (size > 0)
488 value = PyTuple_GET_ITEM(args, 0);
489 else
490 value = Py_None;
491 Py_INCREF(value);
492 self->value = value;
493 return 0;
494}
495
496static int
497StopIteration_clear(PyStopIterationObject *self)
498{
499 Py_CLEAR(self->value);
500 return BaseException_clear((PyBaseExceptionObject *)self);
501}
502
503static void
504StopIteration_dealloc(PyStopIterationObject *self)
505{
506 _PyObject_GC_UNTRACK(self);
507 StopIteration_clear(self);
508 Py_TYPE(self)->tp_free((PyObject *)self);
509}
510
511static int
512StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
513{
514 Py_VISIT(self->value);
515 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
516}
517
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000518ComplexExtendsException(
519 PyExc_Exception, /* base */
520 StopIteration, /* name */
521 StopIteration, /* prefix for *_init, etc */
522 0, /* new */
523 0, /* methods */
524 StopIteration_members, /* members */
525 0, /* getset */
526 0, /* str */
527 "Signal the end from iterator.__next__()."
528);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000529
530
531/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000532 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000534SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000535 "Request that a generator exit.");
536
537
538/*
539 * SystemExit extends BaseException
540 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541
542static int
543SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
544{
545 Py_ssize_t size = PyTuple_GET_SIZE(args);
546
547 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
548 return -1;
549
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000550 if (size == 0)
551 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200552 if (size == 1) {
553 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300554 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200555 }
556 else { /* size > 1 */
557 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300558 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200559 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560 return 0;
561}
562
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000563static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000564SystemExit_clear(PySystemExitObject *self)
565{
566 Py_CLEAR(self->code);
567 return BaseException_clear((PyBaseExceptionObject *)self);
568}
569
570static void
571SystemExit_dealloc(PySystemExitObject *self)
572{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000573 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000574 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000575 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000576}
577
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000578static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000579SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
580{
581 Py_VISIT(self->code);
582 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
583}
584
585static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000586 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
587 PyDoc_STR("exception code")},
588 {NULL} /* Sentinel */
589};
590
591ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200592 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000593 "Request to exit from the interpreter.");
594
595/*
596 * KeyboardInterrupt extends BaseException
597 */
598SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
599 "Program interrupted by user.");
600
601
602/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000603 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000604 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605
Brett Cannon79ec55e2012-04-12 20:24:54 -0400606static int
607ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
608{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300609 static char *kwlist[] = {"name", "path", 0};
610 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400611 PyObject *msg = NULL;
612 PyObject *name = NULL;
613 PyObject *path = NULL;
614
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300615 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400616 return -1;
617
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300618 empty_tuple = PyTuple_New(0);
619 if (!empty_tuple)
620 return -1;
621 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
622 &name, &path)) {
623 Py_DECREF(empty_tuple);
624 return -1;
625 }
626 Py_DECREF(empty_tuple);
627
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300628 Py_XINCREF(name);
629 Py_XSETREF(self->name, name);
630
631 Py_XINCREF(path);
632 Py_XSETREF(self->path, path);
633
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300634 if (PyTuple_GET_SIZE(args) == 1) {
635 msg = PyTuple_GET_ITEM(args, 0);
636 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300637 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300638 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400639
640 return 0;
641}
642
643static int
644ImportError_clear(PyImportErrorObject *self)
645{
646 Py_CLEAR(self->msg);
647 Py_CLEAR(self->name);
648 Py_CLEAR(self->path);
649 return BaseException_clear((PyBaseExceptionObject *)self);
650}
651
652static void
653ImportError_dealloc(PyImportErrorObject *self)
654{
655 _PyObject_GC_UNTRACK(self);
656 ImportError_clear(self);
657 Py_TYPE(self)->tp_free((PyObject *)self);
658}
659
660static int
661ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
662{
663 Py_VISIT(self->msg);
664 Py_VISIT(self->name);
665 Py_VISIT(self->path);
666 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
667}
668
669static PyObject *
670ImportError_str(PyImportErrorObject *self)
671{
Brett Cannon07c6e712012-08-24 13:05:09 -0400672 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400673 Py_INCREF(self->msg);
674 return self->msg;
675 }
676 else {
677 return BaseException_str((PyBaseExceptionObject *)self);
678 }
679}
680
Serhiy Storchakab7853962017-04-08 09:55:07 +0300681static PyObject *
682ImportError_getstate(PyImportErrorObject *self)
683{
684 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
685 if (self->name || self->path) {
686 _Py_IDENTIFIER(name);
687 _Py_IDENTIFIER(path);
688 dict = dict ? PyDict_Copy(dict) : PyDict_New();
689 if (dict == NULL)
690 return NULL;
691 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
692 Py_DECREF(dict);
693 return NULL;
694 }
695 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
696 Py_DECREF(dict);
697 return NULL;
698 }
699 return dict;
700 }
701 else if (dict) {
702 Py_INCREF(dict);
703 return dict;
704 }
705 else {
706 Py_RETURN_NONE;
707 }
708}
709
710/* Pickling support */
711static PyObject *
712ImportError_reduce(PyImportErrorObject *self)
713{
714 PyObject *res;
715 PyObject *args;
716 PyObject *state = ImportError_getstate(self);
717 if (state == NULL)
718 return NULL;
719 args = ((PyBaseExceptionObject *)self)->args;
720 if (state == Py_None)
721 res = PyTuple_Pack(2, Py_TYPE(self), args);
722 else
723 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
724 Py_DECREF(state);
725 return res;
726}
727
Brett Cannon79ec55e2012-04-12 20:24:54 -0400728static PyMemberDef ImportError_members[] = {
729 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
730 PyDoc_STR("exception message")},
731 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
732 PyDoc_STR("module name")},
733 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
734 PyDoc_STR("module path")},
735 {NULL} /* Sentinel */
736};
737
738static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300739 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400740 {NULL}
741};
742
743ComplexExtendsException(PyExc_Exception, ImportError,
744 ImportError, 0 /* new */,
745 ImportError_methods, ImportError_members,
746 0 /* getset */, ImportError_str,
747 "Import can't find module, or can't find name in "
748 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000749
750/*
Eric Snowc9432652016-09-07 15:42:32 -0700751 * ModuleNotFoundError extends ImportError
752 */
753
754MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
755 "Module not found.");
756
757/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200758 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759 */
760
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200761#ifdef MS_WINDOWS
762#include "errmap.h"
763#endif
764
Thomas Wouters477c8d52006-05-27 19:21:47 +0000765/* Where a function has a single filename, such as open() or some
766 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
767 * called, giving a third argument which is the filename. But, so
768 * that old code using in-place unpacking doesn't break, e.g.:
769 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200770 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000771 *
772 * we hack args so that it only contains two items. This also
773 * means we need our own __str__() which prints out the filename
774 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800775 *
776 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800777 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
778 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000779 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200780
Antoine Pitroue0e27352011-12-15 14:31:28 +0100781/* This function doesn't cleanup on error, the caller should */
782static int
783oserror_parse_args(PyObject **p_args,
784 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800785 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200786#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100787 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200788#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100789 )
790{
791 Py_ssize_t nargs;
792 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800793#ifndef MS_WINDOWS
794 /*
795 * ignored on non-Windows platforms,
796 * but parsed so OSError has a consistent signature
797 */
798 PyObject *_winerror = NULL;
799 PyObject **winerror = &_winerror;
800#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000801
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200802 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000803
Larry Hastingsb0827312014-02-09 22:05:19 -0800804 if (nargs >= 2 && nargs <= 5) {
805 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
806 myerrno, strerror,
807 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100808 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800809#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100810 if (*winerror && PyLong_Check(*winerror)) {
811 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200812 PyObject *newargs;
813 Py_ssize_t i;
814
Antoine Pitroue0e27352011-12-15 14:31:28 +0100815 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100817 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 /* Set errno to the corresponding POSIX errno (overriding
819 first argument). Windows Socket error codes (>= 10000)
820 have the same value as their POSIX counterparts.
821 */
822 if (winerrcode < 10000)
823 errcode = winerror_to_errno(winerrcode);
824 else
825 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100826 *myerrno = PyLong_FromLong(errcode);
827 if (!*myerrno)
828 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200829 newargs = PyTuple_New(nargs);
830 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100831 return -1;
832 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200833 for (i = 1; i < nargs; i++) {
834 PyObject *val = PyTuple_GET_ITEM(args, i);
835 Py_INCREF(val);
836 PyTuple_SET_ITEM(newargs, i, val);
837 }
838 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100839 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200840 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800841#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200842 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000843
Antoine Pitroue0e27352011-12-15 14:31:28 +0100844 return 0;
845}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846
Antoine Pitroue0e27352011-12-15 14:31:28 +0100847static int
848oserror_init(PyOSErrorObject *self, PyObject **p_args,
849 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800850 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100851#ifdef MS_WINDOWS
852 , PyObject *winerror
853#endif
854 )
855{
856 PyObject *args = *p_args;
857 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000858
859 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200860 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100861 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200862 PyNumber_Check(filename)) {
863 /* BlockingIOError's 3rd argument can be the number of
864 * characters written.
865 */
866 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
867 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100868 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200869 }
870 else {
871 Py_INCREF(filename);
872 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000873
Larry Hastingsb0827312014-02-09 22:05:19 -0800874 if (filename2 && filename2 != Py_None) {
875 Py_INCREF(filename2);
876 self->filename2 = filename2;
877 }
878
879 if (nargs >= 2 && nargs <= 5) {
880 /* filename, filename2, and winerror are removed from the args tuple
881 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100882 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200883 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100884 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000885
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200886 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100887 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200888 }
889 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 Py_XINCREF(myerrno);
892 self->myerrno = myerrno;
893
894 Py_XINCREF(strerror);
895 self->strerror = strerror;
896
897#ifdef MS_WINDOWS
898 Py_XINCREF(winerror);
899 self->winerror = winerror;
900#endif
901
Antoine Pitroue0e27352011-12-15 14:31:28 +0100902 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300903 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100904 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100905
906 return 0;
907}
908
909static PyObject *
910OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
911static int
912OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
913
914static int
915oserror_use_init(PyTypeObject *type)
916{
Martin Panter7462b6492015-11-02 03:37:02 +0000917 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100918 extraneous argument to __new__ to be ignored. The only reasonable
919 solution, given __new__ takes a variable number of arguments,
920 is to defer arg parsing and initialization to __init__.
921
Martin Pantere26da7c2016-06-02 10:07:09 +0000922 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100923 with the right arguments.
924
925 (see http://bugs.python.org/issue12555#msg148829 )
926 */
927 if (type->tp_init != (initproc) OSError_init &&
928 type->tp_new == (newfunc) OSError_new) {
929 assert((PyObject *) type != PyExc_OSError);
930 return 1;
931 }
932 return 0;
933}
934
935static PyObject *
936OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
937{
938 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800939 PyObject *myerrno = NULL, *strerror = NULL;
940 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100941#ifdef MS_WINDOWS
942 PyObject *winerror = NULL;
943#endif
944
Victor Stinner46ef3192013-11-14 22:31:41 +0100945 Py_INCREF(args);
946
Antoine Pitroue0e27352011-12-15 14:31:28 +0100947 if (!oserror_use_init(type)) {
948 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100949 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100950
Larry Hastingsb0827312014-02-09 22:05:19 -0800951 if (oserror_parse_args(&args, &myerrno, &strerror,
952 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100953#ifdef MS_WINDOWS
954 , &winerror
955#endif
956 ))
957 goto error;
958
959 if (myerrno && PyLong_Check(myerrno) &&
960 errnomap && (PyObject *) type == PyExc_OSError) {
961 PyObject *newtype;
962 newtype = PyDict_GetItem(errnomap, myerrno);
963 if (newtype) {
964 assert(PyType_Check(newtype));
965 type = (PyTypeObject *) newtype;
966 }
967 else if (PyErr_Occurred())
968 goto error;
969 }
970 }
971
972 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
973 if (!self)
974 goto error;
975
976 self->dict = NULL;
977 self->traceback = self->cause = self->context = NULL;
978 self->written = -1;
979
980 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800981 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100982#ifdef MS_WINDOWS
983 , winerror
984#endif
985 ))
986 goto error;
987 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200988 else {
989 self->args = PyTuple_New(0);
990 if (self->args == NULL)
991 goto error;
992 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100993
Victor Stinner46ef3192013-11-14 22:31:41 +0100994 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200995 return (PyObject *) self;
996
997error:
998 Py_XDECREF(args);
999 Py_XDECREF(self);
1000 return NULL;
1001}
1002
1003static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001004OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001005{
Larry Hastingsb0827312014-02-09 22:05:19 -08001006 PyObject *myerrno = NULL, *strerror = NULL;
1007 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001008#ifdef MS_WINDOWS
1009 PyObject *winerror = NULL;
1010#endif
1011
1012 if (!oserror_use_init(Py_TYPE(self)))
1013 /* Everything already done in OSError_new */
1014 return 0;
1015
1016 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1017 return -1;
1018
1019 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001020 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001021#ifdef MS_WINDOWS
1022 , &winerror
1023#endif
1024 ))
1025 goto error;
1026
Larry Hastingsb0827312014-02-09 22:05:19 -08001027 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001028#ifdef MS_WINDOWS
1029 , winerror
1030#endif
1031 ))
1032 goto error;
1033
Thomas Wouters477c8d52006-05-27 19:21:47 +00001034 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001035
1036error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001037 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001038 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001039}
1040
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001041static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001042OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043{
1044 Py_CLEAR(self->myerrno);
1045 Py_CLEAR(self->strerror);
1046 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001047 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001048#ifdef MS_WINDOWS
1049 Py_CLEAR(self->winerror);
1050#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051 return BaseException_clear((PyBaseExceptionObject *)self);
1052}
1053
1054static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001055OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001058 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001059 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060}
1061
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001062static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001063OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064 void *arg)
1065{
1066 Py_VISIT(self->myerrno);
1067 Py_VISIT(self->strerror);
1068 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001069 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001070#ifdef MS_WINDOWS
1071 Py_VISIT(self->winerror);
1072#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1074}
1075
1076static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001077OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001078{
Larry Hastingsb0827312014-02-09 22:05:19 -08001079#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080#ifdef MS_WINDOWS
1081 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001082 if (self->winerror && self->filename) {
1083 if (self->filename2) {
1084 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1085 OR_NONE(self->winerror),
1086 OR_NONE(self->strerror),
1087 self->filename,
1088 self->filename2);
1089 } else {
1090 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1091 OR_NONE(self->winerror),
1092 OR_NONE(self->strerror),
1093 self->filename);
1094 }
1095 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001096 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001097 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001098 self->winerror ? self->winerror: Py_None,
1099 self->strerror ? self->strerror: Py_None);
1100#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001101 if (self->filename) {
1102 if (self->filename2) {
1103 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1104 OR_NONE(self->myerrno),
1105 OR_NONE(self->strerror),
1106 self->filename,
1107 self->filename2);
1108 } else {
1109 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1110 OR_NONE(self->myerrno),
1111 OR_NONE(self->strerror),
1112 self->filename);
1113 }
1114 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001115 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001116 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001117 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001118 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001119}
1120
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001122OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001123{
1124 PyObject *args = self->args;
1125 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001126
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001128 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001129 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001130 Py_ssize_t size = self->filename2 ? 5 : 3;
1131 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001132 if (!args)
1133 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134
1135 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001136 Py_INCREF(tmp);
1137 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001138
1139 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001140 Py_INCREF(tmp);
1141 PyTuple_SET_ITEM(args, 1, tmp);
1142
1143 Py_INCREF(self->filename);
1144 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001145
1146 if (self->filename2) {
1147 /*
1148 * This tuple is essentially used as OSError(*args).
1149 * So, to recreate filename2, we need to pass in
1150 * winerror as well.
1151 */
1152 Py_INCREF(Py_None);
1153 PyTuple_SET_ITEM(args, 3, Py_None);
1154
1155 /* filename2 */
1156 Py_INCREF(self->filename2);
1157 PyTuple_SET_ITEM(args, 4, self->filename2);
1158 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001159 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001160 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001161
1162 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001163 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001164 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001165 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 Py_DECREF(args);
1167 return res;
1168}
1169
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001170static PyObject *
1171OSError_written_get(PyOSErrorObject *self, void *context)
1172{
1173 if (self->written == -1) {
1174 PyErr_SetString(PyExc_AttributeError, "characters_written");
1175 return NULL;
1176 }
1177 return PyLong_FromSsize_t(self->written);
1178}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001179
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001180static int
1181OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1182{
1183 Py_ssize_t n;
1184 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1185 if (n == -1 && PyErr_Occurred())
1186 return -1;
1187 self->written = n;
1188 return 0;
1189}
1190
1191static PyMemberDef OSError_members[] = {
1192 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1193 PyDoc_STR("POSIX exception code")},
1194 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1195 PyDoc_STR("exception strerror")},
1196 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1197 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001198 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1199 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001200#ifdef MS_WINDOWS
1201 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1202 PyDoc_STR("Win32 exception code")},
1203#endif
1204 {NULL} /* Sentinel */
1205};
1206
1207static PyMethodDef OSError_methods[] = {
1208 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001209 {NULL}
1210};
1211
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001212static PyGetSetDef OSError_getset[] = {
1213 {"characters_written", (getter) OSError_written_get,
1214 (setter) OSError_written_set, NULL},
1215 {NULL}
1216};
1217
1218
1219ComplexExtendsException(PyExc_Exception, OSError,
1220 OSError, OSError_new,
1221 OSError_methods, OSError_members, OSError_getset,
1222 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223 "Base class for I/O related errors.");
1224
1225
1226/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001227 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001228 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001229MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1230 "I/O operation would block.");
1231MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1232 "Connection error.");
1233MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1234 "Child process error.");
1235MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1236 "Broken pipe.");
1237MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1238 "Connection aborted.");
1239MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1240 "Connection refused.");
1241MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1242 "Connection reset.");
1243MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1244 "File already exists.");
1245MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1246 "File not found.");
1247MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1248 "Operation doesn't work on directories.");
1249MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1250 "Operation only works on directories.");
1251MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1252 "Interrupted by signal.");
1253MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1254 "Not enough permissions.");
1255MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1256 "Process not found.");
1257MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1258 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259
1260/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001261 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001262 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001263SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264 "Read beyond end of file.");
1265
1266
1267/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001268 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001269 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001270SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001271 "Unspecified run-time error.");
1272
Yury Selivanovf488fb42015-07-03 01:04:23 -04001273/*
1274 * RecursionError extends RuntimeError
1275 */
1276SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1277 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001278
1279/*
1280 * NotImplementedError extends RuntimeError
1281 */
1282SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1283 "Method or function hasn't been implemented yet.");
1284
1285/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001286 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001287 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001288SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289 "Name not found globally.");
1290
1291/*
1292 * UnboundLocalError extends NameError
1293 */
1294SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1295 "Local name referenced but not bound to a value.");
1296
1297/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001298 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001299 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001300SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301 "Attribute not found.");
1302
1303
1304/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001305 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001306 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001307
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001308/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001309static int _report_missing_parentheses(PySyntaxErrorObject *self);
1310
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311static int
1312SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1313{
1314 PyObject *info = NULL;
1315 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1316
1317 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1318 return -1;
1319
1320 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001321 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001322 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001323 }
1324 if (lenargs == 2) {
1325 info = PyTuple_GET_ITEM(args, 1);
1326 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001327 if (!info)
1328 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001329
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001330 if (PyTuple_GET_SIZE(info) != 4) {
1331 /* not a very good error message, but it's what Python 2.4 gives */
1332 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1333 Py_DECREF(info);
1334 return -1;
1335 }
1336
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001337 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001338 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001340 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001341 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001342
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001343 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001344 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001345
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001346 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001347 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001348
1349 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001350
Martijn Pieters772d8092017-08-22 21:16:23 +01001351 /*
1352 * Issue #21669: Custom error for 'print' & 'exec' as statements
1353 *
1354 * Only applies to SyntaxError instances, not to subclasses such
1355 * as TabError or IndentationError (see issue #31161)
1356 */
1357 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1358 self->text && PyUnicode_Check(self->text) &&
1359 _report_missing_parentheses(self) < 0) {
1360 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001361 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001362 }
1363 return 0;
1364}
1365
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001366static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001367SyntaxError_clear(PySyntaxErrorObject *self)
1368{
1369 Py_CLEAR(self->msg);
1370 Py_CLEAR(self->filename);
1371 Py_CLEAR(self->lineno);
1372 Py_CLEAR(self->offset);
1373 Py_CLEAR(self->text);
1374 Py_CLEAR(self->print_file_and_line);
1375 return BaseException_clear((PyBaseExceptionObject *)self);
1376}
1377
1378static void
1379SyntaxError_dealloc(PySyntaxErrorObject *self)
1380{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001383 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001384}
1385
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001386static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1388{
1389 Py_VISIT(self->msg);
1390 Py_VISIT(self->filename);
1391 Py_VISIT(self->lineno);
1392 Py_VISIT(self->offset);
1393 Py_VISIT(self->text);
1394 Py_VISIT(self->print_file_and_line);
1395 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1396}
1397
1398/* This is called "my_basename" instead of just "basename" to avoid name
1399 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1400 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001401static PyObject*
1402my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001403{
Victor Stinner6237daf2010-04-28 17:26:19 +00001404 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001405 int kind;
1406 void *data;
1407
1408 if (PyUnicode_READY(name))
1409 return NULL;
1410 kind = PyUnicode_KIND(name);
1411 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001412 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001413 offset = 0;
1414 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001415 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001416 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001417 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001418 if (offset != 0)
1419 return PyUnicode_Substring(name, offset, size);
1420 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001421 Py_INCREF(name);
1422 return name;
1423 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001424}
1425
1426
1427static PyObject *
1428SyntaxError_str(PySyntaxErrorObject *self)
1429{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001430 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001431 PyObject *filename;
1432 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001433 /* Below, we always ignore overflow errors, just printing -1.
1434 Still, we cannot allow an OverflowError to be raised, so
1435 we need to call PyLong_AsLongAndOverflow. */
1436 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001437
1438 /* XXX -- do all the additional formatting with filename and
1439 lineno here */
1440
Neal Norwitzed2b7392007-08-26 04:51:10 +00001441 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001442 filename = my_basename(self->filename);
1443 if (filename == NULL)
1444 return NULL;
1445 } else {
1446 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001447 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001448 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001449
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001450 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001451 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001453 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001454 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001455 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001456 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001458 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001459 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001460 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001461 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001462 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001463 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001464 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001465 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001466 Py_XDECREF(filename);
1467 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001468}
1469
1470static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001471 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1472 PyDoc_STR("exception msg")},
1473 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1474 PyDoc_STR("exception filename")},
1475 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1476 PyDoc_STR("exception lineno")},
1477 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1478 PyDoc_STR("exception offset")},
1479 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1480 PyDoc_STR("exception text")},
1481 {"print_file_and_line", T_OBJECT,
1482 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1483 PyDoc_STR("exception print_file_and_line")},
1484 {NULL} /* Sentinel */
1485};
1486
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001487ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001488 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001489 SyntaxError_str, "Invalid syntax.");
1490
1491
1492/*
1493 * IndentationError extends SyntaxError
1494 */
1495MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1496 "Improper indentation.");
1497
1498
1499/*
1500 * TabError extends IndentationError
1501 */
1502MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1503 "Improper mixture of spaces and tabs.");
1504
1505
1506/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001507 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001508 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001509SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001510 "Base class for lookup errors.");
1511
1512
1513/*
1514 * IndexError extends LookupError
1515 */
1516SimpleExtendsException(PyExc_LookupError, IndexError,
1517 "Sequence index out of range.");
1518
1519
1520/*
1521 * KeyError extends LookupError
1522 */
1523static PyObject *
1524KeyError_str(PyBaseExceptionObject *self)
1525{
1526 /* If args is a tuple of exactly one item, apply repr to args[0].
1527 This is done so that e.g. the exception raised by {}[''] prints
1528 KeyError: ''
1529 rather than the confusing
1530 KeyError
1531 alone. The downside is that if KeyError is raised with an explanatory
1532 string, that string will be displayed in quotes. Too bad.
1533 If args is anything else, use the default BaseException__str__().
1534 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001535 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001536 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001537 }
1538 return BaseException_str(self);
1539}
1540
1541ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001542 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001543
1544
1545/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001546 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001547 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001548SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549 "Inappropriate argument value (of correct type).");
1550
1551/*
1552 * UnicodeError extends ValueError
1553 */
1554
1555SimpleExtendsException(PyExc_ValueError, UnicodeError,
1556 "Unicode related error.");
1557
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001559get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001560{
1561 if (!attr) {
1562 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1563 return NULL;
1564 }
1565
Christian Heimes72b710a2008-05-26 13:28:38 +00001566 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001567 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1568 return NULL;
1569 }
1570 Py_INCREF(attr);
1571 return attr;
1572}
1573
1574static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001575get_unicode(PyObject *attr, const char *name)
1576{
1577 if (!attr) {
1578 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1579 return NULL;
1580 }
1581
1582 if (!PyUnicode_Check(attr)) {
1583 PyErr_Format(PyExc_TypeError,
1584 "%.200s attribute must be unicode", name);
1585 return NULL;
1586 }
1587 Py_INCREF(attr);
1588 return attr;
1589}
1590
Walter Dörwaldd2034312007-05-18 16:29:38 +00001591static int
1592set_unicodefromstring(PyObject **attr, const char *value)
1593{
1594 PyObject *obj = PyUnicode_FromString(value);
1595 if (!obj)
1596 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001597 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001598 return 0;
1599}
1600
Thomas Wouters477c8d52006-05-27 19:21:47 +00001601PyObject *
1602PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1603{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001604 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001605}
1606
1607PyObject *
1608PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1609{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001610 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611}
1612
1613PyObject *
1614PyUnicodeEncodeError_GetObject(PyObject *exc)
1615{
1616 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1617}
1618
1619PyObject *
1620PyUnicodeDecodeError_GetObject(PyObject *exc)
1621{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001622 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001623}
1624
1625PyObject *
1626PyUnicodeTranslateError_GetObject(PyObject *exc)
1627{
1628 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1629}
1630
1631int
1632PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1633{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001634 Py_ssize_t size;
1635 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1636 "object");
1637 if (!obj)
1638 return -1;
1639 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001640 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001641 if (*start<0)
1642 *start = 0; /*XXX check for values <0*/
1643 if (*start>=size)
1644 *start = size-1;
1645 Py_DECREF(obj);
1646 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001647}
1648
1649
1650int
1651PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1652{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001653 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001654 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001655 if (!obj)
1656 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001657 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001658 *start = ((PyUnicodeErrorObject *)exc)->start;
1659 if (*start<0)
1660 *start = 0;
1661 if (*start>=size)
1662 *start = size-1;
1663 Py_DECREF(obj);
1664 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001665}
1666
1667
1668int
1669PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1670{
1671 return PyUnicodeEncodeError_GetStart(exc, start);
1672}
1673
1674
1675int
1676PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1677{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001678 ((PyUnicodeErrorObject *)exc)->start = start;
1679 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001680}
1681
1682
1683int
1684PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1685{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001686 ((PyUnicodeErrorObject *)exc)->start = start;
1687 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001688}
1689
1690
1691int
1692PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1693{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001694 ((PyUnicodeErrorObject *)exc)->start = start;
1695 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001696}
1697
1698
1699int
1700PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1701{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001702 Py_ssize_t size;
1703 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1704 "object");
1705 if (!obj)
1706 return -1;
1707 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001708 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001709 if (*end<1)
1710 *end = 1;
1711 if (*end>size)
1712 *end = size;
1713 Py_DECREF(obj);
1714 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001715}
1716
1717
1718int
1719PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1720{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001721 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001722 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001723 if (!obj)
1724 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001725 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001726 *end = ((PyUnicodeErrorObject *)exc)->end;
1727 if (*end<1)
1728 *end = 1;
1729 if (*end>size)
1730 *end = size;
1731 Py_DECREF(obj);
1732 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001733}
1734
1735
1736int
1737PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1738{
1739 return PyUnicodeEncodeError_GetEnd(exc, start);
1740}
1741
1742
1743int
1744PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1745{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001746 ((PyUnicodeErrorObject *)exc)->end = end;
1747 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001748}
1749
1750
1751int
1752PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1753{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001754 ((PyUnicodeErrorObject *)exc)->end = end;
1755 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001756}
1757
1758
1759int
1760PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1761{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001762 ((PyUnicodeErrorObject *)exc)->end = end;
1763 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001764}
1765
1766PyObject *
1767PyUnicodeEncodeError_GetReason(PyObject *exc)
1768{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001769 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001770}
1771
1772
1773PyObject *
1774PyUnicodeDecodeError_GetReason(PyObject *exc)
1775{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001776 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777}
1778
1779
1780PyObject *
1781PyUnicodeTranslateError_GetReason(PyObject *exc)
1782{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001783 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001784}
1785
1786
1787int
1788PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1789{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001790 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1791 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001792}
1793
1794
1795int
1796PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1797{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001798 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1799 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800}
1801
1802
1803int
1804PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1805{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001806 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1807 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808}
1809
1810
Thomas Wouters477c8d52006-05-27 19:21:47 +00001811static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812UnicodeError_clear(PyUnicodeErrorObject *self)
1813{
1814 Py_CLEAR(self->encoding);
1815 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816 Py_CLEAR(self->reason);
1817 return BaseException_clear((PyBaseExceptionObject *)self);
1818}
1819
1820static void
1821UnicodeError_dealloc(PyUnicodeErrorObject *self)
1822{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001823 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001825 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001826}
1827
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001828static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1830{
1831 Py_VISIT(self->encoding);
1832 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833 Py_VISIT(self->reason);
1834 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1835}
1836
1837static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1839 PyDoc_STR("exception encoding")},
1840 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1841 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001842 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001843 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001844 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845 PyDoc_STR("exception end")},
1846 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1847 PyDoc_STR("exception reason")},
1848 {NULL} /* Sentinel */
1849};
1850
1851
1852/*
1853 * UnicodeEncodeError extends UnicodeError
1854 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001855
1856static int
1857UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1858{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001859 PyUnicodeErrorObject *err;
1860
Thomas Wouters477c8d52006-05-27 19:21:47 +00001861 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1862 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001863
1864 err = (PyUnicodeErrorObject *)self;
1865
1866 Py_CLEAR(err->encoding);
1867 Py_CLEAR(err->object);
1868 Py_CLEAR(err->reason);
1869
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001870 if (!PyArg_ParseTuple(args, "UUnnU",
1871 &err->encoding, &err->object,
1872 &err->start, &err->end, &err->reason)) {
1873 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001874 return -1;
1875 }
1876
Guido van Rossum98297ee2007-11-06 21:34:58 +00001877 Py_INCREF(err->encoding);
1878 Py_INCREF(err->object);
1879 Py_INCREF(err->reason);
1880
1881 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001882}
1883
1884static PyObject *
1885UnicodeEncodeError_str(PyObject *self)
1886{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001887 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001888 PyObject *result = NULL;
1889 PyObject *reason_str = NULL;
1890 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001891
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001892 if (!uself->object)
1893 /* Not properly initialized. */
1894 return PyUnicode_FromString("");
1895
Eric Smith0facd772010-02-24 15:42:29 +00001896 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001897 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001898 reason_str = PyObject_Str(uself->reason);
1899 if (reason_str == NULL)
1900 goto done;
1901 encoding_str = PyObject_Str(uself->encoding);
1902 if (encoding_str == NULL)
1903 goto done;
1904
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001905 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1906 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001907 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001908 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001909 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001910 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001911 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001912 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001913 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001914 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001915 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001916 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001917 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001918 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001919 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001920 }
Eric Smith0facd772010-02-24 15:42:29 +00001921 else {
1922 result = PyUnicode_FromFormat(
1923 "'%U' codec can't encode characters in position %zd-%zd: %U",
1924 encoding_str,
1925 uself->start,
1926 uself->end-1,
1927 reason_str);
1928 }
1929done:
1930 Py_XDECREF(reason_str);
1931 Py_XDECREF(encoding_str);
1932 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001933}
1934
1935static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001936 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001937 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001938 sizeof(PyUnicodeErrorObject), 0,
1939 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1940 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1941 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001942 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1943 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001945 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001946};
1947PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1948
1949PyObject *
1950PyUnicodeEncodeError_Create(
1951 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1952 Py_ssize_t start, Py_ssize_t end, const char *reason)
1953{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001954 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001955 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001956}
1957
1958
1959/*
1960 * UnicodeDecodeError extends UnicodeError
1961 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962
1963static int
1964UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1965{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001966 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001967
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1969 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001970
1971 ude = (PyUnicodeErrorObject *)self;
1972
1973 Py_CLEAR(ude->encoding);
1974 Py_CLEAR(ude->object);
1975 Py_CLEAR(ude->reason);
1976
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001977 if (!PyArg_ParseTuple(args, "UOnnU",
1978 &ude->encoding, &ude->object,
1979 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001980 ude->encoding = ude->object = ude->reason = NULL;
1981 return -1;
1982 }
1983
Guido van Rossum98297ee2007-11-06 21:34:58 +00001984 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001985 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001986 Py_INCREF(ude->reason);
1987
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001988 if (!PyBytes_Check(ude->object)) {
1989 Py_buffer view;
1990 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1991 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001992 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001993 PyBuffer_Release(&view);
1994 if (!ude->object)
1995 goto error;
1996 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001997 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001998
1999error:
2000 Py_CLEAR(ude->encoding);
2001 Py_CLEAR(ude->object);
2002 Py_CLEAR(ude->reason);
2003 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002004}
2005
2006static PyObject *
2007UnicodeDecodeError_str(PyObject *self)
2008{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002009 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002010 PyObject *result = NULL;
2011 PyObject *reason_str = NULL;
2012 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002013
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002014 if (!uself->object)
2015 /* Not properly initialized. */
2016 return PyUnicode_FromString("");
2017
Eric Smith0facd772010-02-24 15:42:29 +00002018 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002019 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002020 reason_str = PyObject_Str(uself->reason);
2021 if (reason_str == NULL)
2022 goto done;
2023 encoding_str = PyObject_Str(uself->encoding);
2024 if (encoding_str == NULL)
2025 goto done;
2026
2027 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002028 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002029 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002030 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002031 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002032 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002033 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002034 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002035 }
Eric Smith0facd772010-02-24 15:42:29 +00002036 else {
2037 result = PyUnicode_FromFormat(
2038 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2039 encoding_str,
2040 uself->start,
2041 uself->end-1,
2042 reason_str
2043 );
2044 }
2045done:
2046 Py_XDECREF(reason_str);
2047 Py_XDECREF(encoding_str);
2048 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002049}
2050
2051static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002052 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002053 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002054 sizeof(PyUnicodeErrorObject), 0,
2055 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2056 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2057 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002058 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2059 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002061 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002062};
2063PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2064
2065PyObject *
2066PyUnicodeDecodeError_Create(
2067 const char *encoding, const char *object, Py_ssize_t length,
2068 Py_ssize_t start, Py_ssize_t end, const char *reason)
2069{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002070 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002071 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002072}
2073
2074
2075/*
2076 * UnicodeTranslateError extends UnicodeError
2077 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002078
2079static int
2080UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2081 PyObject *kwds)
2082{
2083 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2084 return -1;
2085
2086 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002087 Py_CLEAR(self->reason);
2088
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002089 if (!PyArg_ParseTuple(args, "UnnU",
2090 &self->object,
2091 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002092 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 return -1;
2094 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002095
Thomas Wouters477c8d52006-05-27 19:21:47 +00002096 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002097 Py_INCREF(self->reason);
2098
2099 return 0;
2100}
2101
2102
2103static PyObject *
2104UnicodeTranslateError_str(PyObject *self)
2105{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002106 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002107 PyObject *result = NULL;
2108 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002109
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002110 if (!uself->object)
2111 /* Not properly initialized. */
2112 return PyUnicode_FromString("");
2113
Eric Smith0facd772010-02-24 15:42:29 +00002114 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002115 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002116 reason_str = PyObject_Str(uself->reason);
2117 if (reason_str == NULL)
2118 goto done;
2119
Victor Stinner53b33e72011-11-21 01:17:27 +01002120 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2121 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002122 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002123 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002124 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002125 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002126 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002127 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002128 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002129 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002130 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002131 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002132 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002133 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002134 );
Eric Smith0facd772010-02-24 15:42:29 +00002135 } else {
2136 result = PyUnicode_FromFormat(
2137 "can't translate characters in position %zd-%zd: %U",
2138 uself->start,
2139 uself->end-1,
2140 reason_str
2141 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002142 }
Eric Smith0facd772010-02-24 15:42:29 +00002143done:
2144 Py_XDECREF(reason_str);
2145 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002146}
2147
2148static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002149 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002150 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002151 sizeof(PyUnicodeErrorObject), 0,
2152 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2153 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2154 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002156 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2157 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002158 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002159};
2160PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2161
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002162/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002163PyObject *
2164PyUnicodeTranslateError_Create(
2165 const Py_UNICODE *object, Py_ssize_t length,
2166 Py_ssize_t start, Py_ssize_t end, const char *reason)
2167{
2168 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002169 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002170}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002172PyObject *
2173_PyUnicodeTranslateError_Create(
2174 PyObject *object,
2175 Py_ssize_t start, Py_ssize_t end, const char *reason)
2176{
Victor Stinner69598d42014-04-04 20:59:44 +02002177 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002178 object, start, end, reason);
2179}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002180
2181/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002182 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002183 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002184SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002185 "Assertion failed.");
2186
2187
2188/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002189 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002190 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002191SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002192 "Base class for arithmetic errors.");
2193
2194
2195/*
2196 * FloatingPointError extends ArithmeticError
2197 */
2198SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2199 "Floating point operation failed.");
2200
2201
2202/*
2203 * OverflowError extends ArithmeticError
2204 */
2205SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2206 "Result too large to be represented.");
2207
2208
2209/*
2210 * ZeroDivisionError extends ArithmeticError
2211 */
2212SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2213 "Second argument to a division or modulo operation was zero.");
2214
2215
2216/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002217 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002218 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002219SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002220 "Internal error in the Python interpreter.\n"
2221 "\n"
2222 "Please report this to the Python maintainer, along with the traceback,\n"
2223 "the Python version, and the hardware/OS platform and version.");
2224
2225
2226/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002227 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002228 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002229SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002230 "Weak ref proxy used after referent went away.");
2231
2232
2233/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002234 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002235 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002236
2237#define MEMERRORS_SAVE 16
2238static PyBaseExceptionObject *memerrors_freelist = NULL;
2239static int memerrors_numfree = 0;
2240
2241static PyObject *
2242MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2243{
2244 PyBaseExceptionObject *self;
2245
2246 if (type != (PyTypeObject *) PyExc_MemoryError)
2247 return BaseException_new(type, args, kwds);
2248 if (memerrors_freelist == NULL)
2249 return BaseException_new(type, args, kwds);
2250 /* Fetch object from freelist and revive it */
2251 self = memerrors_freelist;
2252 self->args = PyTuple_New(0);
2253 /* This shouldn't happen since the empty tuple is persistent */
2254 if (self->args == NULL)
2255 return NULL;
2256 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2257 memerrors_numfree--;
2258 self->dict = NULL;
2259 _Py_NewReference((PyObject *)self);
2260 _PyObject_GC_TRACK(self);
2261 return (PyObject *)self;
2262}
2263
2264static void
2265MemoryError_dealloc(PyBaseExceptionObject *self)
2266{
2267 _PyObject_GC_UNTRACK(self);
2268 BaseException_clear(self);
2269 if (memerrors_numfree >= MEMERRORS_SAVE)
2270 Py_TYPE(self)->tp_free((PyObject *)self);
2271 else {
2272 self->dict = (PyObject *) memerrors_freelist;
2273 memerrors_freelist = self;
2274 memerrors_numfree++;
2275 }
2276}
2277
2278static void
2279preallocate_memerrors(void)
2280{
2281 /* We create enough MemoryErrors and then decref them, which will fill
2282 up the freelist. */
2283 int i;
2284 PyObject *errors[MEMERRORS_SAVE];
2285 for (i = 0; i < MEMERRORS_SAVE; i++) {
2286 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2287 NULL, NULL);
2288 if (!errors[i])
2289 Py_FatalError("Could not preallocate MemoryError object");
2290 }
2291 for (i = 0; i < MEMERRORS_SAVE; i++) {
2292 Py_DECREF(errors[i]);
2293 }
2294}
2295
2296static void
2297free_preallocated_memerrors(void)
2298{
2299 while (memerrors_freelist != NULL) {
2300 PyObject *self = (PyObject *) memerrors_freelist;
2301 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2302 Py_TYPE(self)->tp_free((PyObject *)self);
2303 }
2304}
2305
2306
2307static PyTypeObject _PyExc_MemoryError = {
2308 PyVarObject_HEAD_INIT(NULL, 0)
2309 "MemoryError",
2310 sizeof(PyBaseExceptionObject),
2311 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2312 0, 0, 0, 0, 0, 0, 0,
2313 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2314 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2315 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2316 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2317 (initproc)BaseException_init, 0, MemoryError_new
2318};
2319PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2320
Thomas Wouters477c8d52006-05-27 19:21:47 +00002321
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002322/*
2323 * BufferError extends Exception
2324 */
2325SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2326
Thomas Wouters477c8d52006-05-27 19:21:47 +00002327
2328/* Warning category docstrings */
2329
2330/*
2331 * Warning extends Exception
2332 */
2333SimpleExtendsException(PyExc_Exception, Warning,
2334 "Base class for warning categories.");
2335
2336
2337/*
2338 * UserWarning extends Warning
2339 */
2340SimpleExtendsException(PyExc_Warning, UserWarning,
2341 "Base class for warnings generated by user code.");
2342
2343
2344/*
2345 * DeprecationWarning extends Warning
2346 */
2347SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2348 "Base class for warnings about deprecated features.");
2349
2350
2351/*
2352 * PendingDeprecationWarning extends Warning
2353 */
2354SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2355 "Base class for warnings about features which will be deprecated\n"
2356 "in the future.");
2357
2358
2359/*
2360 * SyntaxWarning extends Warning
2361 */
2362SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2363 "Base class for warnings about dubious syntax.");
2364
2365
2366/*
2367 * RuntimeWarning extends Warning
2368 */
2369SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2370 "Base class for warnings about dubious runtime behavior.");
2371
2372
2373/*
2374 * FutureWarning extends Warning
2375 */
2376SimpleExtendsException(PyExc_Warning, FutureWarning,
2377 "Base class for warnings about constructs that will change semantically\n"
2378 "in the future.");
2379
2380
2381/*
2382 * ImportWarning extends Warning
2383 */
2384SimpleExtendsException(PyExc_Warning, ImportWarning,
2385 "Base class for warnings about probable mistakes in module imports");
2386
2387
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002388/*
2389 * UnicodeWarning extends Warning
2390 */
2391SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2392 "Base class for warnings about Unicode related problems, mostly\n"
2393 "related to conversion problems.");
2394
Georg Brandl08be72d2010-10-24 15:11:22 +00002395
Guido van Rossum98297ee2007-11-06 21:34:58 +00002396/*
2397 * BytesWarning extends Warning
2398 */
2399SimpleExtendsException(PyExc_Warning, BytesWarning,
2400 "Base class for warnings about bytes and buffer related problems, mostly\n"
2401 "related to conversion from str or comparing to str.");
2402
2403
Georg Brandl08be72d2010-10-24 15:11:22 +00002404/*
2405 * ResourceWarning extends Warning
2406 */
2407SimpleExtendsException(PyExc_Warning, ResourceWarning,
2408 "Base class for warnings about resource usage.");
2409
2410
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002411
Yury Selivanovf488fb42015-07-03 01:04:23 -04002412/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002413 Meant to be used when normalizing the exception for exceeding the recursion
2414 depth will cause its own infinite recursion.
2415*/
2416PyObject *PyExc_RecursionErrorInst = NULL;
2417
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002418#define PRE_INIT(TYPE) \
2419 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2420 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2421 Py_FatalError("exceptions bootstrapping error."); \
2422 Py_INCREF(PyExc_ ## TYPE); \
2423 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002424
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002425#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002426 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2427 Py_FatalError("Module dictionary insertion problem.");
2428
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002429#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002430 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002431 PyExc_ ## NAME = PyExc_ ## TYPE; \
2432 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2433 Py_FatalError("Module dictionary insertion problem.");
2434
2435#define ADD_ERRNO(TYPE, CODE) { \
2436 PyObject *_code = PyLong_FromLong(CODE); \
2437 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2438 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2439 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002440 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002441 }
2442
2443#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002444#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002445/* The following constants were added to errno.h in VS2010 but have
2446 preferred WSA equivalents. */
2447#undef EADDRINUSE
2448#undef EADDRNOTAVAIL
2449#undef EAFNOSUPPORT
2450#undef EALREADY
2451#undef ECONNABORTED
2452#undef ECONNREFUSED
2453#undef ECONNRESET
2454#undef EDESTADDRREQ
2455#undef EHOSTUNREACH
2456#undef EINPROGRESS
2457#undef EISCONN
2458#undef ELOOP
2459#undef EMSGSIZE
2460#undef ENETDOWN
2461#undef ENETRESET
2462#undef ENETUNREACH
2463#undef ENOBUFS
2464#undef ENOPROTOOPT
2465#undef ENOTCONN
2466#undef ENOTSOCK
2467#undef EOPNOTSUPP
2468#undef EPROTONOSUPPORT
2469#undef EPROTOTYPE
2470#undef ETIMEDOUT
2471#undef EWOULDBLOCK
2472
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002473#if defined(WSAEALREADY) && !defined(EALREADY)
2474#define EALREADY WSAEALREADY
2475#endif
2476#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2477#define ECONNABORTED WSAECONNABORTED
2478#endif
2479#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2480#define ECONNREFUSED WSAECONNREFUSED
2481#endif
2482#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2483#define ECONNRESET WSAECONNRESET
2484#endif
2485#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2486#define EINPROGRESS WSAEINPROGRESS
2487#endif
2488#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2489#define ESHUTDOWN WSAESHUTDOWN
2490#endif
2491#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2492#define ETIMEDOUT WSAETIMEDOUT
2493#endif
2494#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2495#define EWOULDBLOCK WSAEWOULDBLOCK
2496#endif
2497#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002498
Martin v. Löwis1a214512008-06-11 05:26:20 +00002499void
Brett Cannonfd074152012-04-14 14:10:13 -04002500_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002501{
Brett Cannonfd074152012-04-14 14:10:13 -04002502 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002503
2504 PRE_INIT(BaseException)
2505 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002507 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002508 PRE_INIT(StopIteration)
2509 PRE_INIT(GeneratorExit)
2510 PRE_INIT(SystemExit)
2511 PRE_INIT(KeyboardInterrupt)
2512 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002513 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002514 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002515 PRE_INIT(EOFError)
2516 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002517 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002518 PRE_INIT(NotImplementedError)
2519 PRE_INIT(NameError)
2520 PRE_INIT(UnboundLocalError)
2521 PRE_INIT(AttributeError)
2522 PRE_INIT(SyntaxError)
2523 PRE_INIT(IndentationError)
2524 PRE_INIT(TabError)
2525 PRE_INIT(LookupError)
2526 PRE_INIT(IndexError)
2527 PRE_INIT(KeyError)
2528 PRE_INIT(ValueError)
2529 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002530 PRE_INIT(UnicodeEncodeError)
2531 PRE_INIT(UnicodeDecodeError)
2532 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002533 PRE_INIT(AssertionError)
2534 PRE_INIT(ArithmeticError)
2535 PRE_INIT(FloatingPointError)
2536 PRE_INIT(OverflowError)
2537 PRE_INIT(ZeroDivisionError)
2538 PRE_INIT(SystemError)
2539 PRE_INIT(ReferenceError)
2540 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002541 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002542 PRE_INIT(Warning)
2543 PRE_INIT(UserWarning)
2544 PRE_INIT(DeprecationWarning)
2545 PRE_INIT(PendingDeprecationWarning)
2546 PRE_INIT(SyntaxWarning)
2547 PRE_INIT(RuntimeWarning)
2548 PRE_INIT(FutureWarning)
2549 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002550 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002551 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002552 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002553
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002554 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002555 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002556
Louie Luc4318542017-03-29 13:28:15 +08002557 PRE_INIT(BlockingIOError)
2558 PRE_INIT(BrokenPipeError)
2559 PRE_INIT(ChildProcessError)
2560 PRE_INIT(ConnectionAbortedError)
2561 PRE_INIT(ConnectionRefusedError)
2562 PRE_INIT(ConnectionResetError)
2563 PRE_INIT(FileExistsError)
2564 PRE_INIT(FileNotFoundError)
2565 PRE_INIT(IsADirectoryError)
2566 PRE_INIT(NotADirectoryError)
2567 PRE_INIT(InterruptedError)
2568 PRE_INIT(PermissionError)
2569 PRE_INIT(ProcessLookupError)
2570 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002571
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572 bdict = PyModule_GetDict(bltinmod);
2573 if (bdict == NULL)
2574 Py_FatalError("exceptions bootstrapping error.");
2575
2576 POST_INIT(BaseException)
2577 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002579 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002580 POST_INIT(StopIteration)
2581 POST_INIT(GeneratorExit)
2582 POST_INIT(SystemExit)
2583 POST_INIT(KeyboardInterrupt)
2584 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002585 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002587 INIT_ALIAS(EnvironmentError, OSError)
2588 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002589#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002590 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592 POST_INIT(EOFError)
2593 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002594 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595 POST_INIT(NotImplementedError)
2596 POST_INIT(NameError)
2597 POST_INIT(UnboundLocalError)
2598 POST_INIT(AttributeError)
2599 POST_INIT(SyntaxError)
2600 POST_INIT(IndentationError)
2601 POST_INIT(TabError)
2602 POST_INIT(LookupError)
2603 POST_INIT(IndexError)
2604 POST_INIT(KeyError)
2605 POST_INIT(ValueError)
2606 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002607 POST_INIT(UnicodeEncodeError)
2608 POST_INIT(UnicodeDecodeError)
2609 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002610 POST_INIT(AssertionError)
2611 POST_INIT(ArithmeticError)
2612 POST_INIT(FloatingPointError)
2613 POST_INIT(OverflowError)
2614 POST_INIT(ZeroDivisionError)
2615 POST_INIT(SystemError)
2616 POST_INIT(ReferenceError)
2617 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002618 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002619 POST_INIT(Warning)
2620 POST_INIT(UserWarning)
2621 POST_INIT(DeprecationWarning)
2622 POST_INIT(PendingDeprecationWarning)
2623 POST_INIT(SyntaxWarning)
2624 POST_INIT(RuntimeWarning)
2625 POST_INIT(FutureWarning)
2626 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002627 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002628 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002629 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002630
Antoine Pitrouac456a12012-01-18 21:35:21 +01002631 if (!errnomap) {
2632 errnomap = PyDict_New();
2633 if (!errnomap)
2634 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2635 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002636
2637 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002638 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002639
Louie Luc4318542017-03-29 13:28:15 +08002640 POST_INIT(BlockingIOError)
2641 ADD_ERRNO(BlockingIOError, EAGAIN)
2642 ADD_ERRNO(BlockingIOError, EALREADY)
2643 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2644 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2645 POST_INIT(BrokenPipeError)
2646 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002647#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002648 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002649#endif
Louie Luc4318542017-03-29 13:28:15 +08002650 POST_INIT(ChildProcessError)
2651 ADD_ERRNO(ChildProcessError, ECHILD)
2652 POST_INIT(ConnectionAbortedError)
2653 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2654 POST_INIT(ConnectionRefusedError)
2655 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2656 POST_INIT(ConnectionResetError)
2657 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2658 POST_INIT(FileExistsError)
2659 ADD_ERRNO(FileExistsError, EEXIST)
2660 POST_INIT(FileNotFoundError)
2661 ADD_ERRNO(FileNotFoundError, ENOENT)
2662 POST_INIT(IsADirectoryError)
2663 ADD_ERRNO(IsADirectoryError, EISDIR)
2664 POST_INIT(NotADirectoryError)
2665 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2666 POST_INIT(InterruptedError)
2667 ADD_ERRNO(InterruptedError, EINTR)
2668 POST_INIT(PermissionError)
2669 ADD_ERRNO(PermissionError, EACCES)
2670 ADD_ERRNO(PermissionError, EPERM)
2671 POST_INIT(ProcessLookupError)
2672 ADD_ERRNO(ProcessLookupError, ESRCH)
2673 POST_INIT(TimeoutError)
2674 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002675
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002676 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002677
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002678 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002679 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002680 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002681 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002682 "recursion errors");
2683 else {
2684 PyBaseExceptionObject *err_inst =
2685 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2686 PyObject *args_tuple;
2687 PyObject *exc_message;
2688 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2689 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002690 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002691 "pre-allocation");
2692 args_tuple = PyTuple_Pack(1, exc_message);
2693 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002694 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002695 "pre-allocation");
2696 Py_DECREF(exc_message);
2697 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002698 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002699 Py_DECREF(args_tuple);
2700 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002701 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002702}
2703
2704void
2705_PyExc_Fini(void)
2706{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002707 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002708 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002709 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002710}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002711
2712/* Helper to do the equivalent of "raise X from Y" in C, but always using
2713 * the current exception rather than passing one in.
2714 *
2715 * We currently limit this to *only* exceptions that use the BaseException
2716 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2717 * those correctly without losing data and without losing backwards
2718 * compatibility.
2719 *
2720 * We also aim to rule out *all* exceptions that might be storing additional
2721 * state, whether by having a size difference relative to BaseException,
2722 * additional arguments passed in during construction or by having a
2723 * non-empty instance dict.
2724 *
2725 * We need to be very careful with what we wrap, since changing types to
2726 * a broader exception type would be backwards incompatible for
2727 * existing codecs, and with different init or new method implementations
2728 * may either not support instantiation with PyErr_Format or lose
2729 * information when instantiated that way.
2730 *
2731 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2732 * fact that exceptions are expected to support pickling. If more builtin
2733 * exceptions (e.g. AttributeError) start to be converted to rich
2734 * exceptions with additional attributes, that's probably a better approach
2735 * to pursue over adding special cases for particular stateful subclasses.
2736 *
2737 * Returns a borrowed reference to the new exception (if any), NULL if the
2738 * existing exception was left in place.
2739 */
2740PyObject *
2741_PyErr_TrySetFromCause(const char *format, ...)
2742{
2743 PyObject* msg_prefix;
2744 PyObject *exc, *val, *tb;
2745 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002746 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002747 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002748 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002749 PyObject *new_exc, *new_val, *new_tb;
2750 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002751 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002752
Nick Coghlan8b097b42013-11-13 23:49:21 +10002753 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002754 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002755 /* Ensure type info indicates no extra state is stored at the C level
2756 * and that the type can be reinstantiated using PyErr_Format
2757 */
2758 caught_type_size = caught_type->tp_basicsize;
2759 base_exc_size = _PyExc_BaseException.tp_basicsize;
2760 same_basic_size = (
2761 caught_type_size == base_exc_size ||
2762 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002763 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002764 )
2765 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002766 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002767 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002768 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002769 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002770 /* We can't be sure we can wrap this safely, since it may contain
2771 * more state than just the exception type. Accordingly, we just
2772 * leave it alone.
2773 */
2774 PyErr_Restore(exc, val, tb);
2775 return NULL;
2776 }
2777
2778 /* Check the args are empty or contain a single string */
2779 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002780 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002781 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002782 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002783 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002784 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002785 /* More than 1 arg, or the one arg we do have isn't a string
2786 */
2787 PyErr_Restore(exc, val, tb);
2788 return NULL;
2789 }
2790
2791 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002792 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002793 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002794 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002795 /* While we could potentially copy a non-empty instance dictionary
2796 * to the replacement exception, for now we take the more
2797 * conservative path of leaving exceptions with attributes set
2798 * alone.
2799 */
2800 PyErr_Restore(exc, val, tb);
2801 return NULL;
2802 }
2803
2804 /* For exceptions that we can wrap safely, we chain the original
2805 * exception to a new one of the exact same type with an
2806 * error message that mentions the additional details and the
2807 * original exception.
2808 *
2809 * It would be nice to wrap OSError and various other exception
2810 * types as well, but that's quite a bit trickier due to the extra
2811 * state potentially stored on OSError instances.
2812 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002813 /* Ensure the traceback is set correctly on the existing exception */
2814 if (tb != NULL) {
2815 PyException_SetTraceback(val, tb);
2816 Py_DECREF(tb);
2817 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002818
Christian Heimes507eabd2013-11-14 01:39:35 +01002819#ifdef HAVE_STDARG_PROTOTYPES
2820 va_start(vargs, format);
2821#else
2822 va_start(vargs);
2823#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002824 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002825 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002826 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002827 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002828 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002829 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002830 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002831
2832 PyErr_Format(exc, "%U (%s: %S)",
2833 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002834 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002835 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002836 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2837 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2838 PyException_SetCause(new_val, val);
2839 PyErr_Restore(new_exc, new_val, new_tb);
2840 return new_val;
2841}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002842
2843
2844/* To help with migration from Python 2, SyntaxError.__init__ applies some
2845 * heuristics to try to report a more meaningful exception when print and
2846 * exec are used like statements.
2847 *
2848 * The heuristics are currently expected to detect the following cases:
2849 * - top level statement
2850 * - statement in a nested suite
2851 * - trailing section of a one line complex statement
2852 *
2853 * They're currently known not to trigger:
2854 * - after a semi-colon
2855 *
2856 * The error message can be a bit odd in cases where the "arguments" are
2857 * completely illegal syntactically, but that isn't worth the hassle of
2858 * fixing.
2859 *
2860 * We also can't do anything about cases that are legal Python 3 syntax
2861 * but mean something entirely different from what they did in Python 2
2862 * (omitting the arguments entirely, printing items preceded by a unary plus
2863 * or minus, using the stream redirection syntax).
2864 */
2865
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302866
2867// Static helper for setting legacy print error message
2868static int
2869_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2870{
2871 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2872 if (strip_sep_obj == NULL)
2873 return -1;
2874
2875 // PRINT_OFFSET is to remove `print ` word from the data.
2876 const int PRINT_OFFSET = 6;
2877 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2878 PyObject *data = PyUnicode_Substring(self->text, PRINT_OFFSET, text_len);
2879
2880 if (data == NULL) {
2881 Py_DECREF(strip_sep_obj);
2882 return -1;
2883 }
2884 PyObject *new_data = _PyUnicode_XStrip(data, 2, strip_sep_obj);
2885 Py_DECREF(data);
2886 Py_DECREF(strip_sep_obj);
2887
2888 if (new_data == NULL) {
2889 return -1;
2890 }
2891 // gets the modified text_len after stripping `print `
2892 text_len = PyUnicode_GET_LENGTH(new_data);
2893 const char *maybe_end_arg = "";
2894 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2895 maybe_end_arg = " end=\" \"";
2896 }
2897 PyObject *error_msg = PyUnicode_FromFormat(
2898 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2899 new_data, maybe_end_arg
2900 );
2901 Py_DECREF(new_data);
2902 if (error_msg == NULL)
2903 return -1;
2904
2905 Py_XSETREF(self->msg, error_msg);
2906 return 1;
2907}
2908
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002909static int
2910_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2911{
2912 /* Return values:
2913 * -1: an error occurred
2914 * 0: nothing happened
2915 * 1: the check triggered & the error message was changed
2916 */
2917 static PyObject *print_prefix = NULL;
2918 static PyObject *exec_prefix = NULL;
2919 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2920 int kind = PyUnicode_KIND(self->text);
2921 void *data = PyUnicode_DATA(self->text);
2922
2923 /* Ignore leading whitespace */
2924 while (start < text_len) {
2925 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2926 if (!Py_UNICODE_ISSPACE(ch))
2927 break;
2928 start++;
2929 }
2930 /* Checking against an empty or whitespace-only part of the string */
2931 if (start == text_len) {
2932 return 0;
2933 }
2934
2935 /* Check for legacy print statements */
2936 if (print_prefix == NULL) {
2937 print_prefix = PyUnicode_InternFromString("print ");
2938 if (print_prefix == NULL) {
2939 return -1;
2940 }
2941 }
2942 if (PyUnicode_Tailmatch(self->text, print_prefix,
2943 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302944
2945 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002946 }
2947
2948 /* Check for legacy exec statements */
2949 if (exec_prefix == NULL) {
2950 exec_prefix = PyUnicode_InternFromString("exec ");
2951 if (exec_prefix == NULL) {
2952 return -1;
2953 }
2954 }
2955 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2956 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002957 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002958 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002959 return 1;
2960 }
2961 /* Fall back to the default error message */
2962 return 0;
2963}
2964
2965static int
2966_report_missing_parentheses(PySyntaxErrorObject *self)
2967{
2968 Py_UCS4 left_paren = 40;
2969 Py_ssize_t left_paren_index;
2970 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2971 int legacy_check_result = 0;
2972
2973 /* Skip entirely if there is an opening parenthesis */
2974 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2975 0, text_len, 1);
2976 if (left_paren_index < -1) {
2977 return -1;
2978 }
2979 if (left_paren_index != -1) {
2980 /* Use default error message for any line with an opening paren */
2981 return 0;
2982 }
2983 /* Handle the simple statement case */
2984 legacy_check_result = _check_for_legacy_statements(self, 0);
2985 if (legacy_check_result < 0) {
2986 return -1;
2987
2988 }
2989 if (legacy_check_result == 0) {
2990 /* Handle the one-line complex statement case */
2991 Py_UCS4 colon = 58;
2992 Py_ssize_t colon_index;
2993 colon_index = PyUnicode_FindChar(self->text, colon,
2994 0, text_len, 1);
2995 if (colon_index < -1) {
2996 return -1;
2997 }
2998 if (colon_index >= 0 && colon_index < text_len) {
2999 /* Check again, starting from just after the colon */
3000 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3001 return -1;
3002 }
3003 }
3004 }
3005 return 0;
3006}