blob: 7beb2a2891de7195e8af71840bc39bcb14d49d31 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#include "internal/mem.h"
10#include "internal/pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000011#include "structmember.h"
12#include "osdefs.h"
13
Thomas Wouters477c8d52006-05-27 19:21:47 +000014
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020015/* Compatibility aliases */
16PyObject *PyExc_EnvironmentError = NULL;
17PyObject *PyExc_IOError = NULL;
18#ifdef MS_WINDOWS
19PyObject *PyExc_WindowsError = NULL;
20#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020021
22/* The dict map from errno codes to OSError subclasses */
23static PyObject *errnomap = NULL;
24
25
Thomas Wouters477c8d52006-05-27 19:21:47 +000026/* NOTE: If the exception class hierarchy changes, don't forget to update
27 * Lib/test/exception_hierarchy.txt
28 */
29
Thomas Wouters477c8d52006-05-27 19:21:47 +000030/*
31 * BaseException
32 */
33static PyObject *
34BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35{
36 PyBaseExceptionObject *self;
37
38 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000039 if (!self)
40 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000041 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000042 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000043 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070044 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000045
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010046 if (args) {
47 self->args = args;
48 Py_INCREF(args);
49 return (PyObject *)self;
50 }
51
Thomas Wouters477c8d52006-05-27 19:21:47 +000052 self->args = PyTuple_New(0);
53 if (!self->args) {
54 Py_DECREF(self);
55 return NULL;
56 }
57
Thomas Wouters477c8d52006-05-27 19:21:47 +000058 return (PyObject *)self;
59}
60
61static int
62BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
63{
Christian Heimes90aa7642007-12-19 02:45:37 +000064 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000065 return -1;
66
Serhiy Storchaka576f1322016-01-05 21:27:54 +020067 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030068 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000069
Thomas Wouters477c8d52006-05-27 19:21:47 +000070 return 0;
71}
72
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000073static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000074BaseException_clear(PyBaseExceptionObject *self)
75{
76 Py_CLEAR(self->dict);
77 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000078 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000079 Py_CLEAR(self->cause);
80 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000081 return 0;
82}
83
84static void
85BaseException_dealloc(PyBaseExceptionObject *self)
86{
Thomas Wouters89f507f2006-12-13 04:49:30 +000087 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000089 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000090}
91
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000092static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000093BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
94{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000095 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000097 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000098 Py_VISIT(self->cause);
99 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000100 return 0;
101}
102
103static PyObject *
104BaseException_str(PyBaseExceptionObject *self)
105{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000108 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000112 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000113 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114}
115
116static PyObject *
117BaseException_repr(PyBaseExceptionObject *self)
118{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300119 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200120 if (PyTuple_GET_SIZE(self->args) == 1)
121 return PyUnicode_FromFormat("%s(%R)", name,
122 PyTuple_GET_ITEM(self->args, 0));
123 else
124 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125}
126
127/* Pickling support */
128static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530129BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000130{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135}
136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137/*
138 * Needed for backward compatibility, since exceptions used to store
139 * all their attributes in the __dict__. Code is taken from cPickle's
140 * load_build function.
141 */
142static PyObject *
143BaseException_setstate(PyObject *self, PyObject *state)
144{
145 PyObject *d_key, *d_value;
146 Py_ssize_t i = 0;
147
148 if (state != Py_None) {
149 if (!PyDict_Check(state)) {
150 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
151 return NULL;
152 }
153 while (PyDict_Next(state, &i, &d_key, &d_value)) {
154 if (PyObject_SetAttr(self, d_key, d_value) < 0)
155 return NULL;
156 }
157 }
158 Py_RETURN_NONE;
159}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000160
Collin Winter828f04a2007-08-31 00:04:24 +0000161static PyObject *
162BaseException_with_traceback(PyObject *self, PyObject *tb) {
163 if (PyException_SetTraceback(self, tb))
164 return NULL;
165
166 Py_INCREF(self);
167 return self;
168}
169
Georg Brandl76941002008-05-05 21:38:47 +0000170PyDoc_STRVAR(with_traceback_doc,
171"Exception.with_traceback(tb) --\n\
172 set self.__traceback__ to tb and return self.");
173
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174
175static PyMethodDef BaseException_methods[] = {
176 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000178 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
179 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 {NULL, NULL, 0, NULL},
181};
182
Thomas Wouters477c8d52006-05-27 19:21:47 +0000183static PyObject *
184BaseException_get_args(PyBaseExceptionObject *self)
185{
186 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000188 }
189 Py_INCREF(self->args);
190 return self->args;
191}
192
193static int
194BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
195{
196 PyObject *seq;
197 if (val == NULL) {
198 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
199 return -1;
200 }
201 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500202 if (!seq)
203 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300204 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
209BaseException_get_tb(PyBaseExceptionObject *self)
210{
211 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200212 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000213 }
214 Py_INCREF(self->traceback);
215 return self->traceback;
216}
217
218static int
219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
220{
221 if (tb == NULL) {
222 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
223 return -1;
224 }
225 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
226 PyErr_SetString(PyExc_TypeError,
227 "__traceback__ must be a traceback or None");
228 return -1;
229 }
230
Serhiy Storchaka37665722016-08-20 21:22:03 +0300231 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300232 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000233 return 0;
234}
235
Georg Brandlab6f2f62009-03-31 04:16:10 +0000236static PyObject *
237BaseException_get_context(PyObject *self) {
238 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500239 if (res)
240 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000241 Py_RETURN_NONE;
242}
243
244static int
245BaseException_set_context(PyObject *self, PyObject *arg) {
246 if (arg == NULL) {
247 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
248 return -1;
249 } else if (arg == Py_None) {
250 arg = NULL;
251 } else if (!PyExceptionInstance_Check(arg)) {
252 PyErr_SetString(PyExc_TypeError, "exception context must be None "
253 "or derive from BaseException");
254 return -1;
255 } else {
256 /* PyException_SetContext steals this reference */
257 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000259 PyException_SetContext(self, arg);
260 return 0;
261}
262
263static PyObject *
264BaseException_get_cause(PyObject *self) {
265 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500266 if (res)
267 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700268 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000269}
270
271static int
272BaseException_set_cause(PyObject *self, PyObject *arg) {
273 if (arg == NULL) {
274 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
275 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700276 } else if (arg == Py_None) {
277 arg = NULL;
278 } else if (!PyExceptionInstance_Check(arg)) {
279 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
280 "or derive from BaseException");
281 return -1;
282 } else {
283 /* PyException_SetCause steals this reference */
284 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700286 PyException_SetCause(self, arg);
287 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000288}
289
Guido van Rossum360e4b82007-05-14 22:51:27 +0000290
Thomas Wouters477c8d52006-05-27 19:21:47 +0000291static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500292 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000294 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000295 {"__context__", (getter)BaseException_get_context,
296 (setter)BaseException_set_context, PyDoc_STR("exception context")},
297 {"__cause__", (getter)BaseException_get_cause,
298 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299 {NULL},
300};
301
302
Collin Winter828f04a2007-08-31 00:04:24 +0000303PyObject *
304PyException_GetTraceback(PyObject *self) {
305 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
306 Py_XINCREF(base_self->traceback);
307 return base_self->traceback;
308}
309
310
311int
312PyException_SetTraceback(PyObject *self, PyObject *tb) {
313 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
314}
315
316PyObject *
317PyException_GetCause(PyObject *self) {
318 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
319 Py_XINCREF(cause);
320 return cause;
321}
322
323/* Steals a reference to cause */
324void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200325PyException_SetCause(PyObject *self, PyObject *cause)
326{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700327 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300328 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000329}
330
331PyObject *
332PyException_GetContext(PyObject *self) {
333 PyObject *context = ((PyBaseExceptionObject *)self)->context;
334 Py_XINCREF(context);
335 return context;
336}
337
338/* Steals a reference to context */
339void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200340PyException_SetContext(PyObject *self, PyObject *context)
341{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300342 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000343}
344
Christian Tismerea62ce72018-06-09 20:32:25 +0200345#undef PyExceptionClass_Name
Christian Tismer83987132018-06-11 00:48:28 +0200346
Christian Tismerea62ce72018-06-09 20:32:25 +0200347char *
348PyExceptionClass_Name(PyObject *ob)
349{
350 return ((PyTypeObject*)ob)->tp_name;
351}
Collin Winter828f04a2007-08-31 00:04:24 +0000352
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700353static struct PyMemberDef BaseException_members[] = {
354 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200355 offsetof(PyBaseExceptionObject, suppress_context)},
356 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700357};
358
359
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000361 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000362 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000363 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
364 0, /*tp_itemsize*/
365 (destructor)BaseException_dealloc, /*tp_dealloc*/
366 0, /*tp_print*/
367 0, /*tp_getattr*/
368 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000369 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370 (reprfunc)BaseException_repr, /*tp_repr*/
371 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000372 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000373 0, /*tp_as_mapping*/
374 0, /*tp_hash */
375 0, /*tp_call*/
376 (reprfunc)BaseException_str, /*tp_str*/
377 PyObject_GenericGetAttr, /*tp_getattro*/
378 PyObject_GenericSetAttr, /*tp_setattro*/
379 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000380 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000382 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
383 (traverseproc)BaseException_traverse, /* tp_traverse */
384 (inquiry)BaseException_clear, /* tp_clear */
385 0, /* tp_richcompare */
386 0, /* tp_weaklistoffset */
387 0, /* tp_iter */
388 0, /* tp_iternext */
389 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700390 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000391 BaseException_getset, /* tp_getset */
392 0, /* tp_base */
393 0, /* tp_dict */
394 0, /* tp_descr_get */
395 0, /* tp_descr_set */
396 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
397 (initproc)BaseException_init, /* tp_init */
398 0, /* tp_alloc */
399 BaseException_new, /* tp_new */
400};
401/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
402from the previous implmentation and also allowing Python objects to be used
403in the API */
404PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
405
406/* note these macros omit the last semicolon so the macro invocation may
407 * include it and not look strange.
408 */
409#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
410static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000411 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000412 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000413 sizeof(PyBaseExceptionObject), \
414 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
415 0, 0, 0, 0, 0, 0, 0, \
416 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
417 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
418 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
419 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
420 (initproc)BaseException_init, 0, BaseException_new,\
421}; \
422PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
423
424#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
425static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000426 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000427 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000428 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000429 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000430 0, 0, 0, 0, 0, \
431 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000432 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
433 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000434 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200435 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000436}; \
437PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
438
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200439#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
440 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
441 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000443 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000444 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000445 sizeof(Py ## EXCSTORE ## Object), 0, \
446 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
447 (reprfunc)EXCSTR, 0, 0, 0, \
448 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
449 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
450 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200451 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000452 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200453 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000454}; \
455PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
456
457
458/*
459 * Exception extends BaseException
460 */
461SimpleExtendsException(PyExc_BaseException, Exception,
462 "Common base class for all non-exit exceptions.");
463
464
465/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000466 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000467 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000468SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469 "Inappropriate argument type.");
470
471
472/*
Yury Selivanov75445082015-05-11 22:57:16 -0400473 * StopAsyncIteration extends Exception
474 */
475SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
476 "Signal the end from iterator.__anext__().");
477
478
479/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 * StopIteration extends Exception
481 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000482
483static PyMemberDef StopIteration_members[] = {
484 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
485 PyDoc_STR("generator return value")},
486 {NULL} /* Sentinel */
487};
488
489static int
490StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
491{
492 Py_ssize_t size = PyTuple_GET_SIZE(args);
493 PyObject *value;
494
495 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
496 return -1;
497 Py_CLEAR(self->value);
498 if (size > 0)
499 value = PyTuple_GET_ITEM(args, 0);
500 else
501 value = Py_None;
502 Py_INCREF(value);
503 self->value = value;
504 return 0;
505}
506
507static int
508StopIteration_clear(PyStopIterationObject *self)
509{
510 Py_CLEAR(self->value);
511 return BaseException_clear((PyBaseExceptionObject *)self);
512}
513
514static void
515StopIteration_dealloc(PyStopIterationObject *self)
516{
517 _PyObject_GC_UNTRACK(self);
518 StopIteration_clear(self);
519 Py_TYPE(self)->tp_free((PyObject *)self);
520}
521
522static int
523StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
524{
525 Py_VISIT(self->value);
526 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
527}
528
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000529ComplexExtendsException(
530 PyExc_Exception, /* base */
531 StopIteration, /* name */
532 StopIteration, /* prefix for *_init, etc */
533 0, /* new */
534 0, /* methods */
535 StopIteration_members, /* members */
536 0, /* getset */
537 0, /* str */
538 "Signal the end from iterator.__next__()."
539);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000540
541
542/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000543 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000544 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000545SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000546 "Request that a generator exit.");
547
548
549/*
550 * SystemExit extends BaseException
551 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000552
553static int
554SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
555{
556 Py_ssize_t size = PyTuple_GET_SIZE(args);
557
558 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
559 return -1;
560
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000561 if (size == 0)
562 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200563 if (size == 1) {
564 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300565 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200566 }
567 else { /* size > 1 */
568 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300569 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200570 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000571 return 0;
572}
573
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000574static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000575SystemExit_clear(PySystemExitObject *self)
576{
577 Py_CLEAR(self->code);
578 return BaseException_clear((PyBaseExceptionObject *)self);
579}
580
581static void
582SystemExit_dealloc(PySystemExitObject *self)
583{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000584 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000585 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000586 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000587}
588
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000589static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
591{
592 Py_VISIT(self->code);
593 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
594}
595
596static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000597 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
598 PyDoc_STR("exception code")},
599 {NULL} /* Sentinel */
600};
601
602ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200603 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000604 "Request to exit from the interpreter.");
605
606/*
607 * KeyboardInterrupt extends BaseException
608 */
609SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
610 "Program interrupted by user.");
611
612
613/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000614 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000615 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000616
Brett Cannon79ec55e2012-04-12 20:24:54 -0400617static int
618ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
619{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300620 static char *kwlist[] = {"name", "path", 0};
621 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400622 PyObject *msg = NULL;
623 PyObject *name = NULL;
624 PyObject *path = NULL;
625
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300626 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400627 return -1;
628
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300629 empty_tuple = PyTuple_New(0);
630 if (!empty_tuple)
631 return -1;
632 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
633 &name, &path)) {
634 Py_DECREF(empty_tuple);
635 return -1;
636 }
637 Py_DECREF(empty_tuple);
638
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300639 Py_XINCREF(name);
640 Py_XSETREF(self->name, name);
641
642 Py_XINCREF(path);
643 Py_XSETREF(self->path, path);
644
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300645 if (PyTuple_GET_SIZE(args) == 1) {
646 msg = PyTuple_GET_ITEM(args, 0);
647 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300648 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300649 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400650
651 return 0;
652}
653
654static int
655ImportError_clear(PyImportErrorObject *self)
656{
657 Py_CLEAR(self->msg);
658 Py_CLEAR(self->name);
659 Py_CLEAR(self->path);
660 return BaseException_clear((PyBaseExceptionObject *)self);
661}
662
663static void
664ImportError_dealloc(PyImportErrorObject *self)
665{
666 _PyObject_GC_UNTRACK(self);
667 ImportError_clear(self);
668 Py_TYPE(self)->tp_free((PyObject *)self);
669}
670
671static int
672ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
673{
674 Py_VISIT(self->msg);
675 Py_VISIT(self->name);
676 Py_VISIT(self->path);
677 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
678}
679
680static PyObject *
681ImportError_str(PyImportErrorObject *self)
682{
Brett Cannon07c6e712012-08-24 13:05:09 -0400683 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400684 Py_INCREF(self->msg);
685 return self->msg;
686 }
687 else {
688 return BaseException_str((PyBaseExceptionObject *)self);
689 }
690}
691
Serhiy Storchakab7853962017-04-08 09:55:07 +0300692static PyObject *
693ImportError_getstate(PyImportErrorObject *self)
694{
695 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
696 if (self->name || self->path) {
697 _Py_IDENTIFIER(name);
698 _Py_IDENTIFIER(path);
699 dict = dict ? PyDict_Copy(dict) : PyDict_New();
700 if (dict == NULL)
701 return NULL;
702 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
703 Py_DECREF(dict);
704 return NULL;
705 }
706 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
707 Py_DECREF(dict);
708 return NULL;
709 }
710 return dict;
711 }
712 else if (dict) {
713 Py_INCREF(dict);
714 return dict;
715 }
716 else {
717 Py_RETURN_NONE;
718 }
719}
720
721/* Pickling support */
722static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530723ImportError_reduce(PyImportErrorObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakab7853962017-04-08 09:55:07 +0300724{
725 PyObject *res;
726 PyObject *args;
727 PyObject *state = ImportError_getstate(self);
728 if (state == NULL)
729 return NULL;
730 args = ((PyBaseExceptionObject *)self)->args;
731 if (state == Py_None)
732 res = PyTuple_Pack(2, Py_TYPE(self), args);
733 else
734 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
735 Py_DECREF(state);
736 return res;
737}
738
Brett Cannon79ec55e2012-04-12 20:24:54 -0400739static PyMemberDef ImportError_members[] = {
740 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
741 PyDoc_STR("exception message")},
742 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
743 PyDoc_STR("module name")},
744 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
745 PyDoc_STR("module path")},
746 {NULL} /* Sentinel */
747};
748
749static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300750 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400751 {NULL}
752};
753
754ComplexExtendsException(PyExc_Exception, ImportError,
755 ImportError, 0 /* new */,
756 ImportError_methods, ImportError_members,
757 0 /* getset */, ImportError_str,
758 "Import can't find module, or can't find name in "
759 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000760
761/*
Eric Snowc9432652016-09-07 15:42:32 -0700762 * ModuleNotFoundError extends ImportError
763 */
764
765MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
766 "Module not found.");
767
768/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200769 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000770 */
771
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200772#ifdef MS_WINDOWS
773#include "errmap.h"
774#endif
775
Thomas Wouters477c8d52006-05-27 19:21:47 +0000776/* Where a function has a single filename, such as open() or some
777 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
778 * called, giving a third argument which is the filename. But, so
779 * that old code using in-place unpacking doesn't break, e.g.:
780 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200781 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000782 *
783 * we hack args so that it only contains two items. This also
784 * means we need our own __str__() which prints out the filename
785 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800786 *
787 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800788 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
789 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200791
Antoine Pitroue0e27352011-12-15 14:31:28 +0100792/* This function doesn't cleanup on error, the caller should */
793static int
794oserror_parse_args(PyObject **p_args,
795 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800796 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200797#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100798 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200799#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100800 )
801{
802 Py_ssize_t nargs;
803 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800804#ifndef MS_WINDOWS
805 /*
806 * ignored on non-Windows platforms,
807 * but parsed so OSError has a consistent signature
808 */
809 PyObject *_winerror = NULL;
810 PyObject **winerror = &_winerror;
811#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000812
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200813 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000814
Larry Hastingsb0827312014-02-09 22:05:19 -0800815 if (nargs >= 2 && nargs <= 5) {
816 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
817 myerrno, strerror,
818 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100819 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800820#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 if (*winerror && PyLong_Check(*winerror)) {
822 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200823 PyObject *newargs;
824 Py_ssize_t i;
825
Antoine Pitroue0e27352011-12-15 14:31:28 +0100826 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200827 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100828 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200829 /* Set errno to the corresponding POSIX errno (overriding
830 first argument). Windows Socket error codes (>= 10000)
831 have the same value as their POSIX counterparts.
832 */
833 if (winerrcode < 10000)
834 errcode = winerror_to_errno(winerrcode);
835 else
836 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100837 *myerrno = PyLong_FromLong(errcode);
838 if (!*myerrno)
839 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200840 newargs = PyTuple_New(nargs);
841 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100842 return -1;
843 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200844 for (i = 1; i < nargs; i++) {
845 PyObject *val = PyTuple_GET_ITEM(args, i);
846 Py_INCREF(val);
847 PyTuple_SET_ITEM(newargs, i, val);
848 }
849 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100850 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200851 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800852#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200853 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000854
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855 return 0;
856}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000857
Antoine Pitroue0e27352011-12-15 14:31:28 +0100858static int
859oserror_init(PyOSErrorObject *self, PyObject **p_args,
860 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800861 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100862#ifdef MS_WINDOWS
863 , PyObject *winerror
864#endif
865 )
866{
867 PyObject *args = *p_args;
868 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000869
870 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200871 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100872 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200873 PyNumber_Check(filename)) {
874 /* BlockingIOError's 3rd argument can be the number of
875 * characters written.
876 */
877 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
878 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100879 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200880 }
881 else {
882 Py_INCREF(filename);
883 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000884
Larry Hastingsb0827312014-02-09 22:05:19 -0800885 if (filename2 && filename2 != Py_None) {
886 Py_INCREF(filename2);
887 self->filename2 = filename2;
888 }
889
890 if (nargs >= 2 && nargs <= 5) {
891 /* filename, filename2, and winerror are removed from the args tuple
892 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100893 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200894 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100895 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000896
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200897 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100898 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200899 }
900 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000901 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200902 Py_XINCREF(myerrno);
903 self->myerrno = myerrno;
904
905 Py_XINCREF(strerror);
906 self->strerror = strerror;
907
908#ifdef MS_WINDOWS
909 Py_XINCREF(winerror);
910 self->winerror = winerror;
911#endif
912
Antoine Pitroue0e27352011-12-15 14:31:28 +0100913 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300914 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100915 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100916
917 return 0;
918}
919
920static PyObject *
921OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
922static int
923OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
924
925static int
926oserror_use_init(PyTypeObject *type)
927{
Martin Panter7462b6492015-11-02 03:37:02 +0000928 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100929 extraneous argument to __new__ to be ignored. The only reasonable
930 solution, given __new__ takes a variable number of arguments,
931 is to defer arg parsing and initialization to __init__.
932
Martin Pantere26da7c2016-06-02 10:07:09 +0000933 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100934 with the right arguments.
935
936 (see http://bugs.python.org/issue12555#msg148829 )
937 */
938 if (type->tp_init != (initproc) OSError_init &&
939 type->tp_new == (newfunc) OSError_new) {
940 assert((PyObject *) type != PyExc_OSError);
941 return 1;
942 }
943 return 0;
944}
945
946static PyObject *
947OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
948{
949 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800950 PyObject *myerrno = NULL, *strerror = NULL;
951 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100952#ifdef MS_WINDOWS
953 PyObject *winerror = NULL;
954#endif
955
Victor Stinner46ef3192013-11-14 22:31:41 +0100956 Py_INCREF(args);
957
Antoine Pitroue0e27352011-12-15 14:31:28 +0100958 if (!oserror_use_init(type)) {
959 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100960 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100961
Larry Hastingsb0827312014-02-09 22:05:19 -0800962 if (oserror_parse_args(&args, &myerrno, &strerror,
963 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100964#ifdef MS_WINDOWS
965 , &winerror
966#endif
967 ))
968 goto error;
969
970 if (myerrno && PyLong_Check(myerrno) &&
971 errnomap && (PyObject *) type == PyExc_OSError) {
972 PyObject *newtype;
973 newtype = PyDict_GetItem(errnomap, myerrno);
974 if (newtype) {
975 assert(PyType_Check(newtype));
976 type = (PyTypeObject *) newtype;
977 }
978 else if (PyErr_Occurred())
979 goto error;
980 }
981 }
982
983 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
984 if (!self)
985 goto error;
986
987 self->dict = NULL;
988 self->traceback = self->cause = self->context = NULL;
989 self->written = -1;
990
991 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800992 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100993#ifdef MS_WINDOWS
994 , winerror
995#endif
996 ))
997 goto error;
998 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200999 else {
1000 self->args = PyTuple_New(0);
1001 if (self->args == NULL)
1002 goto error;
1003 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001004
Victor Stinner46ef3192013-11-14 22:31:41 +01001005 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001006 return (PyObject *) self;
1007
1008error:
1009 Py_XDECREF(args);
1010 Py_XDECREF(self);
1011 return NULL;
1012}
1013
1014static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001015OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001016{
Larry Hastingsb0827312014-02-09 22:05:19 -08001017 PyObject *myerrno = NULL, *strerror = NULL;
1018 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001019#ifdef MS_WINDOWS
1020 PyObject *winerror = NULL;
1021#endif
1022
1023 if (!oserror_use_init(Py_TYPE(self)))
1024 /* Everything already done in OSError_new */
1025 return 0;
1026
1027 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1028 return -1;
1029
1030 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001031 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001032#ifdef MS_WINDOWS
1033 , &winerror
1034#endif
1035 ))
1036 goto error;
1037
Larry Hastingsb0827312014-02-09 22:05:19 -08001038 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001039#ifdef MS_WINDOWS
1040 , winerror
1041#endif
1042 ))
1043 goto error;
1044
Thomas Wouters477c8d52006-05-27 19:21:47 +00001045 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001046
1047error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001048 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001049 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001050}
1051
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001052static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001053OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001054{
1055 Py_CLEAR(self->myerrno);
1056 Py_CLEAR(self->strerror);
1057 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001058 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001059#ifdef MS_WINDOWS
1060 Py_CLEAR(self->winerror);
1061#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001062 return BaseException_clear((PyBaseExceptionObject *)self);
1063}
1064
1065static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001066OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001067{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001068 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001069 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001070 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071}
1072
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001073static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001075 void *arg)
1076{
1077 Py_VISIT(self->myerrno);
1078 Py_VISIT(self->strerror);
1079 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001080 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001081#ifdef MS_WINDOWS
1082 Py_VISIT(self->winerror);
1083#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1085}
1086
1087static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001088OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001089{
Larry Hastingsb0827312014-02-09 22:05:19 -08001090#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001091#ifdef MS_WINDOWS
1092 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001093 if (self->winerror && self->filename) {
1094 if (self->filename2) {
1095 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1096 OR_NONE(self->winerror),
1097 OR_NONE(self->strerror),
1098 self->filename,
1099 self->filename2);
1100 } else {
1101 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1102 OR_NONE(self->winerror),
1103 OR_NONE(self->strerror),
1104 self->filename);
1105 }
1106 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001107 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001108 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001109 self->winerror ? self->winerror: Py_None,
1110 self->strerror ? self->strerror: Py_None);
1111#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001112 if (self->filename) {
1113 if (self->filename2) {
1114 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1115 OR_NONE(self->myerrno),
1116 OR_NONE(self->strerror),
1117 self->filename,
1118 self->filename2);
1119 } else {
1120 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1121 OR_NONE(self->myerrno),
1122 OR_NONE(self->strerror),
1123 self->filename);
1124 }
1125 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001126 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001127 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001128 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001129 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001130}
1131
Thomas Wouters477c8d52006-05-27 19:21:47 +00001132static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301133OSError_reduce(PyOSErrorObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001134{
1135 PyObject *args = self->args;
1136 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001137
Thomas Wouters477c8d52006-05-27 19:21:47 +00001138 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001139 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001140 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001141 Py_ssize_t size = self->filename2 ? 5 : 3;
1142 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001143 if (!args)
1144 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001145
1146 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001147 Py_INCREF(tmp);
1148 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001149
1150 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001151 Py_INCREF(tmp);
1152 PyTuple_SET_ITEM(args, 1, tmp);
1153
1154 Py_INCREF(self->filename);
1155 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001156
1157 if (self->filename2) {
1158 /*
1159 * This tuple is essentially used as OSError(*args).
1160 * So, to recreate filename2, we need to pass in
1161 * winerror as well.
1162 */
1163 Py_INCREF(Py_None);
1164 PyTuple_SET_ITEM(args, 3, Py_None);
1165
1166 /* filename2 */
1167 Py_INCREF(self->filename2);
1168 PyTuple_SET_ITEM(args, 4, self->filename2);
1169 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001170 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001171 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001172
1173 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001174 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001175 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001176 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001177 Py_DECREF(args);
1178 return res;
1179}
1180
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001181static PyObject *
1182OSError_written_get(PyOSErrorObject *self, void *context)
1183{
1184 if (self->written == -1) {
1185 PyErr_SetString(PyExc_AttributeError, "characters_written");
1186 return NULL;
1187 }
1188 return PyLong_FromSsize_t(self->written);
1189}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001190
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001191static int
1192OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1193{
1194 Py_ssize_t n;
1195 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1196 if (n == -1 && PyErr_Occurred())
1197 return -1;
1198 self->written = n;
1199 return 0;
1200}
1201
1202static PyMemberDef OSError_members[] = {
1203 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1204 PyDoc_STR("POSIX exception code")},
1205 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1206 PyDoc_STR("exception strerror")},
1207 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1208 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001209 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1210 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001211#ifdef MS_WINDOWS
1212 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1213 PyDoc_STR("Win32 exception code")},
1214#endif
1215 {NULL} /* Sentinel */
1216};
1217
1218static PyMethodDef OSError_methods[] = {
1219 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001220 {NULL}
1221};
1222
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001223static PyGetSetDef OSError_getset[] = {
1224 {"characters_written", (getter) OSError_written_get,
1225 (setter) OSError_written_set, NULL},
1226 {NULL}
1227};
1228
1229
1230ComplexExtendsException(PyExc_Exception, OSError,
1231 OSError, OSError_new,
1232 OSError_methods, OSError_members, OSError_getset,
1233 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234 "Base class for I/O related errors.");
1235
1236
1237/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001238 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001239 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001240MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1241 "I/O operation would block.");
1242MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1243 "Connection error.");
1244MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1245 "Child process error.");
1246MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1247 "Broken pipe.");
1248MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1249 "Connection aborted.");
1250MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1251 "Connection refused.");
1252MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1253 "Connection reset.");
1254MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1255 "File already exists.");
1256MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1257 "File not found.");
1258MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1259 "Operation doesn't work on directories.");
1260MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1261 "Operation only works on directories.");
1262MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1263 "Interrupted by signal.");
1264MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1265 "Not enough permissions.");
1266MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1267 "Process not found.");
1268MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1269 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270
1271/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001272 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001273 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001274SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275 "Read beyond end of file.");
1276
1277
1278/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001279 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001280 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001281SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001282 "Unspecified run-time error.");
1283
Yury Selivanovf488fb42015-07-03 01:04:23 -04001284/*
1285 * RecursionError extends RuntimeError
1286 */
1287SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1288 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289
1290/*
1291 * NotImplementedError extends RuntimeError
1292 */
1293SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1294 "Method or function hasn't been implemented yet.");
1295
1296/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001297 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001298 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001299SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001300 "Name not found globally.");
1301
1302/*
1303 * UnboundLocalError extends NameError
1304 */
1305SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1306 "Local name referenced but not bound to a value.");
1307
1308/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001309 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001310 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001311SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001312 "Attribute not found.");
1313
1314
1315/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001316 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001317 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001319/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001320static int _report_missing_parentheses(PySyntaxErrorObject *self);
1321
Thomas Wouters477c8d52006-05-27 19:21:47 +00001322static int
1323SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1324{
1325 PyObject *info = NULL;
1326 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1327
1328 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1329 return -1;
1330
1331 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001332 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001333 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001334 }
1335 if (lenargs == 2) {
1336 info = PyTuple_GET_ITEM(args, 1);
1337 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001338 if (!info)
1339 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001340
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001341 if (PyTuple_GET_SIZE(info) != 4) {
1342 /* not a very good error message, but it's what Python 2.4 gives */
1343 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1344 Py_DECREF(info);
1345 return -1;
1346 }
1347
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001348 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001349 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001350
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001351 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001352 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001354 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001355 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001356
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001357 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001358 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001359
1360 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001361
Martijn Pieters772d8092017-08-22 21:16:23 +01001362 /*
1363 * Issue #21669: Custom error for 'print' & 'exec' as statements
1364 *
1365 * Only applies to SyntaxError instances, not to subclasses such
1366 * as TabError or IndentationError (see issue #31161)
1367 */
1368 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1369 self->text && PyUnicode_Check(self->text) &&
1370 _report_missing_parentheses(self) < 0) {
1371 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001372 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001373 }
1374 return 0;
1375}
1376
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001377static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001378SyntaxError_clear(PySyntaxErrorObject *self)
1379{
1380 Py_CLEAR(self->msg);
1381 Py_CLEAR(self->filename);
1382 Py_CLEAR(self->lineno);
1383 Py_CLEAR(self->offset);
1384 Py_CLEAR(self->text);
1385 Py_CLEAR(self->print_file_and_line);
1386 return BaseException_clear((PyBaseExceptionObject *)self);
1387}
1388
1389static void
1390SyntaxError_dealloc(PySyntaxErrorObject *self)
1391{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001392 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001393 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001394 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001395}
1396
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001397static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001398SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1399{
1400 Py_VISIT(self->msg);
1401 Py_VISIT(self->filename);
1402 Py_VISIT(self->lineno);
1403 Py_VISIT(self->offset);
1404 Py_VISIT(self->text);
1405 Py_VISIT(self->print_file_and_line);
1406 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1407}
1408
1409/* This is called "my_basename" instead of just "basename" to avoid name
1410 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1411 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001412static PyObject*
1413my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001414{
Victor Stinner6237daf2010-04-28 17:26:19 +00001415 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001416 int kind;
1417 void *data;
1418
1419 if (PyUnicode_READY(name))
1420 return NULL;
1421 kind = PyUnicode_KIND(name);
1422 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001423 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001424 offset = 0;
1425 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001426 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001427 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001428 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001429 if (offset != 0)
1430 return PyUnicode_Substring(name, offset, size);
1431 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001432 Py_INCREF(name);
1433 return name;
1434 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001435}
1436
1437
1438static PyObject *
1439SyntaxError_str(PySyntaxErrorObject *self)
1440{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001441 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001442 PyObject *filename;
1443 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001444 /* Below, we always ignore overflow errors, just printing -1.
1445 Still, we cannot allow an OverflowError to be raised, so
1446 we need to call PyLong_AsLongAndOverflow. */
1447 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001448
1449 /* XXX -- do all the additional formatting with filename and
1450 lineno here */
1451
Neal Norwitzed2b7392007-08-26 04:51:10 +00001452 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001453 filename = my_basename(self->filename);
1454 if (filename == NULL)
1455 return NULL;
1456 } else {
1457 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001458 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001459 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001460
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001461 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001462 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001463
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001464 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001465 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001466 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001467 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001469 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001470 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001471 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001472 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001473 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001474 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001475 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001476 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001477 Py_XDECREF(filename);
1478 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001479}
1480
1481static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001482 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1483 PyDoc_STR("exception msg")},
1484 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1485 PyDoc_STR("exception filename")},
1486 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1487 PyDoc_STR("exception lineno")},
1488 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1489 PyDoc_STR("exception offset")},
1490 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1491 PyDoc_STR("exception text")},
1492 {"print_file_and_line", T_OBJECT,
1493 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1494 PyDoc_STR("exception print_file_and_line")},
1495 {NULL} /* Sentinel */
1496};
1497
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001498ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001499 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001500 SyntaxError_str, "Invalid syntax.");
1501
1502
1503/*
1504 * IndentationError extends SyntaxError
1505 */
1506MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1507 "Improper indentation.");
1508
1509
1510/*
1511 * TabError extends IndentationError
1512 */
1513MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1514 "Improper mixture of spaces and tabs.");
1515
1516
1517/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001518 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001519 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001520SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001521 "Base class for lookup errors.");
1522
1523
1524/*
1525 * IndexError extends LookupError
1526 */
1527SimpleExtendsException(PyExc_LookupError, IndexError,
1528 "Sequence index out of range.");
1529
1530
1531/*
1532 * KeyError extends LookupError
1533 */
1534static PyObject *
1535KeyError_str(PyBaseExceptionObject *self)
1536{
1537 /* If args is a tuple of exactly one item, apply repr to args[0].
1538 This is done so that e.g. the exception raised by {}[''] prints
1539 KeyError: ''
1540 rather than the confusing
1541 KeyError
1542 alone. The downside is that if KeyError is raised with an explanatory
1543 string, that string will be displayed in quotes. Too bad.
1544 If args is anything else, use the default BaseException__str__().
1545 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001546 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001547 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001548 }
1549 return BaseException_str(self);
1550}
1551
1552ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001553 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001554
1555
1556/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001557 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001559SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001560 "Inappropriate argument value (of correct type).");
1561
1562/*
1563 * UnicodeError extends ValueError
1564 */
1565
1566SimpleExtendsException(PyExc_ValueError, UnicodeError,
1567 "Unicode related error.");
1568
Thomas Wouters477c8d52006-05-27 19:21:47 +00001569static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001570get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001571{
1572 if (!attr) {
1573 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1574 return NULL;
1575 }
1576
Christian Heimes72b710a2008-05-26 13:28:38 +00001577 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001578 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1579 return NULL;
1580 }
1581 Py_INCREF(attr);
1582 return attr;
1583}
1584
1585static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001586get_unicode(PyObject *attr, const char *name)
1587{
1588 if (!attr) {
1589 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1590 return NULL;
1591 }
1592
1593 if (!PyUnicode_Check(attr)) {
1594 PyErr_Format(PyExc_TypeError,
1595 "%.200s attribute must be unicode", name);
1596 return NULL;
1597 }
1598 Py_INCREF(attr);
1599 return attr;
1600}
1601
Walter Dörwaldd2034312007-05-18 16:29:38 +00001602static int
1603set_unicodefromstring(PyObject **attr, const char *value)
1604{
1605 PyObject *obj = PyUnicode_FromString(value);
1606 if (!obj)
1607 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001608 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001609 return 0;
1610}
1611
Thomas Wouters477c8d52006-05-27 19:21:47 +00001612PyObject *
1613PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1614{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001615 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001616}
1617
1618PyObject *
1619PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1620{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001621 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001622}
1623
1624PyObject *
1625PyUnicodeEncodeError_GetObject(PyObject *exc)
1626{
1627 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1628}
1629
1630PyObject *
1631PyUnicodeDecodeError_GetObject(PyObject *exc)
1632{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001633 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001634}
1635
1636PyObject *
1637PyUnicodeTranslateError_GetObject(PyObject *exc)
1638{
1639 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1640}
1641
1642int
1643PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1644{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001645 Py_ssize_t size;
1646 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1647 "object");
1648 if (!obj)
1649 return -1;
1650 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001651 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001652 if (*start<0)
1653 *start = 0; /*XXX check for values <0*/
1654 if (*start>=size)
1655 *start = size-1;
1656 Py_DECREF(obj);
1657 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001658}
1659
1660
1661int
1662PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1663{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001664 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001665 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001666 if (!obj)
1667 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001668 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001669 *start = ((PyUnicodeErrorObject *)exc)->start;
1670 if (*start<0)
1671 *start = 0;
1672 if (*start>=size)
1673 *start = size-1;
1674 Py_DECREF(obj);
1675 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001676}
1677
1678
1679int
1680PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1681{
1682 return PyUnicodeEncodeError_GetStart(exc, start);
1683}
1684
1685
1686int
1687PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1688{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001689 ((PyUnicodeErrorObject *)exc)->start = start;
1690 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001691}
1692
1693
1694int
1695PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1696{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001697 ((PyUnicodeErrorObject *)exc)->start = start;
1698 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699}
1700
1701
1702int
1703PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1704{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001705 ((PyUnicodeErrorObject *)exc)->start = start;
1706 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001707}
1708
1709
1710int
1711PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1712{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001713 Py_ssize_t size;
1714 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1715 "object");
1716 if (!obj)
1717 return -1;
1718 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001719 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001720 if (*end<1)
1721 *end = 1;
1722 if (*end>size)
1723 *end = size;
1724 Py_DECREF(obj);
1725 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001726}
1727
1728
1729int
1730PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1731{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001732 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001733 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001734 if (!obj)
1735 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001736 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001737 *end = ((PyUnicodeErrorObject *)exc)->end;
1738 if (*end<1)
1739 *end = 1;
1740 if (*end>size)
1741 *end = size;
1742 Py_DECREF(obj);
1743 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001744}
1745
1746
1747int
1748PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1749{
1750 return PyUnicodeEncodeError_GetEnd(exc, start);
1751}
1752
1753
1754int
1755PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1756{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001757 ((PyUnicodeErrorObject *)exc)->end = end;
1758 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759}
1760
1761
1762int
1763PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1764{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001765 ((PyUnicodeErrorObject *)exc)->end = end;
1766 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001767}
1768
1769
1770int
1771PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1772{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001773 ((PyUnicodeErrorObject *)exc)->end = end;
1774 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775}
1776
1777PyObject *
1778PyUnicodeEncodeError_GetReason(PyObject *exc)
1779{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001780 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001781}
1782
1783
1784PyObject *
1785PyUnicodeDecodeError_GetReason(PyObject *exc)
1786{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001787 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788}
1789
1790
1791PyObject *
1792PyUnicodeTranslateError_GetReason(PyObject *exc)
1793{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001794 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001795}
1796
1797
1798int
1799PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1800{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001801 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1802 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803}
1804
1805
1806int
1807PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1808{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001809 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1810 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001811}
1812
1813
1814int
1815PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1816{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001817 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1818 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819}
1820
1821
Thomas Wouters477c8d52006-05-27 19:21:47 +00001822static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823UnicodeError_clear(PyUnicodeErrorObject *self)
1824{
1825 Py_CLEAR(self->encoding);
1826 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001827 Py_CLEAR(self->reason);
1828 return BaseException_clear((PyBaseExceptionObject *)self);
1829}
1830
1831static void
1832UnicodeError_dealloc(PyUnicodeErrorObject *self)
1833{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001834 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001836 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837}
1838
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001839static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001840UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1841{
1842 Py_VISIT(self->encoding);
1843 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844 Py_VISIT(self->reason);
1845 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1846}
1847
1848static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1850 PyDoc_STR("exception encoding")},
1851 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1852 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001853 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001855 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001856 PyDoc_STR("exception end")},
1857 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1858 PyDoc_STR("exception reason")},
1859 {NULL} /* Sentinel */
1860};
1861
1862
1863/*
1864 * UnicodeEncodeError extends UnicodeError
1865 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001866
1867static int
1868UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1869{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001870 PyUnicodeErrorObject *err;
1871
Thomas Wouters477c8d52006-05-27 19:21:47 +00001872 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1873 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001874
1875 err = (PyUnicodeErrorObject *)self;
1876
1877 Py_CLEAR(err->encoding);
1878 Py_CLEAR(err->object);
1879 Py_CLEAR(err->reason);
1880
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001881 if (!PyArg_ParseTuple(args, "UUnnU",
1882 &err->encoding, &err->object,
1883 &err->start, &err->end, &err->reason)) {
1884 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001885 return -1;
1886 }
1887
Guido van Rossum98297ee2007-11-06 21:34:58 +00001888 Py_INCREF(err->encoding);
1889 Py_INCREF(err->object);
1890 Py_INCREF(err->reason);
1891
1892 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893}
1894
1895static PyObject *
1896UnicodeEncodeError_str(PyObject *self)
1897{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001898 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001899 PyObject *result = NULL;
1900 PyObject *reason_str = NULL;
1901 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001902
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001903 if (!uself->object)
1904 /* Not properly initialized. */
1905 return PyUnicode_FromString("");
1906
Eric Smith0facd772010-02-24 15:42:29 +00001907 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001908 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001909 reason_str = PyObject_Str(uself->reason);
1910 if (reason_str == NULL)
1911 goto done;
1912 encoding_str = PyObject_Str(uself->encoding);
1913 if (encoding_str == NULL)
1914 goto done;
1915
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001916 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1917 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001918 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001919 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001920 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001921 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001922 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001923 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001924 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001925 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001926 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001927 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001928 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001929 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001930 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931 }
Eric Smith0facd772010-02-24 15:42:29 +00001932 else {
1933 result = PyUnicode_FromFormat(
1934 "'%U' codec can't encode characters in position %zd-%zd: %U",
1935 encoding_str,
1936 uself->start,
1937 uself->end-1,
1938 reason_str);
1939 }
1940done:
1941 Py_XDECREF(reason_str);
1942 Py_XDECREF(encoding_str);
1943 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944}
1945
1946static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001947 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001948 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001949 sizeof(PyUnicodeErrorObject), 0,
1950 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1951 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1952 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001953 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1954 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001955 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001956 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957};
1958PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1959
1960PyObject *
1961PyUnicodeEncodeError_Create(
1962 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1963 Py_ssize_t start, Py_ssize_t end, const char *reason)
1964{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001965 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001966 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001967}
1968
1969
1970/*
1971 * UnicodeDecodeError extends UnicodeError
1972 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973
1974static int
1975UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1976{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001977 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001978
Thomas Wouters477c8d52006-05-27 19:21:47 +00001979 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1980 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001981
1982 ude = (PyUnicodeErrorObject *)self;
1983
1984 Py_CLEAR(ude->encoding);
1985 Py_CLEAR(ude->object);
1986 Py_CLEAR(ude->reason);
1987
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001988 if (!PyArg_ParseTuple(args, "UOnnU",
1989 &ude->encoding, &ude->object,
1990 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001991 ude->encoding = ude->object = ude->reason = NULL;
1992 return -1;
1993 }
1994
Guido van Rossum98297ee2007-11-06 21:34:58 +00001995 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001996 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001997 Py_INCREF(ude->reason);
1998
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001999 if (!PyBytes_Check(ude->object)) {
2000 Py_buffer view;
2001 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2002 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002003 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002004 PyBuffer_Release(&view);
2005 if (!ude->object)
2006 goto error;
2007 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002008 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002009
2010error:
2011 Py_CLEAR(ude->encoding);
2012 Py_CLEAR(ude->object);
2013 Py_CLEAR(ude->reason);
2014 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002015}
2016
2017static PyObject *
2018UnicodeDecodeError_str(PyObject *self)
2019{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002020 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002021 PyObject *result = NULL;
2022 PyObject *reason_str = NULL;
2023 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002024
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002025 if (!uself->object)
2026 /* Not properly initialized. */
2027 return PyUnicode_FromString("");
2028
Eric Smith0facd772010-02-24 15:42:29 +00002029 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002030 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002031 reason_str = PyObject_Str(uself->reason);
2032 if (reason_str == NULL)
2033 goto done;
2034 encoding_str = PyObject_Str(uself->encoding);
2035 if (encoding_str == NULL)
2036 goto done;
2037
2038 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002039 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002040 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002041 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002042 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002043 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002044 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002045 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002046 }
Eric Smith0facd772010-02-24 15:42:29 +00002047 else {
2048 result = PyUnicode_FromFormat(
2049 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2050 encoding_str,
2051 uself->start,
2052 uself->end-1,
2053 reason_str
2054 );
2055 }
2056done:
2057 Py_XDECREF(reason_str);
2058 Py_XDECREF(encoding_str);
2059 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060}
2061
2062static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002063 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002064 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002065 sizeof(PyUnicodeErrorObject), 0,
2066 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2067 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2068 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002069 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2070 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002071 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002072 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002073};
2074PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2075
2076PyObject *
2077PyUnicodeDecodeError_Create(
2078 const char *encoding, const char *object, Py_ssize_t length,
2079 Py_ssize_t start, Py_ssize_t end, const char *reason)
2080{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002081 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002082 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002083}
2084
2085
2086/*
2087 * UnicodeTranslateError extends UnicodeError
2088 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002089
2090static int
2091UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2092 PyObject *kwds)
2093{
2094 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2095 return -1;
2096
2097 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002098 Py_CLEAR(self->reason);
2099
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002100 if (!PyArg_ParseTuple(args, "UnnU",
2101 &self->object,
2102 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002103 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 return -1;
2105 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002106
Thomas Wouters477c8d52006-05-27 19:21:47 +00002107 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002108 Py_INCREF(self->reason);
2109
2110 return 0;
2111}
2112
2113
2114static PyObject *
2115UnicodeTranslateError_str(PyObject *self)
2116{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002117 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002118 PyObject *result = NULL;
2119 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002120
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002121 if (!uself->object)
2122 /* Not properly initialized. */
2123 return PyUnicode_FromString("");
2124
Eric Smith0facd772010-02-24 15:42:29 +00002125 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002126 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002127 reason_str = PyObject_Str(uself->reason);
2128 if (reason_str == NULL)
2129 goto done;
2130
Victor Stinner53b33e72011-11-21 01:17:27 +01002131 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2132 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002133 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002134 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002135 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002136 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002137 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002138 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002139 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002140 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002141 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002142 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002143 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002144 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002145 );
Eric Smith0facd772010-02-24 15:42:29 +00002146 } else {
2147 result = PyUnicode_FromFormat(
2148 "can't translate characters in position %zd-%zd: %U",
2149 uself->start,
2150 uself->end-1,
2151 reason_str
2152 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002153 }
Eric Smith0facd772010-02-24 15:42:29 +00002154done:
2155 Py_XDECREF(reason_str);
2156 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002157}
2158
2159static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002160 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002161 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162 sizeof(PyUnicodeErrorObject), 0,
2163 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2164 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2165 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002166 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002167 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2168 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002169 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002170};
2171PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2172
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002173/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002174PyObject *
2175PyUnicodeTranslateError_Create(
2176 const Py_UNICODE *object, Py_ssize_t length,
2177 Py_ssize_t start, Py_ssize_t end, const char *reason)
2178{
2179 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002180 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002181}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002182
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002183PyObject *
2184_PyUnicodeTranslateError_Create(
2185 PyObject *object,
2186 Py_ssize_t start, Py_ssize_t end, const char *reason)
2187{
Victor Stinner69598d42014-04-04 20:59:44 +02002188 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002189 object, start, end, reason);
2190}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002191
2192/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002193 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002194 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002195SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196 "Assertion failed.");
2197
2198
2199/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002200 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002201 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002202SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002203 "Base class for arithmetic errors.");
2204
2205
2206/*
2207 * FloatingPointError extends ArithmeticError
2208 */
2209SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2210 "Floating point operation failed.");
2211
2212
2213/*
2214 * OverflowError extends ArithmeticError
2215 */
2216SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2217 "Result too large to be represented.");
2218
2219
2220/*
2221 * ZeroDivisionError extends ArithmeticError
2222 */
2223SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2224 "Second argument to a division or modulo operation was zero.");
2225
2226
2227/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002228 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002229 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002230SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002231 "Internal error in the Python interpreter.\n"
2232 "\n"
2233 "Please report this to the Python maintainer, along with the traceback,\n"
2234 "the Python version, and the hardware/OS platform and version.");
2235
2236
2237/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002238 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002239 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002240SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002241 "Weak ref proxy used after referent went away.");
2242
2243
2244/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002245 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002246 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002247
2248#define MEMERRORS_SAVE 16
2249static PyBaseExceptionObject *memerrors_freelist = NULL;
2250static int memerrors_numfree = 0;
2251
2252static PyObject *
2253MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2254{
2255 PyBaseExceptionObject *self;
2256
2257 if (type != (PyTypeObject *) PyExc_MemoryError)
2258 return BaseException_new(type, args, kwds);
2259 if (memerrors_freelist == NULL)
2260 return BaseException_new(type, args, kwds);
2261 /* Fetch object from freelist and revive it */
2262 self = memerrors_freelist;
2263 self->args = PyTuple_New(0);
2264 /* This shouldn't happen since the empty tuple is persistent */
2265 if (self->args == NULL)
2266 return NULL;
2267 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2268 memerrors_numfree--;
2269 self->dict = NULL;
2270 _Py_NewReference((PyObject *)self);
2271 _PyObject_GC_TRACK(self);
2272 return (PyObject *)self;
2273}
2274
2275static void
2276MemoryError_dealloc(PyBaseExceptionObject *self)
2277{
2278 _PyObject_GC_UNTRACK(self);
2279 BaseException_clear(self);
2280 if (memerrors_numfree >= MEMERRORS_SAVE)
2281 Py_TYPE(self)->tp_free((PyObject *)self);
2282 else {
2283 self->dict = (PyObject *) memerrors_freelist;
2284 memerrors_freelist = self;
2285 memerrors_numfree++;
2286 }
2287}
2288
2289static void
2290preallocate_memerrors(void)
2291{
2292 /* We create enough MemoryErrors and then decref them, which will fill
2293 up the freelist. */
2294 int i;
2295 PyObject *errors[MEMERRORS_SAVE];
2296 for (i = 0; i < MEMERRORS_SAVE; i++) {
2297 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2298 NULL, NULL);
2299 if (!errors[i])
2300 Py_FatalError("Could not preallocate MemoryError object");
2301 }
2302 for (i = 0; i < MEMERRORS_SAVE; i++) {
2303 Py_DECREF(errors[i]);
2304 }
2305}
2306
2307static void
2308free_preallocated_memerrors(void)
2309{
2310 while (memerrors_freelist != NULL) {
2311 PyObject *self = (PyObject *) memerrors_freelist;
2312 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2313 Py_TYPE(self)->tp_free((PyObject *)self);
2314 }
2315}
2316
2317
2318static PyTypeObject _PyExc_MemoryError = {
2319 PyVarObject_HEAD_INIT(NULL, 0)
2320 "MemoryError",
2321 sizeof(PyBaseExceptionObject),
2322 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2323 0, 0, 0, 0, 0, 0, 0,
2324 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2325 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2326 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2327 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2328 (initproc)BaseException_init, 0, MemoryError_new
2329};
2330PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2331
Thomas Wouters477c8d52006-05-27 19:21:47 +00002332
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002333/*
2334 * BufferError extends Exception
2335 */
2336SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2337
Thomas Wouters477c8d52006-05-27 19:21:47 +00002338
2339/* Warning category docstrings */
2340
2341/*
2342 * Warning extends Exception
2343 */
2344SimpleExtendsException(PyExc_Exception, Warning,
2345 "Base class for warning categories.");
2346
2347
2348/*
2349 * UserWarning extends Warning
2350 */
2351SimpleExtendsException(PyExc_Warning, UserWarning,
2352 "Base class for warnings generated by user code.");
2353
2354
2355/*
2356 * DeprecationWarning extends Warning
2357 */
2358SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2359 "Base class for warnings about deprecated features.");
2360
2361
2362/*
2363 * PendingDeprecationWarning extends Warning
2364 */
2365SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2366 "Base class for warnings about features which will be deprecated\n"
2367 "in the future.");
2368
2369
2370/*
2371 * SyntaxWarning extends Warning
2372 */
2373SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2374 "Base class for warnings about dubious syntax.");
2375
2376
2377/*
2378 * RuntimeWarning extends Warning
2379 */
2380SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2381 "Base class for warnings about dubious runtime behavior.");
2382
2383
2384/*
2385 * FutureWarning extends Warning
2386 */
2387SimpleExtendsException(PyExc_Warning, FutureWarning,
2388 "Base class for warnings about constructs that will change semantically\n"
2389 "in the future.");
2390
2391
2392/*
2393 * ImportWarning extends Warning
2394 */
2395SimpleExtendsException(PyExc_Warning, ImportWarning,
2396 "Base class for warnings about probable mistakes in module imports");
2397
2398
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002399/*
2400 * UnicodeWarning extends Warning
2401 */
2402SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2403 "Base class for warnings about Unicode related problems, mostly\n"
2404 "related to conversion problems.");
2405
Georg Brandl08be72d2010-10-24 15:11:22 +00002406
Guido van Rossum98297ee2007-11-06 21:34:58 +00002407/*
2408 * BytesWarning extends Warning
2409 */
2410SimpleExtendsException(PyExc_Warning, BytesWarning,
2411 "Base class for warnings about bytes and buffer related problems, mostly\n"
2412 "related to conversion from str or comparing to str.");
2413
2414
Georg Brandl08be72d2010-10-24 15:11:22 +00002415/*
2416 * ResourceWarning extends Warning
2417 */
2418SimpleExtendsException(PyExc_Warning, ResourceWarning,
2419 "Base class for warnings about resource usage.");
2420
2421
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002422
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002423#define PRE_INIT(TYPE) \
2424 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2425 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2426 Py_FatalError("exceptions bootstrapping error."); \
2427 Py_INCREF(PyExc_ ## TYPE); \
2428 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002429
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002430#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002431 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2432 Py_FatalError("Module dictionary insertion problem.");
2433
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002434#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002435 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002436 PyExc_ ## NAME = PyExc_ ## TYPE; \
2437 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2438 Py_FatalError("Module dictionary insertion problem.");
2439
2440#define ADD_ERRNO(TYPE, CODE) { \
2441 PyObject *_code = PyLong_FromLong(CODE); \
2442 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2443 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2444 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002445 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002446 }
2447
2448#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002449#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002450/* The following constants were added to errno.h in VS2010 but have
2451 preferred WSA equivalents. */
2452#undef EADDRINUSE
2453#undef EADDRNOTAVAIL
2454#undef EAFNOSUPPORT
2455#undef EALREADY
2456#undef ECONNABORTED
2457#undef ECONNREFUSED
2458#undef ECONNRESET
2459#undef EDESTADDRREQ
2460#undef EHOSTUNREACH
2461#undef EINPROGRESS
2462#undef EISCONN
2463#undef ELOOP
2464#undef EMSGSIZE
2465#undef ENETDOWN
2466#undef ENETRESET
2467#undef ENETUNREACH
2468#undef ENOBUFS
2469#undef ENOPROTOOPT
2470#undef ENOTCONN
2471#undef ENOTSOCK
2472#undef EOPNOTSUPP
2473#undef EPROTONOSUPPORT
2474#undef EPROTOTYPE
2475#undef ETIMEDOUT
2476#undef EWOULDBLOCK
2477
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002478#if defined(WSAEALREADY) && !defined(EALREADY)
2479#define EALREADY WSAEALREADY
2480#endif
2481#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2482#define ECONNABORTED WSAECONNABORTED
2483#endif
2484#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2485#define ECONNREFUSED WSAECONNREFUSED
2486#endif
2487#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2488#define ECONNRESET WSAECONNRESET
2489#endif
2490#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2491#define EINPROGRESS WSAEINPROGRESS
2492#endif
2493#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2494#define ESHUTDOWN WSAESHUTDOWN
2495#endif
2496#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2497#define ETIMEDOUT WSAETIMEDOUT
2498#endif
2499#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2500#define EWOULDBLOCK WSAEWOULDBLOCK
2501#endif
2502#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002503
Martin v. Löwis1a214512008-06-11 05:26:20 +00002504void
Brett Cannonfd074152012-04-14 14:10:13 -04002505_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506{
Brett Cannonfd074152012-04-14 14:10:13 -04002507 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002508
2509 PRE_INIT(BaseException)
2510 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002511 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002512 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513 PRE_INIT(StopIteration)
2514 PRE_INIT(GeneratorExit)
2515 PRE_INIT(SystemExit)
2516 PRE_INIT(KeyboardInterrupt)
2517 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002518 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002519 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002520 PRE_INIT(EOFError)
2521 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002522 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002523 PRE_INIT(NotImplementedError)
2524 PRE_INIT(NameError)
2525 PRE_INIT(UnboundLocalError)
2526 PRE_INIT(AttributeError)
2527 PRE_INIT(SyntaxError)
2528 PRE_INIT(IndentationError)
2529 PRE_INIT(TabError)
2530 PRE_INIT(LookupError)
2531 PRE_INIT(IndexError)
2532 PRE_INIT(KeyError)
2533 PRE_INIT(ValueError)
2534 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002535 PRE_INIT(UnicodeEncodeError)
2536 PRE_INIT(UnicodeDecodeError)
2537 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538 PRE_INIT(AssertionError)
2539 PRE_INIT(ArithmeticError)
2540 PRE_INIT(FloatingPointError)
2541 PRE_INIT(OverflowError)
2542 PRE_INIT(ZeroDivisionError)
2543 PRE_INIT(SystemError)
2544 PRE_INIT(ReferenceError)
2545 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002546 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002547 PRE_INIT(Warning)
2548 PRE_INIT(UserWarning)
2549 PRE_INIT(DeprecationWarning)
2550 PRE_INIT(PendingDeprecationWarning)
2551 PRE_INIT(SyntaxWarning)
2552 PRE_INIT(RuntimeWarning)
2553 PRE_INIT(FutureWarning)
2554 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002555 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002556 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002557 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002558
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002559 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002560 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002561
Louie Luc4318542017-03-29 13:28:15 +08002562 PRE_INIT(BlockingIOError)
2563 PRE_INIT(BrokenPipeError)
2564 PRE_INIT(ChildProcessError)
2565 PRE_INIT(ConnectionAbortedError)
2566 PRE_INIT(ConnectionRefusedError)
2567 PRE_INIT(ConnectionResetError)
2568 PRE_INIT(FileExistsError)
2569 PRE_INIT(FileNotFoundError)
2570 PRE_INIT(IsADirectoryError)
2571 PRE_INIT(NotADirectoryError)
2572 PRE_INIT(InterruptedError)
2573 PRE_INIT(PermissionError)
2574 PRE_INIT(ProcessLookupError)
2575 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002576
Thomas Wouters477c8d52006-05-27 19:21:47 +00002577 bdict = PyModule_GetDict(bltinmod);
2578 if (bdict == NULL)
2579 Py_FatalError("exceptions bootstrapping error.");
2580
2581 POST_INIT(BaseException)
2582 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002583 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002584 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002585 POST_INIT(StopIteration)
2586 POST_INIT(GeneratorExit)
2587 POST_INIT(SystemExit)
2588 POST_INIT(KeyboardInterrupt)
2589 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002590 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002592 INIT_ALIAS(EnvironmentError, OSError)
2593 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002595 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002596#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597 POST_INIT(EOFError)
2598 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002599 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002600 POST_INIT(NotImplementedError)
2601 POST_INIT(NameError)
2602 POST_INIT(UnboundLocalError)
2603 POST_INIT(AttributeError)
2604 POST_INIT(SyntaxError)
2605 POST_INIT(IndentationError)
2606 POST_INIT(TabError)
2607 POST_INIT(LookupError)
2608 POST_INIT(IndexError)
2609 POST_INIT(KeyError)
2610 POST_INIT(ValueError)
2611 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612 POST_INIT(UnicodeEncodeError)
2613 POST_INIT(UnicodeDecodeError)
2614 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002615 POST_INIT(AssertionError)
2616 POST_INIT(ArithmeticError)
2617 POST_INIT(FloatingPointError)
2618 POST_INIT(OverflowError)
2619 POST_INIT(ZeroDivisionError)
2620 POST_INIT(SystemError)
2621 POST_INIT(ReferenceError)
2622 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002623 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002624 POST_INIT(Warning)
2625 POST_INIT(UserWarning)
2626 POST_INIT(DeprecationWarning)
2627 POST_INIT(PendingDeprecationWarning)
2628 POST_INIT(SyntaxWarning)
2629 POST_INIT(RuntimeWarning)
2630 POST_INIT(FutureWarning)
2631 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002632 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002633 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002634 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002635
Antoine Pitrouac456a12012-01-18 21:35:21 +01002636 if (!errnomap) {
2637 errnomap = PyDict_New();
2638 if (!errnomap)
2639 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2640 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002641
2642 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002643 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002644
Louie Luc4318542017-03-29 13:28:15 +08002645 POST_INIT(BlockingIOError)
2646 ADD_ERRNO(BlockingIOError, EAGAIN)
2647 ADD_ERRNO(BlockingIOError, EALREADY)
2648 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2649 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2650 POST_INIT(BrokenPipeError)
2651 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002652#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002653 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002654#endif
Louie Luc4318542017-03-29 13:28:15 +08002655 POST_INIT(ChildProcessError)
2656 ADD_ERRNO(ChildProcessError, ECHILD)
2657 POST_INIT(ConnectionAbortedError)
2658 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2659 POST_INIT(ConnectionRefusedError)
2660 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2661 POST_INIT(ConnectionResetError)
2662 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2663 POST_INIT(FileExistsError)
2664 ADD_ERRNO(FileExistsError, EEXIST)
2665 POST_INIT(FileNotFoundError)
2666 ADD_ERRNO(FileNotFoundError, ENOENT)
2667 POST_INIT(IsADirectoryError)
2668 ADD_ERRNO(IsADirectoryError, EISDIR)
2669 POST_INIT(NotADirectoryError)
2670 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2671 POST_INIT(InterruptedError)
2672 ADD_ERRNO(InterruptedError, EINTR)
2673 POST_INIT(PermissionError)
2674 ADD_ERRNO(PermissionError, EACCES)
2675 ADD_ERRNO(PermissionError, EPERM)
2676 POST_INIT(ProcessLookupError)
2677 ADD_ERRNO(ProcessLookupError, ESRCH)
2678 POST_INIT(TimeoutError)
2679 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002680
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002681 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002682}
2683
2684void
2685_PyExc_Fini(void)
2686{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002687 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002688 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002689}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002690
2691/* Helper to do the equivalent of "raise X from Y" in C, but always using
2692 * the current exception rather than passing one in.
2693 *
2694 * We currently limit this to *only* exceptions that use the BaseException
2695 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2696 * those correctly without losing data and without losing backwards
2697 * compatibility.
2698 *
2699 * We also aim to rule out *all* exceptions that might be storing additional
2700 * state, whether by having a size difference relative to BaseException,
2701 * additional arguments passed in during construction or by having a
2702 * non-empty instance dict.
2703 *
2704 * We need to be very careful with what we wrap, since changing types to
2705 * a broader exception type would be backwards incompatible for
2706 * existing codecs, and with different init or new method implementations
2707 * may either not support instantiation with PyErr_Format or lose
2708 * information when instantiated that way.
2709 *
2710 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2711 * fact that exceptions are expected to support pickling. If more builtin
2712 * exceptions (e.g. AttributeError) start to be converted to rich
2713 * exceptions with additional attributes, that's probably a better approach
2714 * to pursue over adding special cases for particular stateful subclasses.
2715 *
2716 * Returns a borrowed reference to the new exception (if any), NULL if the
2717 * existing exception was left in place.
2718 */
2719PyObject *
2720_PyErr_TrySetFromCause(const char *format, ...)
2721{
2722 PyObject* msg_prefix;
2723 PyObject *exc, *val, *tb;
2724 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002725 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002726 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002727 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002728 PyObject *new_exc, *new_val, *new_tb;
2729 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002730 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002731
Nick Coghlan8b097b42013-11-13 23:49:21 +10002732 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002733 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002734 /* Ensure type info indicates no extra state is stored at the C level
2735 * and that the type can be reinstantiated using PyErr_Format
2736 */
2737 caught_type_size = caught_type->tp_basicsize;
2738 base_exc_size = _PyExc_BaseException.tp_basicsize;
2739 same_basic_size = (
2740 caught_type_size == base_exc_size ||
2741 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002742 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002743 )
2744 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002745 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002746 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002747 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002748 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002749 /* We can't be sure we can wrap this safely, since it may contain
2750 * more state than just the exception type. Accordingly, we just
2751 * leave it alone.
2752 */
2753 PyErr_Restore(exc, val, tb);
2754 return NULL;
2755 }
2756
2757 /* Check the args are empty or contain a single string */
2758 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002759 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002760 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002761 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002762 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002763 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002764 /* More than 1 arg, or the one arg we do have isn't a string
2765 */
2766 PyErr_Restore(exc, val, tb);
2767 return NULL;
2768 }
2769
2770 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002771 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002772 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002773 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002774 /* While we could potentially copy a non-empty instance dictionary
2775 * to the replacement exception, for now we take the more
2776 * conservative path of leaving exceptions with attributes set
2777 * alone.
2778 */
2779 PyErr_Restore(exc, val, tb);
2780 return NULL;
2781 }
2782
2783 /* For exceptions that we can wrap safely, we chain the original
2784 * exception to a new one of the exact same type with an
2785 * error message that mentions the additional details and the
2786 * original exception.
2787 *
2788 * It would be nice to wrap OSError and various other exception
2789 * types as well, but that's quite a bit trickier due to the extra
2790 * state potentially stored on OSError instances.
2791 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002792 /* Ensure the traceback is set correctly on the existing exception */
2793 if (tb != NULL) {
2794 PyException_SetTraceback(val, tb);
2795 Py_DECREF(tb);
2796 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002797
Christian Heimes507eabd2013-11-14 01:39:35 +01002798#ifdef HAVE_STDARG_PROTOTYPES
2799 va_start(vargs, format);
2800#else
2801 va_start(vargs);
2802#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002803 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002804 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002805 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002806 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002807 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002808 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002809 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002810
2811 PyErr_Format(exc, "%U (%s: %S)",
2812 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002813 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002814 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002815 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2816 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2817 PyException_SetCause(new_val, val);
2818 PyErr_Restore(new_exc, new_val, new_tb);
2819 return new_val;
2820}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002821
2822
2823/* To help with migration from Python 2, SyntaxError.__init__ applies some
2824 * heuristics to try to report a more meaningful exception when print and
2825 * exec are used like statements.
2826 *
2827 * The heuristics are currently expected to detect the following cases:
2828 * - top level statement
2829 * - statement in a nested suite
2830 * - trailing section of a one line complex statement
2831 *
2832 * They're currently known not to trigger:
2833 * - after a semi-colon
2834 *
2835 * The error message can be a bit odd in cases where the "arguments" are
2836 * completely illegal syntactically, but that isn't worth the hassle of
2837 * fixing.
2838 *
2839 * We also can't do anything about cases that are legal Python 3 syntax
2840 * but mean something entirely different from what they did in Python 2
2841 * (omitting the arguments entirely, printing items preceded by a unary plus
2842 * or minus, using the stream redirection syntax).
2843 */
2844
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302845
2846// Static helper for setting legacy print error message
2847static int
2848_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2849{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302850 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302851 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302852 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302853 Py_ssize_t start_pos = start + PRINT_OFFSET;
2854 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2855 Py_UCS4 semicolon = ';';
2856 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2857 start_pos, text_len, 1);
2858 if (end_pos < -1) {
2859 return -1;
2860 } else if (end_pos == -1) {
2861 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302862 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302863
2864 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302865 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302866 return -1;
2867 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302868
2869 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2870 if (strip_sep_obj == NULL) {
2871 Py_DECREF(data);
2872 return -1;
2873 }
2874
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302875 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302876 Py_DECREF(data);
2877 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302878 if (new_data == NULL) {
2879 return -1;
2880 }
2881 // gets the modified text_len after stripping `print `
2882 text_len = PyUnicode_GET_LENGTH(new_data);
2883 const char *maybe_end_arg = "";
2884 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2885 maybe_end_arg = " end=\" \"";
2886 }
2887 PyObject *error_msg = PyUnicode_FromFormat(
2888 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2889 new_data, maybe_end_arg
2890 );
2891 Py_DECREF(new_data);
2892 if (error_msg == NULL)
2893 return -1;
2894
2895 Py_XSETREF(self->msg, error_msg);
2896 return 1;
2897}
2898
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002899static int
2900_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2901{
2902 /* Return values:
2903 * -1: an error occurred
2904 * 0: nothing happened
2905 * 1: the check triggered & the error message was changed
2906 */
2907 static PyObject *print_prefix = NULL;
2908 static PyObject *exec_prefix = NULL;
2909 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2910 int kind = PyUnicode_KIND(self->text);
2911 void *data = PyUnicode_DATA(self->text);
2912
2913 /* Ignore leading whitespace */
2914 while (start < text_len) {
2915 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2916 if (!Py_UNICODE_ISSPACE(ch))
2917 break;
2918 start++;
2919 }
2920 /* Checking against an empty or whitespace-only part of the string */
2921 if (start == text_len) {
2922 return 0;
2923 }
2924
2925 /* Check for legacy print statements */
2926 if (print_prefix == NULL) {
2927 print_prefix = PyUnicode_InternFromString("print ");
2928 if (print_prefix == NULL) {
2929 return -1;
2930 }
2931 }
2932 if (PyUnicode_Tailmatch(self->text, print_prefix,
2933 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302934
2935 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002936 }
2937
2938 /* Check for legacy exec statements */
2939 if (exec_prefix == NULL) {
2940 exec_prefix = PyUnicode_InternFromString("exec ");
2941 if (exec_prefix == NULL) {
2942 return -1;
2943 }
2944 }
2945 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2946 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002947 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002948 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002949 return 1;
2950 }
2951 /* Fall back to the default error message */
2952 return 0;
2953}
2954
2955static int
2956_report_missing_parentheses(PySyntaxErrorObject *self)
2957{
2958 Py_UCS4 left_paren = 40;
2959 Py_ssize_t left_paren_index;
2960 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2961 int legacy_check_result = 0;
2962
2963 /* Skip entirely if there is an opening parenthesis */
2964 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2965 0, text_len, 1);
2966 if (left_paren_index < -1) {
2967 return -1;
2968 }
2969 if (left_paren_index != -1) {
2970 /* Use default error message for any line with an opening paren */
2971 return 0;
2972 }
2973 /* Handle the simple statement case */
2974 legacy_check_result = _check_for_legacy_statements(self, 0);
2975 if (legacy_check_result < 0) {
2976 return -1;
2977
2978 }
2979 if (legacy_check_result == 0) {
2980 /* Handle the one-line complex statement case */
2981 Py_UCS4 colon = 58;
2982 Py_ssize_t colon_index;
2983 colon_index = PyUnicode_FindChar(self->text, colon,
2984 0, text_len, 1);
2985 if (colon_index < -1) {
2986 return -1;
2987 }
2988 if (colon_index >= 0 && colon_index < text_len) {
2989 /* Check again, starting from just after the colon */
2990 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2991 return -1;
2992 }
2993 }
2994 }
2995 return 0;
2996}