blob: 1b70be786a46a9428936239e4345a24cf87c7c8e [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 Storchakac6792272013-10-19 21:03:34 +0300119 const char *name;
120 const char *dot;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000121
Serhiy Storchakac6792272013-10-19 21:03:34 +0300122 name = Py_TYPE(self)->tp_name;
123 dot = (const char *) strrchr(name, '.');
Thomas Wouters477c8d52006-05-27 19:21:47 +0000124 if (dot != NULL) name = dot+1;
125
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000126 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127}
128
129/* Pickling support */
130static PyObject *
131BaseException_reduce(PyBaseExceptionObject *self)
132{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000135 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000136 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000137}
138
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000139/*
140 * Needed for backward compatibility, since exceptions used to store
141 * all their attributes in the __dict__. Code is taken from cPickle's
142 * load_build function.
143 */
144static PyObject *
145BaseException_setstate(PyObject *self, PyObject *state)
146{
147 PyObject *d_key, *d_value;
148 Py_ssize_t i = 0;
149
150 if (state != Py_None) {
151 if (!PyDict_Check(state)) {
152 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
153 return NULL;
154 }
155 while (PyDict_Next(state, &i, &d_key, &d_value)) {
156 if (PyObject_SetAttr(self, d_key, d_value) < 0)
157 return NULL;
158 }
159 }
160 Py_RETURN_NONE;
161}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000162
Collin Winter828f04a2007-08-31 00:04:24 +0000163static PyObject *
164BaseException_with_traceback(PyObject *self, PyObject *tb) {
165 if (PyException_SetTraceback(self, tb))
166 return NULL;
167
168 Py_INCREF(self);
169 return self;
170}
171
Georg Brandl76941002008-05-05 21:38:47 +0000172PyDoc_STRVAR(with_traceback_doc,
173"Exception.with_traceback(tb) --\n\
174 set self.__traceback__ to tb and return self.");
175
Thomas Wouters477c8d52006-05-27 19:21:47 +0000176
177static PyMethodDef BaseException_methods[] = {
178 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000179 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000180 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
181 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000182 {NULL, NULL, 0, NULL},
183};
184
Thomas Wouters477c8d52006-05-27 19:21:47 +0000185static PyObject *
186BaseException_get_args(PyBaseExceptionObject *self)
187{
188 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200189 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000190 }
191 Py_INCREF(self->args);
192 return self->args;
193}
194
195static int
196BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
197{
198 PyObject *seq;
199 if (val == NULL) {
200 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
201 return -1;
202 }
203 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500204 if (!seq)
205 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300206 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000207 return 0;
208}
209
Collin Winter828f04a2007-08-31 00:04:24 +0000210static PyObject *
211BaseException_get_tb(PyBaseExceptionObject *self)
212{
213 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200214 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000215 }
216 Py_INCREF(self->traceback);
217 return self->traceback;
218}
219
220static int
221BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
222{
223 if (tb == NULL) {
224 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
225 return -1;
226 }
227 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
228 PyErr_SetString(PyExc_TypeError,
229 "__traceback__ must be a traceback or None");
230 return -1;
231 }
232
Serhiy Storchaka37665722016-08-20 21:22:03 +0300233 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300234 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000235 return 0;
236}
237
Georg Brandlab6f2f62009-03-31 04:16:10 +0000238static PyObject *
239BaseException_get_context(PyObject *self) {
240 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500241 if (res)
242 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000243 Py_RETURN_NONE;
244}
245
246static int
247BaseException_set_context(PyObject *self, PyObject *arg) {
248 if (arg == NULL) {
249 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
250 return -1;
251 } else if (arg == Py_None) {
252 arg = NULL;
253 } else if (!PyExceptionInstance_Check(arg)) {
254 PyErr_SetString(PyExc_TypeError, "exception context must be None "
255 "or derive from BaseException");
256 return -1;
257 } else {
258 /* PyException_SetContext steals this reference */
259 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000261 PyException_SetContext(self, arg);
262 return 0;
263}
264
265static PyObject *
266BaseException_get_cause(PyObject *self) {
267 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500268 if (res)
269 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700270 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000271}
272
273static int
274BaseException_set_cause(PyObject *self, PyObject *arg) {
275 if (arg == NULL) {
276 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
277 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700278 } else if (arg == Py_None) {
279 arg = NULL;
280 } else if (!PyExceptionInstance_Check(arg)) {
281 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
282 "or derive from BaseException");
283 return -1;
284 } else {
285 /* PyException_SetCause steals this reference */
286 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700288 PyException_SetCause(self, arg);
289 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000290}
291
Guido van Rossum360e4b82007-05-14 22:51:27 +0000292
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500294 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000296 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000297 {"__context__", (getter)BaseException_get_context,
298 (setter)BaseException_set_context, PyDoc_STR("exception context")},
299 {"__cause__", (getter)BaseException_get_cause,
300 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000301 {NULL},
302};
303
304
Collin Winter828f04a2007-08-31 00:04:24 +0000305PyObject *
306PyException_GetTraceback(PyObject *self) {
307 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
308 Py_XINCREF(base_self->traceback);
309 return base_self->traceback;
310}
311
312
313int
314PyException_SetTraceback(PyObject *self, PyObject *tb) {
315 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
316}
317
318PyObject *
319PyException_GetCause(PyObject *self) {
320 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
321 Py_XINCREF(cause);
322 return cause;
323}
324
325/* Steals a reference to cause */
326void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200327PyException_SetCause(PyObject *self, PyObject *cause)
328{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700329 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300330 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000331}
332
333PyObject *
334PyException_GetContext(PyObject *self) {
335 PyObject *context = ((PyBaseExceptionObject *)self)->context;
336 Py_XINCREF(context);
337 return context;
338}
339
340/* Steals a reference to context */
341void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200342PyException_SetContext(PyObject *self, PyObject *context)
343{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300344 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000345}
346
347
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700348static struct PyMemberDef BaseException_members[] = {
349 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200350 offsetof(PyBaseExceptionObject, suppress_context)},
351 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700352};
353
354
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000356 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000357 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
359 0, /*tp_itemsize*/
360 (destructor)BaseException_dealloc, /*tp_dealloc*/
361 0, /*tp_print*/
362 0, /*tp_getattr*/
363 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000364 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000365 (reprfunc)BaseException_repr, /*tp_repr*/
366 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000367 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000368 0, /*tp_as_mapping*/
369 0, /*tp_hash */
370 0, /*tp_call*/
371 (reprfunc)BaseException_str, /*tp_str*/
372 PyObject_GenericGetAttr, /*tp_getattro*/
373 PyObject_GenericSetAttr, /*tp_setattro*/
374 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000377 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
378 (traverseproc)BaseException_traverse, /* tp_traverse */
379 (inquiry)BaseException_clear, /* tp_clear */
380 0, /* tp_richcompare */
381 0, /* tp_weaklistoffset */
382 0, /* tp_iter */
383 0, /* tp_iternext */
384 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700385 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000386 BaseException_getset, /* tp_getset */
387 0, /* tp_base */
388 0, /* tp_dict */
389 0, /* tp_descr_get */
390 0, /* tp_descr_set */
391 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
392 (initproc)BaseException_init, /* tp_init */
393 0, /* tp_alloc */
394 BaseException_new, /* tp_new */
395};
396/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
397from the previous implmentation and also allowing Python objects to be used
398in the API */
399PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
400
401/* note these macros omit the last semicolon so the macro invocation may
402 * include it and not look strange.
403 */
404#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
405static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000406 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000407 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000408 sizeof(PyBaseExceptionObject), \
409 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
410 0, 0, 0, 0, 0, 0, 0, \
411 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
412 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
413 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
414 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
415 (initproc)BaseException_init, 0, BaseException_new,\
416}; \
417PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
418
419#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
420static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000421 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000422 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000424 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425 0, 0, 0, 0, 0, \
426 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000427 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
428 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200430 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431}; \
432PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
433
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200434#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
435 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
436 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000438 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000439 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000440 sizeof(Py ## EXCSTORE ## Object), 0, \
441 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
442 (reprfunc)EXCSTR, 0, 0, 0, \
443 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
444 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
445 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200446 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200448 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000449}; \
450PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
451
452
453/*
454 * Exception extends BaseException
455 */
456SimpleExtendsException(PyExc_BaseException, Exception,
457 "Common base class for all non-exit exceptions.");
458
459
460/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 "Inappropriate argument type.");
465
466
467/*
Yury Selivanov75445082015-05-11 22:57:16 -0400468 * StopAsyncIteration extends Exception
469 */
470SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
471 "Signal the end from iterator.__anext__().");
472
473
474/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000475 * StopIteration extends Exception
476 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000477
478static PyMemberDef StopIteration_members[] = {
479 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
480 PyDoc_STR("generator return value")},
481 {NULL} /* Sentinel */
482};
483
484static int
485StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
486{
487 Py_ssize_t size = PyTuple_GET_SIZE(args);
488 PyObject *value;
489
490 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
491 return -1;
492 Py_CLEAR(self->value);
493 if (size > 0)
494 value = PyTuple_GET_ITEM(args, 0);
495 else
496 value = Py_None;
497 Py_INCREF(value);
498 self->value = value;
499 return 0;
500}
501
502static int
503StopIteration_clear(PyStopIterationObject *self)
504{
505 Py_CLEAR(self->value);
506 return BaseException_clear((PyBaseExceptionObject *)self);
507}
508
509static void
510StopIteration_dealloc(PyStopIterationObject *self)
511{
512 _PyObject_GC_UNTRACK(self);
513 StopIteration_clear(self);
514 Py_TYPE(self)->tp_free((PyObject *)self);
515}
516
517static int
518StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
519{
520 Py_VISIT(self->value);
521 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
522}
523
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000524ComplexExtendsException(
525 PyExc_Exception, /* base */
526 StopIteration, /* name */
527 StopIteration, /* prefix for *_init, etc */
528 0, /* new */
529 0, /* methods */
530 StopIteration_members, /* members */
531 0, /* getset */
532 0, /* str */
533 "Signal the end from iterator.__next__()."
534);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000535
536
537/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000538 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000540SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541 "Request that a generator exit.");
542
543
544/*
545 * SystemExit extends BaseException
546 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000547
548static int
549SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
550{
551 Py_ssize_t size = PyTuple_GET_SIZE(args);
552
553 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
554 return -1;
555
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000556 if (size == 0)
557 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200558 if (size == 1) {
559 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300560 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200561 }
562 else { /* size > 1 */
563 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300564 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200565 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000566 return 0;
567}
568
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000569static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000570SystemExit_clear(PySystemExitObject *self)
571{
572 Py_CLEAR(self->code);
573 return BaseException_clear((PyBaseExceptionObject *)self);
574}
575
576static void
577SystemExit_dealloc(PySystemExitObject *self)
578{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000581 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582}
583
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000584static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000585SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
586{
587 Py_VISIT(self->code);
588 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
589}
590
591static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
593 PyDoc_STR("exception code")},
594 {NULL} /* Sentinel */
595};
596
597ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200598 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000599 "Request to exit from the interpreter.");
600
601/*
602 * KeyboardInterrupt extends BaseException
603 */
604SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
605 "Program interrupted by user.");
606
607
608/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000610 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000611
Brett Cannon79ec55e2012-04-12 20:24:54 -0400612static int
613ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
614{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300615 static char *kwlist[] = {"name", "path", 0};
616 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400617 PyObject *msg = NULL;
618 PyObject *name = NULL;
619 PyObject *path = NULL;
620
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300621 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400622 return -1;
623
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300624 empty_tuple = PyTuple_New(0);
625 if (!empty_tuple)
626 return -1;
627 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
628 &name, &path)) {
629 Py_DECREF(empty_tuple);
630 return -1;
631 }
632 Py_DECREF(empty_tuple);
633
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300634 Py_XINCREF(name);
635 Py_XSETREF(self->name, name);
636
637 Py_XINCREF(path);
638 Py_XSETREF(self->path, path);
639
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300640 if (PyTuple_GET_SIZE(args) == 1) {
641 msg = PyTuple_GET_ITEM(args, 0);
642 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300643 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300644 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400645
646 return 0;
647}
648
649static int
650ImportError_clear(PyImportErrorObject *self)
651{
652 Py_CLEAR(self->msg);
653 Py_CLEAR(self->name);
654 Py_CLEAR(self->path);
655 return BaseException_clear((PyBaseExceptionObject *)self);
656}
657
658static void
659ImportError_dealloc(PyImportErrorObject *self)
660{
661 _PyObject_GC_UNTRACK(self);
662 ImportError_clear(self);
663 Py_TYPE(self)->tp_free((PyObject *)self);
664}
665
666static int
667ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
668{
669 Py_VISIT(self->msg);
670 Py_VISIT(self->name);
671 Py_VISIT(self->path);
672 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
673}
674
675static PyObject *
676ImportError_str(PyImportErrorObject *self)
677{
Brett Cannon07c6e712012-08-24 13:05:09 -0400678 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400679 Py_INCREF(self->msg);
680 return self->msg;
681 }
682 else {
683 return BaseException_str((PyBaseExceptionObject *)self);
684 }
685}
686
Serhiy Storchakab7853962017-04-08 09:55:07 +0300687static PyObject *
688ImportError_getstate(PyImportErrorObject *self)
689{
690 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
691 if (self->name || self->path) {
692 _Py_IDENTIFIER(name);
693 _Py_IDENTIFIER(path);
694 dict = dict ? PyDict_Copy(dict) : PyDict_New();
695 if (dict == NULL)
696 return NULL;
697 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
698 Py_DECREF(dict);
699 return NULL;
700 }
701 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
702 Py_DECREF(dict);
703 return NULL;
704 }
705 return dict;
706 }
707 else if (dict) {
708 Py_INCREF(dict);
709 return dict;
710 }
711 else {
712 Py_RETURN_NONE;
713 }
714}
715
716/* Pickling support */
717static PyObject *
718ImportError_reduce(PyImportErrorObject *self)
719{
720 PyObject *res;
721 PyObject *args;
722 PyObject *state = ImportError_getstate(self);
723 if (state == NULL)
724 return NULL;
725 args = ((PyBaseExceptionObject *)self)->args;
726 if (state == Py_None)
727 res = PyTuple_Pack(2, Py_TYPE(self), args);
728 else
729 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
730 Py_DECREF(state);
731 return res;
732}
733
Brett Cannon79ec55e2012-04-12 20:24:54 -0400734static PyMemberDef ImportError_members[] = {
735 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
736 PyDoc_STR("exception message")},
737 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
738 PyDoc_STR("module name")},
739 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
740 PyDoc_STR("module path")},
741 {NULL} /* Sentinel */
742};
743
744static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300745 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400746 {NULL}
747};
748
749ComplexExtendsException(PyExc_Exception, ImportError,
750 ImportError, 0 /* new */,
751 ImportError_methods, ImportError_members,
752 0 /* getset */, ImportError_str,
753 "Import can't find module, or can't find name in "
754 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000755
756/*
Eric Snowc9432652016-09-07 15:42:32 -0700757 * ModuleNotFoundError extends ImportError
758 */
759
760MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
761 "Module not found.");
762
763/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200764 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000765 */
766
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200767#ifdef MS_WINDOWS
768#include "errmap.h"
769#endif
770
Thomas Wouters477c8d52006-05-27 19:21:47 +0000771/* Where a function has a single filename, such as open() or some
772 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
773 * called, giving a third argument which is the filename. But, so
774 * that old code using in-place unpacking doesn't break, e.g.:
775 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200776 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000777 *
778 * we hack args so that it only contains two items. This also
779 * means we need our own __str__() which prints out the filename
780 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800781 *
782 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800783 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
784 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000785 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200786
Antoine Pitroue0e27352011-12-15 14:31:28 +0100787/* This function doesn't cleanup on error, the caller should */
788static int
789oserror_parse_args(PyObject **p_args,
790 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800791 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200792#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100793 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200794#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100795 )
796{
797 Py_ssize_t nargs;
798 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800799#ifndef MS_WINDOWS
800 /*
801 * ignored on non-Windows platforms,
802 * but parsed so OSError has a consistent signature
803 */
804 PyObject *_winerror = NULL;
805 PyObject **winerror = &_winerror;
806#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000807
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200808 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809
Larry Hastingsb0827312014-02-09 22:05:19 -0800810 if (nargs >= 2 && nargs <= 5) {
811 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
812 myerrno, strerror,
813 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100814 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800815#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100816 if (*winerror && PyLong_Check(*winerror)) {
817 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 PyObject *newargs;
819 Py_ssize_t i;
820
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100823 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200824 /* Set errno to the corresponding POSIX errno (overriding
825 first argument). Windows Socket error codes (>= 10000)
826 have the same value as their POSIX counterparts.
827 */
828 if (winerrcode < 10000)
829 errcode = winerror_to_errno(winerrcode);
830 else
831 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100832 *myerrno = PyLong_FromLong(errcode);
833 if (!*myerrno)
834 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200835 newargs = PyTuple_New(nargs);
836 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100837 return -1;
838 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200839 for (i = 1; i < nargs; i++) {
840 PyObject *val = PyTuple_GET_ITEM(args, i);
841 Py_INCREF(val);
842 PyTuple_SET_ITEM(newargs, i, val);
843 }
844 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100845 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200846 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800847#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200848 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000849
Antoine Pitroue0e27352011-12-15 14:31:28 +0100850 return 0;
851}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000852
Antoine Pitroue0e27352011-12-15 14:31:28 +0100853static int
854oserror_init(PyOSErrorObject *self, PyObject **p_args,
855 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800856 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100857#ifdef MS_WINDOWS
858 , PyObject *winerror
859#endif
860 )
861{
862 PyObject *args = *p_args;
863 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000864
865 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200866 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100867 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200868 PyNumber_Check(filename)) {
869 /* BlockingIOError's 3rd argument can be the number of
870 * characters written.
871 */
872 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
873 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100874 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200875 }
876 else {
877 Py_INCREF(filename);
878 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000879
Larry Hastingsb0827312014-02-09 22:05:19 -0800880 if (filename2 && filename2 != Py_None) {
881 Py_INCREF(filename2);
882 self->filename2 = filename2;
883 }
884
885 if (nargs >= 2 && nargs <= 5) {
886 /* filename, filename2, and winerror are removed from the args tuple
887 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100888 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200889 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100890 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100893 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200894 }
895 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000896 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200897 Py_XINCREF(myerrno);
898 self->myerrno = myerrno;
899
900 Py_XINCREF(strerror);
901 self->strerror = strerror;
902
903#ifdef MS_WINDOWS
904 Py_XINCREF(winerror);
905 self->winerror = winerror;
906#endif
907
Antoine Pitroue0e27352011-12-15 14:31:28 +0100908 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300909 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100910 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100911
912 return 0;
913}
914
915static PyObject *
916OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
917static int
918OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
919
920static int
921oserror_use_init(PyTypeObject *type)
922{
Martin Panter7462b6492015-11-02 03:37:02 +0000923 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100924 extraneous argument to __new__ to be ignored. The only reasonable
925 solution, given __new__ takes a variable number of arguments,
926 is to defer arg parsing and initialization to __init__.
927
Martin Pantere26da7c2016-06-02 10:07:09 +0000928 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100929 with the right arguments.
930
931 (see http://bugs.python.org/issue12555#msg148829 )
932 */
933 if (type->tp_init != (initproc) OSError_init &&
934 type->tp_new == (newfunc) OSError_new) {
935 assert((PyObject *) type != PyExc_OSError);
936 return 1;
937 }
938 return 0;
939}
940
941static PyObject *
942OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
943{
944 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800945 PyObject *myerrno = NULL, *strerror = NULL;
946 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100947#ifdef MS_WINDOWS
948 PyObject *winerror = NULL;
949#endif
950
Victor Stinner46ef3192013-11-14 22:31:41 +0100951 Py_INCREF(args);
952
Antoine Pitroue0e27352011-12-15 14:31:28 +0100953 if (!oserror_use_init(type)) {
954 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100955 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100956
Larry Hastingsb0827312014-02-09 22:05:19 -0800957 if (oserror_parse_args(&args, &myerrno, &strerror,
958 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100959#ifdef MS_WINDOWS
960 , &winerror
961#endif
962 ))
963 goto error;
964
965 if (myerrno && PyLong_Check(myerrno) &&
966 errnomap && (PyObject *) type == PyExc_OSError) {
967 PyObject *newtype;
968 newtype = PyDict_GetItem(errnomap, myerrno);
969 if (newtype) {
970 assert(PyType_Check(newtype));
971 type = (PyTypeObject *) newtype;
972 }
973 else if (PyErr_Occurred())
974 goto error;
975 }
976 }
977
978 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
979 if (!self)
980 goto error;
981
982 self->dict = NULL;
983 self->traceback = self->cause = self->context = NULL;
984 self->written = -1;
985
986 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800987 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100988#ifdef MS_WINDOWS
989 , winerror
990#endif
991 ))
992 goto error;
993 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200994 else {
995 self->args = PyTuple_New(0);
996 if (self->args == NULL)
997 goto error;
998 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100999
Victor Stinner46ef3192013-11-14 22:31:41 +01001000 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001 return (PyObject *) self;
1002
1003error:
1004 Py_XDECREF(args);
1005 Py_XDECREF(self);
1006 return NULL;
1007}
1008
1009static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001010OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011{
Larry Hastingsb0827312014-02-09 22:05:19 -08001012 PyObject *myerrno = NULL, *strerror = NULL;
1013 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001014#ifdef MS_WINDOWS
1015 PyObject *winerror = NULL;
1016#endif
1017
1018 if (!oserror_use_init(Py_TYPE(self)))
1019 /* Everything already done in OSError_new */
1020 return 0;
1021
1022 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1023 return -1;
1024
1025 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001026 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001027#ifdef MS_WINDOWS
1028 , &winerror
1029#endif
1030 ))
1031 goto error;
1032
Larry Hastingsb0827312014-02-09 22:05:19 -08001033 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001034#ifdef MS_WINDOWS
1035 , winerror
1036#endif
1037 ))
1038 goto error;
1039
Thomas Wouters477c8d52006-05-27 19:21:47 +00001040 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001041
1042error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001043 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001044 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001045}
1046
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001047static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001048OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001049{
1050 Py_CLEAR(self->myerrno);
1051 Py_CLEAR(self->strerror);
1052 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001053 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054#ifdef MS_WINDOWS
1055 Py_CLEAR(self->winerror);
1056#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001057 return BaseException_clear((PyBaseExceptionObject *)self);
1058}
1059
1060static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001061OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001062{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001063 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001064 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001065 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001066}
1067
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001068static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001069OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001070 void *arg)
1071{
1072 Py_VISIT(self->myerrno);
1073 Py_VISIT(self->strerror);
1074 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001075 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001076#ifdef MS_WINDOWS
1077 Py_VISIT(self->winerror);
1078#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1080}
1081
1082static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001083OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084{
Larry Hastingsb0827312014-02-09 22:05:19 -08001085#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001086#ifdef MS_WINDOWS
1087 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001088 if (self->winerror && self->filename) {
1089 if (self->filename2) {
1090 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1091 OR_NONE(self->winerror),
1092 OR_NONE(self->strerror),
1093 self->filename,
1094 self->filename2);
1095 } else {
1096 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1097 OR_NONE(self->winerror),
1098 OR_NONE(self->strerror),
1099 self->filename);
1100 }
1101 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001102 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001103 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104 self->winerror ? self->winerror: Py_None,
1105 self->strerror ? self->strerror: Py_None);
1106#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001107 if (self->filename) {
1108 if (self->filename2) {
1109 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1110 OR_NONE(self->myerrno),
1111 OR_NONE(self->strerror),
1112 self->filename,
1113 self->filename2);
1114 } else {
1115 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1116 OR_NONE(self->myerrno),
1117 OR_NONE(self->strerror),
1118 self->filename);
1119 }
1120 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001121 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001122 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001123 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001124 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001125}
1126
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001128OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001129{
1130 PyObject *args = self->args;
1131 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001132
Thomas Wouters477c8d52006-05-27 19:21:47 +00001133 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001134 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001135 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001136 Py_ssize_t size = self->filename2 ? 5 : 3;
1137 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001138 if (!args)
1139 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001140
1141 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001142 Py_INCREF(tmp);
1143 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001144
1145 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001146 Py_INCREF(tmp);
1147 PyTuple_SET_ITEM(args, 1, tmp);
1148
1149 Py_INCREF(self->filename);
1150 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001151
1152 if (self->filename2) {
1153 /*
1154 * This tuple is essentially used as OSError(*args).
1155 * So, to recreate filename2, we need to pass in
1156 * winerror as well.
1157 */
1158 Py_INCREF(Py_None);
1159 PyTuple_SET_ITEM(args, 3, Py_None);
1160
1161 /* filename2 */
1162 Py_INCREF(self->filename2);
1163 PyTuple_SET_ITEM(args, 4, self->filename2);
1164 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001165 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001167
1168 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001169 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001170 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001171 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001172 Py_DECREF(args);
1173 return res;
1174}
1175
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001176static PyObject *
1177OSError_written_get(PyOSErrorObject *self, void *context)
1178{
1179 if (self->written == -1) {
1180 PyErr_SetString(PyExc_AttributeError, "characters_written");
1181 return NULL;
1182 }
1183 return PyLong_FromSsize_t(self->written);
1184}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001185
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001186static int
1187OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1188{
1189 Py_ssize_t n;
1190 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1191 if (n == -1 && PyErr_Occurred())
1192 return -1;
1193 self->written = n;
1194 return 0;
1195}
1196
1197static PyMemberDef OSError_members[] = {
1198 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1199 PyDoc_STR("POSIX exception code")},
1200 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1201 PyDoc_STR("exception strerror")},
1202 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1203 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001204 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1205 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001206#ifdef MS_WINDOWS
1207 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1208 PyDoc_STR("Win32 exception code")},
1209#endif
1210 {NULL} /* Sentinel */
1211};
1212
1213static PyMethodDef OSError_methods[] = {
1214 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001215 {NULL}
1216};
1217
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001218static PyGetSetDef OSError_getset[] = {
1219 {"characters_written", (getter) OSError_written_get,
1220 (setter) OSError_written_set, NULL},
1221 {NULL}
1222};
1223
1224
1225ComplexExtendsException(PyExc_Exception, OSError,
1226 OSError, OSError_new,
1227 OSError_methods, OSError_members, OSError_getset,
1228 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001229 "Base class for I/O related errors.");
1230
1231
1232/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001233 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001235MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1236 "I/O operation would block.");
1237MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1238 "Connection error.");
1239MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1240 "Child process error.");
1241MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1242 "Broken pipe.");
1243MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1244 "Connection aborted.");
1245MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1246 "Connection refused.");
1247MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1248 "Connection reset.");
1249MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1250 "File already exists.");
1251MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1252 "File not found.");
1253MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1254 "Operation doesn't work on directories.");
1255MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1256 "Operation only works on directories.");
1257MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1258 "Interrupted by signal.");
1259MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1260 "Not enough permissions.");
1261MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1262 "Process not found.");
1263MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1264 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001265
1266/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001267 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001268 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001269SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270 "Read beyond end of file.");
1271
1272
1273/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001274 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001276SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001277 "Unspecified run-time error.");
1278
Yury Selivanovf488fb42015-07-03 01:04:23 -04001279/*
1280 * RecursionError extends RuntimeError
1281 */
1282SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1283 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001284
1285/*
1286 * NotImplementedError extends RuntimeError
1287 */
1288SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1289 "Method or function hasn't been implemented yet.");
1290
1291/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001292 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001293 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001294SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295 "Name not found globally.");
1296
1297/*
1298 * UnboundLocalError extends NameError
1299 */
1300SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1301 "Local name referenced but not bound to a value.");
1302
1303/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001304 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001305 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001306SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001307 "Attribute not found.");
1308
1309
1310/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001311 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001312 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001314/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001315static int _report_missing_parentheses(PySyntaxErrorObject *self);
1316
Thomas Wouters477c8d52006-05-27 19:21:47 +00001317static int
1318SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1319{
1320 PyObject *info = NULL;
1321 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1322
1323 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1324 return -1;
1325
1326 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001327 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001328 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001329 }
1330 if (lenargs == 2) {
1331 info = PyTuple_GET_ITEM(args, 1);
1332 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001333 if (!info)
1334 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001336 if (PyTuple_GET_SIZE(info) != 4) {
1337 /* not a very good error message, but it's what Python 2.4 gives */
1338 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1339 Py_DECREF(info);
1340 return -1;
1341 }
1342
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001343 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001344 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001345
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001346 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001347 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001349 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001350 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001352 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001353 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001354
1355 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001356
Martijn Pieters772d8092017-08-22 21:16:23 +01001357 /*
1358 * Issue #21669: Custom error for 'print' & 'exec' as statements
1359 *
1360 * Only applies to SyntaxError instances, not to subclasses such
1361 * as TabError or IndentationError (see issue #31161)
1362 */
1363 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1364 self->text && PyUnicode_Check(self->text) &&
1365 _report_missing_parentheses(self) < 0) {
1366 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001367 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001368 }
1369 return 0;
1370}
1371
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001372static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001373SyntaxError_clear(PySyntaxErrorObject *self)
1374{
1375 Py_CLEAR(self->msg);
1376 Py_CLEAR(self->filename);
1377 Py_CLEAR(self->lineno);
1378 Py_CLEAR(self->offset);
1379 Py_CLEAR(self->text);
1380 Py_CLEAR(self->print_file_and_line);
1381 return BaseException_clear((PyBaseExceptionObject *)self);
1382}
1383
1384static void
1385SyntaxError_dealloc(PySyntaxErrorObject *self)
1386{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001389 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001390}
1391
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001392static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001393SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1394{
1395 Py_VISIT(self->msg);
1396 Py_VISIT(self->filename);
1397 Py_VISIT(self->lineno);
1398 Py_VISIT(self->offset);
1399 Py_VISIT(self->text);
1400 Py_VISIT(self->print_file_and_line);
1401 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1402}
1403
1404/* This is called "my_basename" instead of just "basename" to avoid name
1405 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1406 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001407static PyObject*
1408my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001409{
Victor Stinner6237daf2010-04-28 17:26:19 +00001410 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001411 int kind;
1412 void *data;
1413
1414 if (PyUnicode_READY(name))
1415 return NULL;
1416 kind = PyUnicode_KIND(name);
1417 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001418 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001419 offset = 0;
1420 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001421 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001422 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001423 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001424 if (offset != 0)
1425 return PyUnicode_Substring(name, offset, size);
1426 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001427 Py_INCREF(name);
1428 return name;
1429 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001430}
1431
1432
1433static PyObject *
1434SyntaxError_str(PySyntaxErrorObject *self)
1435{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001436 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001437 PyObject *filename;
1438 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001439 /* Below, we always ignore overflow errors, just printing -1.
1440 Still, we cannot allow an OverflowError to be raised, so
1441 we need to call PyLong_AsLongAndOverflow. */
1442 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001443
1444 /* XXX -- do all the additional formatting with filename and
1445 lineno here */
1446
Neal Norwitzed2b7392007-08-26 04:51:10 +00001447 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001448 filename = my_basename(self->filename);
1449 if (filename == NULL)
1450 return NULL;
1451 } else {
1452 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001453 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001454 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001456 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001457 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001458
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001459 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001460 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001461 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001462 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001464 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001465 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001466 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001467 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001468 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001469 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001470 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001471 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001472 Py_XDECREF(filename);
1473 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001474}
1475
1476static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001477 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1478 PyDoc_STR("exception msg")},
1479 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1480 PyDoc_STR("exception filename")},
1481 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1482 PyDoc_STR("exception lineno")},
1483 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1484 PyDoc_STR("exception offset")},
1485 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1486 PyDoc_STR("exception text")},
1487 {"print_file_and_line", T_OBJECT,
1488 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1489 PyDoc_STR("exception print_file_and_line")},
1490 {NULL} /* Sentinel */
1491};
1492
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001493ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001494 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001495 SyntaxError_str, "Invalid syntax.");
1496
1497
1498/*
1499 * IndentationError extends SyntaxError
1500 */
1501MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1502 "Improper indentation.");
1503
1504
1505/*
1506 * TabError extends IndentationError
1507 */
1508MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1509 "Improper mixture of spaces and tabs.");
1510
1511
1512/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001513 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001514 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001515SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001516 "Base class for lookup errors.");
1517
1518
1519/*
1520 * IndexError extends LookupError
1521 */
1522SimpleExtendsException(PyExc_LookupError, IndexError,
1523 "Sequence index out of range.");
1524
1525
1526/*
1527 * KeyError extends LookupError
1528 */
1529static PyObject *
1530KeyError_str(PyBaseExceptionObject *self)
1531{
1532 /* If args is a tuple of exactly one item, apply repr to args[0].
1533 This is done so that e.g. the exception raised by {}[''] prints
1534 KeyError: ''
1535 rather than the confusing
1536 KeyError
1537 alone. The downside is that if KeyError is raised with an explanatory
1538 string, that string will be displayed in quotes. Too bad.
1539 If args is anything else, use the default BaseException__str__().
1540 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001541 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001542 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001543 }
1544 return BaseException_str(self);
1545}
1546
1547ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001548 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549
1550
1551/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001552 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001553 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001554SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001555 "Inappropriate argument value (of correct type).");
1556
1557/*
1558 * UnicodeError extends ValueError
1559 */
1560
1561SimpleExtendsException(PyExc_ValueError, UnicodeError,
1562 "Unicode related error.");
1563
Thomas Wouters477c8d52006-05-27 19:21:47 +00001564static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001565get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001566{
1567 if (!attr) {
1568 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1569 return NULL;
1570 }
1571
Christian Heimes72b710a2008-05-26 13:28:38 +00001572 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001573 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1574 return NULL;
1575 }
1576 Py_INCREF(attr);
1577 return attr;
1578}
1579
1580static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001581get_unicode(PyObject *attr, const char *name)
1582{
1583 if (!attr) {
1584 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1585 return NULL;
1586 }
1587
1588 if (!PyUnicode_Check(attr)) {
1589 PyErr_Format(PyExc_TypeError,
1590 "%.200s attribute must be unicode", name);
1591 return NULL;
1592 }
1593 Py_INCREF(attr);
1594 return attr;
1595}
1596
Walter Dörwaldd2034312007-05-18 16:29:38 +00001597static int
1598set_unicodefromstring(PyObject **attr, const char *value)
1599{
1600 PyObject *obj = PyUnicode_FromString(value);
1601 if (!obj)
1602 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001603 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001604 return 0;
1605}
1606
Thomas Wouters477c8d52006-05-27 19:21:47 +00001607PyObject *
1608PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1609{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001610 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611}
1612
1613PyObject *
1614PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1615{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001616 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001617}
1618
1619PyObject *
1620PyUnicodeEncodeError_GetObject(PyObject *exc)
1621{
1622 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1623}
1624
1625PyObject *
1626PyUnicodeDecodeError_GetObject(PyObject *exc)
1627{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001628 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629}
1630
1631PyObject *
1632PyUnicodeTranslateError_GetObject(PyObject *exc)
1633{
1634 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1635}
1636
1637int
1638PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1639{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001640 Py_ssize_t size;
1641 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1642 "object");
1643 if (!obj)
1644 return -1;
1645 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001646 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001647 if (*start<0)
1648 *start = 0; /*XXX check for values <0*/
1649 if (*start>=size)
1650 *start = size-1;
1651 Py_DECREF(obj);
1652 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001653}
1654
1655
1656int
1657PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1658{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001659 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001660 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001661 if (!obj)
1662 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001663 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001664 *start = ((PyUnicodeErrorObject *)exc)->start;
1665 if (*start<0)
1666 *start = 0;
1667 if (*start>=size)
1668 *start = size-1;
1669 Py_DECREF(obj);
1670 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001671}
1672
1673
1674int
1675PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1676{
1677 return PyUnicodeEncodeError_GetStart(exc, start);
1678}
1679
1680
1681int
1682PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1683{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001684 ((PyUnicodeErrorObject *)exc)->start = start;
1685 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001686}
1687
1688
1689int
1690PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1691{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001692 ((PyUnicodeErrorObject *)exc)->start = start;
1693 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001694}
1695
1696
1697int
1698PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1699{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001700 ((PyUnicodeErrorObject *)exc)->start = start;
1701 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001702}
1703
1704
1705int
1706PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1707{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001708 Py_ssize_t size;
1709 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1710 "object");
1711 if (!obj)
1712 return -1;
1713 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001714 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001715 if (*end<1)
1716 *end = 1;
1717 if (*end>size)
1718 *end = size;
1719 Py_DECREF(obj);
1720 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001721}
1722
1723
1724int
1725PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1726{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001727 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001728 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001729 if (!obj)
1730 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001731 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001732 *end = ((PyUnicodeErrorObject *)exc)->end;
1733 if (*end<1)
1734 *end = 1;
1735 if (*end>size)
1736 *end = size;
1737 Py_DECREF(obj);
1738 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001739}
1740
1741
1742int
1743PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1744{
1745 return PyUnicodeEncodeError_GetEnd(exc, start);
1746}
1747
1748
1749int
1750PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1751{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001752 ((PyUnicodeErrorObject *)exc)->end = end;
1753 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001754}
1755
1756
1757int
1758PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1759{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001760 ((PyUnicodeErrorObject *)exc)->end = end;
1761 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001762}
1763
1764
1765int
1766PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1767{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001768 ((PyUnicodeErrorObject *)exc)->end = end;
1769 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001770}
1771
1772PyObject *
1773PyUnicodeEncodeError_GetReason(PyObject *exc)
1774{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001775 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776}
1777
1778
1779PyObject *
1780PyUnicodeDecodeError_GetReason(PyObject *exc)
1781{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001782 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001783}
1784
1785
1786PyObject *
1787PyUnicodeTranslateError_GetReason(PyObject *exc)
1788{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001789 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001790}
1791
1792
1793int
1794PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1795{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001796 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1797 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001798}
1799
1800
1801int
1802PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1803{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001804 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1805 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001806}
1807
1808
1809int
1810PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1811{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001812 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1813 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814}
1815
1816
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001818UnicodeError_clear(PyUnicodeErrorObject *self)
1819{
1820 Py_CLEAR(self->encoding);
1821 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001822 Py_CLEAR(self->reason);
1823 return BaseException_clear((PyBaseExceptionObject *)self);
1824}
1825
1826static void
1827UnicodeError_dealloc(PyUnicodeErrorObject *self)
1828{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001829 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001830 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001831 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832}
1833
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001834static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1836{
1837 Py_VISIT(self->encoding);
1838 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839 Py_VISIT(self->reason);
1840 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1841}
1842
1843static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1845 PyDoc_STR("exception encoding")},
1846 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1847 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001848 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001850 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851 PyDoc_STR("exception end")},
1852 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1853 PyDoc_STR("exception reason")},
1854 {NULL} /* Sentinel */
1855};
1856
1857
1858/*
1859 * UnicodeEncodeError extends UnicodeError
1860 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001861
1862static int
1863UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1864{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001865 PyUnicodeErrorObject *err;
1866
Thomas Wouters477c8d52006-05-27 19:21:47 +00001867 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1868 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001869
1870 err = (PyUnicodeErrorObject *)self;
1871
1872 Py_CLEAR(err->encoding);
1873 Py_CLEAR(err->object);
1874 Py_CLEAR(err->reason);
1875
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001876 if (!PyArg_ParseTuple(args, "UUnnU",
1877 &err->encoding, &err->object,
1878 &err->start, &err->end, &err->reason)) {
1879 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001880 return -1;
1881 }
1882
Guido van Rossum98297ee2007-11-06 21:34:58 +00001883 Py_INCREF(err->encoding);
1884 Py_INCREF(err->object);
1885 Py_INCREF(err->reason);
1886
1887 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001888}
1889
1890static PyObject *
1891UnicodeEncodeError_str(PyObject *self)
1892{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001893 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001894 PyObject *result = NULL;
1895 PyObject *reason_str = NULL;
1896 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001898 if (!uself->object)
1899 /* Not properly initialized. */
1900 return PyUnicode_FromString("");
1901
Eric Smith0facd772010-02-24 15:42:29 +00001902 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001903 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001904 reason_str = PyObject_Str(uself->reason);
1905 if (reason_str == NULL)
1906 goto done;
1907 encoding_str = PyObject_Str(uself->encoding);
1908 if (encoding_str == NULL)
1909 goto done;
1910
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001911 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1912 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001913 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001914 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001915 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001916 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001917 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001918 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001919 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001920 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001921 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001922 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001923 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001924 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001925 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001926 }
Eric Smith0facd772010-02-24 15:42:29 +00001927 else {
1928 result = PyUnicode_FromFormat(
1929 "'%U' codec can't encode characters in position %zd-%zd: %U",
1930 encoding_str,
1931 uself->start,
1932 uself->end-1,
1933 reason_str);
1934 }
1935done:
1936 Py_XDECREF(reason_str);
1937 Py_XDECREF(encoding_str);
1938 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001939}
1940
1941static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001942 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001943 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944 sizeof(PyUnicodeErrorObject), 0,
1945 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1946 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1947 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001948 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1949 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001950 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001951 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001952};
1953PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1954
1955PyObject *
1956PyUnicodeEncodeError_Create(
1957 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1958 Py_ssize_t start, Py_ssize_t end, const char *reason)
1959{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001960 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001961 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962}
1963
1964
1965/*
1966 * UnicodeDecodeError extends UnicodeError
1967 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968
1969static int
1970UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1971{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001972 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001973
Thomas Wouters477c8d52006-05-27 19:21:47 +00001974 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1975 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001976
1977 ude = (PyUnicodeErrorObject *)self;
1978
1979 Py_CLEAR(ude->encoding);
1980 Py_CLEAR(ude->object);
1981 Py_CLEAR(ude->reason);
1982
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001983 if (!PyArg_ParseTuple(args, "UOnnU",
1984 &ude->encoding, &ude->object,
1985 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001986 ude->encoding = ude->object = ude->reason = NULL;
1987 return -1;
1988 }
1989
Guido van Rossum98297ee2007-11-06 21:34:58 +00001990 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001991 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001992 Py_INCREF(ude->reason);
1993
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001994 if (!PyBytes_Check(ude->object)) {
1995 Py_buffer view;
1996 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1997 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001998 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001999 PyBuffer_Release(&view);
2000 if (!ude->object)
2001 goto error;
2002 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002003 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002004
2005error:
2006 Py_CLEAR(ude->encoding);
2007 Py_CLEAR(ude->object);
2008 Py_CLEAR(ude->reason);
2009 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002010}
2011
2012static PyObject *
2013UnicodeDecodeError_str(PyObject *self)
2014{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002015 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002016 PyObject *result = NULL;
2017 PyObject *reason_str = NULL;
2018 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002019
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002020 if (!uself->object)
2021 /* Not properly initialized. */
2022 return PyUnicode_FromString("");
2023
Eric Smith0facd772010-02-24 15:42:29 +00002024 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002025 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002026 reason_str = PyObject_Str(uself->reason);
2027 if (reason_str == NULL)
2028 goto done;
2029 encoding_str = PyObject_Str(uself->encoding);
2030 if (encoding_str == NULL)
2031 goto done;
2032
2033 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002034 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002035 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002036 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002037 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002038 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002039 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002040 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002041 }
Eric Smith0facd772010-02-24 15:42:29 +00002042 else {
2043 result = PyUnicode_FromFormat(
2044 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2045 encoding_str,
2046 uself->start,
2047 uself->end-1,
2048 reason_str
2049 );
2050 }
2051done:
2052 Py_XDECREF(reason_str);
2053 Py_XDECREF(encoding_str);
2054 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002055}
2056
2057static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002058 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002059 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060 sizeof(PyUnicodeErrorObject), 0,
2061 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2062 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2063 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002064 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2065 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002066 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002067 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068};
2069PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2070
2071PyObject *
2072PyUnicodeDecodeError_Create(
2073 const char *encoding, const char *object, Py_ssize_t length,
2074 Py_ssize_t start, Py_ssize_t end, const char *reason)
2075{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002076 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002077 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002078}
2079
2080
2081/*
2082 * UnicodeTranslateError extends UnicodeError
2083 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002084
2085static int
2086UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2087 PyObject *kwds)
2088{
2089 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2090 return -1;
2091
2092 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 Py_CLEAR(self->reason);
2094
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002095 if (!PyArg_ParseTuple(args, "UnnU",
2096 &self->object,
2097 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002098 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099 return -1;
2100 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002101
Thomas Wouters477c8d52006-05-27 19:21:47 +00002102 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002103 Py_INCREF(self->reason);
2104
2105 return 0;
2106}
2107
2108
2109static PyObject *
2110UnicodeTranslateError_str(PyObject *self)
2111{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002112 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002113 PyObject *result = NULL;
2114 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002115
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002116 if (!uself->object)
2117 /* Not properly initialized. */
2118 return PyUnicode_FromString("");
2119
Eric Smith0facd772010-02-24 15:42:29 +00002120 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002121 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002122 reason_str = PyObject_Str(uself->reason);
2123 if (reason_str == NULL)
2124 goto done;
2125
Victor Stinner53b33e72011-11-21 01:17:27 +01002126 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2127 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002128 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002129 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002130 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002131 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002132 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002133 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002134 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002135 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002136 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002137 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002138 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002139 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002140 );
Eric Smith0facd772010-02-24 15:42:29 +00002141 } else {
2142 result = PyUnicode_FromFormat(
2143 "can't translate characters in position %zd-%zd: %U",
2144 uself->start,
2145 uself->end-1,
2146 reason_str
2147 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002148 }
Eric Smith0facd772010-02-24 15:42:29 +00002149done:
2150 Py_XDECREF(reason_str);
2151 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002152}
2153
2154static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002155 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002156 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002157 sizeof(PyUnicodeErrorObject), 0,
2158 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2159 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2160 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2163 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002164 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002165};
2166PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2167
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002168/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002169PyObject *
2170PyUnicodeTranslateError_Create(
2171 const Py_UNICODE *object, Py_ssize_t length,
2172 Py_ssize_t start, Py_ssize_t end, const char *reason)
2173{
2174 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002175 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002176}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002177
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002178PyObject *
2179_PyUnicodeTranslateError_Create(
2180 PyObject *object,
2181 Py_ssize_t start, Py_ssize_t end, const char *reason)
2182{
Victor Stinner69598d42014-04-04 20:59:44 +02002183 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002184 object, start, end, reason);
2185}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002186
2187/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002188 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002189 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002190SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002191 "Assertion failed.");
2192
2193
2194/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002195 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002197SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198 "Base class for arithmetic errors.");
2199
2200
2201/*
2202 * FloatingPointError extends ArithmeticError
2203 */
2204SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2205 "Floating point operation failed.");
2206
2207
2208/*
2209 * OverflowError extends ArithmeticError
2210 */
2211SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2212 "Result too large to be represented.");
2213
2214
2215/*
2216 * ZeroDivisionError extends ArithmeticError
2217 */
2218SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2219 "Second argument to a division or modulo operation was zero.");
2220
2221
2222/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002223 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002225SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002226 "Internal error in the Python interpreter.\n"
2227 "\n"
2228 "Please report this to the Python maintainer, along with the traceback,\n"
2229 "the Python version, and the hardware/OS platform and version.");
2230
2231
2232/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002233 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002234 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002235SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002236 "Weak ref proxy used after referent went away.");
2237
2238
2239/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002240 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002241 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002242
2243#define MEMERRORS_SAVE 16
2244static PyBaseExceptionObject *memerrors_freelist = NULL;
2245static int memerrors_numfree = 0;
2246
2247static PyObject *
2248MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2249{
2250 PyBaseExceptionObject *self;
2251
2252 if (type != (PyTypeObject *) PyExc_MemoryError)
2253 return BaseException_new(type, args, kwds);
2254 if (memerrors_freelist == NULL)
2255 return BaseException_new(type, args, kwds);
2256 /* Fetch object from freelist and revive it */
2257 self = memerrors_freelist;
2258 self->args = PyTuple_New(0);
2259 /* This shouldn't happen since the empty tuple is persistent */
2260 if (self->args == NULL)
2261 return NULL;
2262 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2263 memerrors_numfree--;
2264 self->dict = NULL;
2265 _Py_NewReference((PyObject *)self);
2266 _PyObject_GC_TRACK(self);
2267 return (PyObject *)self;
2268}
2269
2270static void
2271MemoryError_dealloc(PyBaseExceptionObject *self)
2272{
2273 _PyObject_GC_UNTRACK(self);
2274 BaseException_clear(self);
2275 if (memerrors_numfree >= MEMERRORS_SAVE)
2276 Py_TYPE(self)->tp_free((PyObject *)self);
2277 else {
2278 self->dict = (PyObject *) memerrors_freelist;
2279 memerrors_freelist = self;
2280 memerrors_numfree++;
2281 }
2282}
2283
2284static void
2285preallocate_memerrors(void)
2286{
2287 /* We create enough MemoryErrors and then decref them, which will fill
2288 up the freelist. */
2289 int i;
2290 PyObject *errors[MEMERRORS_SAVE];
2291 for (i = 0; i < MEMERRORS_SAVE; i++) {
2292 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2293 NULL, NULL);
2294 if (!errors[i])
2295 Py_FatalError("Could not preallocate MemoryError object");
2296 }
2297 for (i = 0; i < MEMERRORS_SAVE; i++) {
2298 Py_DECREF(errors[i]);
2299 }
2300}
2301
2302static void
2303free_preallocated_memerrors(void)
2304{
2305 while (memerrors_freelist != NULL) {
2306 PyObject *self = (PyObject *) memerrors_freelist;
2307 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2308 Py_TYPE(self)->tp_free((PyObject *)self);
2309 }
2310}
2311
2312
2313static PyTypeObject _PyExc_MemoryError = {
2314 PyVarObject_HEAD_INIT(NULL, 0)
2315 "MemoryError",
2316 sizeof(PyBaseExceptionObject),
2317 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2318 0, 0, 0, 0, 0, 0, 0,
2319 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2320 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2321 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2322 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2323 (initproc)BaseException_init, 0, MemoryError_new
2324};
2325PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2326
Thomas Wouters477c8d52006-05-27 19:21:47 +00002327
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002328/*
2329 * BufferError extends Exception
2330 */
2331SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2332
Thomas Wouters477c8d52006-05-27 19:21:47 +00002333
2334/* Warning category docstrings */
2335
2336/*
2337 * Warning extends Exception
2338 */
2339SimpleExtendsException(PyExc_Exception, Warning,
2340 "Base class for warning categories.");
2341
2342
2343/*
2344 * UserWarning extends Warning
2345 */
2346SimpleExtendsException(PyExc_Warning, UserWarning,
2347 "Base class for warnings generated by user code.");
2348
2349
2350/*
2351 * DeprecationWarning extends Warning
2352 */
2353SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2354 "Base class for warnings about deprecated features.");
2355
2356
2357/*
2358 * PendingDeprecationWarning extends Warning
2359 */
2360SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2361 "Base class for warnings about features which will be deprecated\n"
2362 "in the future.");
2363
2364
2365/*
2366 * SyntaxWarning extends Warning
2367 */
2368SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2369 "Base class for warnings about dubious syntax.");
2370
2371
2372/*
2373 * RuntimeWarning extends Warning
2374 */
2375SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2376 "Base class for warnings about dubious runtime behavior.");
2377
2378
2379/*
2380 * FutureWarning extends Warning
2381 */
2382SimpleExtendsException(PyExc_Warning, FutureWarning,
2383 "Base class for warnings about constructs that will change semantically\n"
2384 "in the future.");
2385
2386
2387/*
2388 * ImportWarning extends Warning
2389 */
2390SimpleExtendsException(PyExc_Warning, ImportWarning,
2391 "Base class for warnings about probable mistakes in module imports");
2392
2393
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002394/*
2395 * UnicodeWarning extends Warning
2396 */
2397SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2398 "Base class for warnings about Unicode related problems, mostly\n"
2399 "related to conversion problems.");
2400
Georg Brandl08be72d2010-10-24 15:11:22 +00002401
Guido van Rossum98297ee2007-11-06 21:34:58 +00002402/*
2403 * BytesWarning extends Warning
2404 */
2405SimpleExtendsException(PyExc_Warning, BytesWarning,
2406 "Base class for warnings about bytes and buffer related problems, mostly\n"
2407 "related to conversion from str or comparing to str.");
2408
2409
Georg Brandl08be72d2010-10-24 15:11:22 +00002410/*
2411 * ResourceWarning extends Warning
2412 */
2413SimpleExtendsException(PyExc_Warning, ResourceWarning,
2414 "Base class for warnings about resource usage.");
2415
2416
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002417
Yury Selivanovf488fb42015-07-03 01:04:23 -04002418/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002419 Meant to be used when normalizing the exception for exceeding the recursion
2420 depth will cause its own infinite recursion.
2421*/
2422PyObject *PyExc_RecursionErrorInst = NULL;
2423
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002424#define PRE_INIT(TYPE) \
2425 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2426 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2427 Py_FatalError("exceptions bootstrapping error."); \
2428 Py_INCREF(PyExc_ ## TYPE); \
2429 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002430
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002431#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002432 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2433 Py_FatalError("Module dictionary insertion problem.");
2434
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002435#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002436 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002437 PyExc_ ## NAME = PyExc_ ## TYPE; \
2438 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2439 Py_FatalError("Module dictionary insertion problem.");
2440
2441#define ADD_ERRNO(TYPE, CODE) { \
2442 PyObject *_code = PyLong_FromLong(CODE); \
2443 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2444 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2445 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002446 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002447 }
2448
2449#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002450#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002451/* The following constants were added to errno.h in VS2010 but have
2452 preferred WSA equivalents. */
2453#undef EADDRINUSE
2454#undef EADDRNOTAVAIL
2455#undef EAFNOSUPPORT
2456#undef EALREADY
2457#undef ECONNABORTED
2458#undef ECONNREFUSED
2459#undef ECONNRESET
2460#undef EDESTADDRREQ
2461#undef EHOSTUNREACH
2462#undef EINPROGRESS
2463#undef EISCONN
2464#undef ELOOP
2465#undef EMSGSIZE
2466#undef ENETDOWN
2467#undef ENETRESET
2468#undef ENETUNREACH
2469#undef ENOBUFS
2470#undef ENOPROTOOPT
2471#undef ENOTCONN
2472#undef ENOTSOCK
2473#undef EOPNOTSUPP
2474#undef EPROTONOSUPPORT
2475#undef EPROTOTYPE
2476#undef ETIMEDOUT
2477#undef EWOULDBLOCK
2478
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002479#if defined(WSAEALREADY) && !defined(EALREADY)
2480#define EALREADY WSAEALREADY
2481#endif
2482#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2483#define ECONNABORTED WSAECONNABORTED
2484#endif
2485#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2486#define ECONNREFUSED WSAECONNREFUSED
2487#endif
2488#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2489#define ECONNRESET WSAECONNRESET
2490#endif
2491#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2492#define EINPROGRESS WSAEINPROGRESS
2493#endif
2494#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2495#define ESHUTDOWN WSAESHUTDOWN
2496#endif
2497#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2498#define ETIMEDOUT WSAETIMEDOUT
2499#endif
2500#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2501#define EWOULDBLOCK WSAEWOULDBLOCK
2502#endif
2503#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002504
Martin v. Löwis1a214512008-06-11 05:26:20 +00002505void
Brett Cannonfd074152012-04-14 14:10:13 -04002506_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002507{
Brett Cannonfd074152012-04-14 14:10:13 -04002508 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002509
2510 PRE_INIT(BaseException)
2511 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002512 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002513 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002514 PRE_INIT(StopIteration)
2515 PRE_INIT(GeneratorExit)
2516 PRE_INIT(SystemExit)
2517 PRE_INIT(KeyboardInterrupt)
2518 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002519 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002520 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002521 PRE_INIT(EOFError)
2522 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002523 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002524 PRE_INIT(NotImplementedError)
2525 PRE_INIT(NameError)
2526 PRE_INIT(UnboundLocalError)
2527 PRE_INIT(AttributeError)
2528 PRE_INIT(SyntaxError)
2529 PRE_INIT(IndentationError)
2530 PRE_INIT(TabError)
2531 PRE_INIT(LookupError)
2532 PRE_INIT(IndexError)
2533 PRE_INIT(KeyError)
2534 PRE_INIT(ValueError)
2535 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536 PRE_INIT(UnicodeEncodeError)
2537 PRE_INIT(UnicodeDecodeError)
2538 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539 PRE_INIT(AssertionError)
2540 PRE_INIT(ArithmeticError)
2541 PRE_INIT(FloatingPointError)
2542 PRE_INIT(OverflowError)
2543 PRE_INIT(ZeroDivisionError)
2544 PRE_INIT(SystemError)
2545 PRE_INIT(ReferenceError)
2546 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002547 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002548 PRE_INIT(Warning)
2549 PRE_INIT(UserWarning)
2550 PRE_INIT(DeprecationWarning)
2551 PRE_INIT(PendingDeprecationWarning)
2552 PRE_INIT(SyntaxWarning)
2553 PRE_INIT(RuntimeWarning)
2554 PRE_INIT(FutureWarning)
2555 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002556 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002557 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002558 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002559
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002560 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002561 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002562
Louie Luc4318542017-03-29 13:28:15 +08002563 PRE_INIT(BlockingIOError)
2564 PRE_INIT(BrokenPipeError)
2565 PRE_INIT(ChildProcessError)
2566 PRE_INIT(ConnectionAbortedError)
2567 PRE_INIT(ConnectionRefusedError)
2568 PRE_INIT(ConnectionResetError)
2569 PRE_INIT(FileExistsError)
2570 PRE_INIT(FileNotFoundError)
2571 PRE_INIT(IsADirectoryError)
2572 PRE_INIT(NotADirectoryError)
2573 PRE_INIT(InterruptedError)
2574 PRE_INIT(PermissionError)
2575 PRE_INIT(ProcessLookupError)
2576 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002577
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578 bdict = PyModule_GetDict(bltinmod);
2579 if (bdict == NULL)
2580 Py_FatalError("exceptions bootstrapping error.");
2581
2582 POST_INIT(BaseException)
2583 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002585 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 POST_INIT(StopIteration)
2587 POST_INIT(GeneratorExit)
2588 POST_INIT(SystemExit)
2589 POST_INIT(KeyboardInterrupt)
2590 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002591 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002593 INIT_ALIAS(EnvironmentError, OSError)
2594 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002596 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002598 POST_INIT(EOFError)
2599 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002600 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002601 POST_INIT(NotImplementedError)
2602 POST_INIT(NameError)
2603 POST_INIT(UnboundLocalError)
2604 POST_INIT(AttributeError)
2605 POST_INIT(SyntaxError)
2606 POST_INIT(IndentationError)
2607 POST_INIT(TabError)
2608 POST_INIT(LookupError)
2609 POST_INIT(IndexError)
2610 POST_INIT(KeyError)
2611 POST_INIT(ValueError)
2612 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613 POST_INIT(UnicodeEncodeError)
2614 POST_INIT(UnicodeDecodeError)
2615 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002616 POST_INIT(AssertionError)
2617 POST_INIT(ArithmeticError)
2618 POST_INIT(FloatingPointError)
2619 POST_INIT(OverflowError)
2620 POST_INIT(ZeroDivisionError)
2621 POST_INIT(SystemError)
2622 POST_INIT(ReferenceError)
2623 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002624 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002625 POST_INIT(Warning)
2626 POST_INIT(UserWarning)
2627 POST_INIT(DeprecationWarning)
2628 POST_INIT(PendingDeprecationWarning)
2629 POST_INIT(SyntaxWarning)
2630 POST_INIT(RuntimeWarning)
2631 POST_INIT(FutureWarning)
2632 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002633 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002634 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002635 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002636
Antoine Pitrouac456a12012-01-18 21:35:21 +01002637 if (!errnomap) {
2638 errnomap = PyDict_New();
2639 if (!errnomap)
2640 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2641 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002642
2643 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002644 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002645
Louie Luc4318542017-03-29 13:28:15 +08002646 POST_INIT(BlockingIOError)
2647 ADD_ERRNO(BlockingIOError, EAGAIN)
2648 ADD_ERRNO(BlockingIOError, EALREADY)
2649 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2650 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2651 POST_INIT(BrokenPipeError)
2652 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002653#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002654 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002655#endif
Louie Luc4318542017-03-29 13:28:15 +08002656 POST_INIT(ChildProcessError)
2657 ADD_ERRNO(ChildProcessError, ECHILD)
2658 POST_INIT(ConnectionAbortedError)
2659 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2660 POST_INIT(ConnectionRefusedError)
2661 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2662 POST_INIT(ConnectionResetError)
2663 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2664 POST_INIT(FileExistsError)
2665 ADD_ERRNO(FileExistsError, EEXIST)
2666 POST_INIT(FileNotFoundError)
2667 ADD_ERRNO(FileNotFoundError, ENOENT)
2668 POST_INIT(IsADirectoryError)
2669 ADD_ERRNO(IsADirectoryError, EISDIR)
2670 POST_INIT(NotADirectoryError)
2671 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2672 POST_INIT(InterruptedError)
2673 ADD_ERRNO(InterruptedError, EINTR)
2674 POST_INIT(PermissionError)
2675 ADD_ERRNO(PermissionError, EACCES)
2676 ADD_ERRNO(PermissionError, EPERM)
2677 POST_INIT(ProcessLookupError)
2678 ADD_ERRNO(ProcessLookupError, ESRCH)
2679 POST_INIT(TimeoutError)
2680 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002681
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002682 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002683
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002684 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002685 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002686 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002687 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002688 "recursion errors");
2689 else {
2690 PyBaseExceptionObject *err_inst =
2691 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2692 PyObject *args_tuple;
2693 PyObject *exc_message;
2694 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2695 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002696 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002697 "pre-allocation");
2698 args_tuple = PyTuple_Pack(1, exc_message);
2699 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002700 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002701 "pre-allocation");
2702 Py_DECREF(exc_message);
2703 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002704 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002705 Py_DECREF(args_tuple);
2706 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002707 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002708}
2709
2710void
2711_PyExc_Fini(void)
2712{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002713 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002714 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002715 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002716}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002717
2718/* Helper to do the equivalent of "raise X from Y" in C, but always using
2719 * the current exception rather than passing one in.
2720 *
2721 * We currently limit this to *only* exceptions that use the BaseException
2722 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2723 * those correctly without losing data and without losing backwards
2724 * compatibility.
2725 *
2726 * We also aim to rule out *all* exceptions that might be storing additional
2727 * state, whether by having a size difference relative to BaseException,
2728 * additional arguments passed in during construction or by having a
2729 * non-empty instance dict.
2730 *
2731 * We need to be very careful with what we wrap, since changing types to
2732 * a broader exception type would be backwards incompatible for
2733 * existing codecs, and with different init or new method implementations
2734 * may either not support instantiation with PyErr_Format or lose
2735 * information when instantiated that way.
2736 *
2737 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2738 * fact that exceptions are expected to support pickling. If more builtin
2739 * exceptions (e.g. AttributeError) start to be converted to rich
2740 * exceptions with additional attributes, that's probably a better approach
2741 * to pursue over adding special cases for particular stateful subclasses.
2742 *
2743 * Returns a borrowed reference to the new exception (if any), NULL if the
2744 * existing exception was left in place.
2745 */
2746PyObject *
2747_PyErr_TrySetFromCause(const char *format, ...)
2748{
2749 PyObject* msg_prefix;
2750 PyObject *exc, *val, *tb;
2751 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002752 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002753 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002754 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002755 PyObject *new_exc, *new_val, *new_tb;
2756 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002757 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002758
Nick Coghlan8b097b42013-11-13 23:49:21 +10002759 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002760 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002761 /* Ensure type info indicates no extra state is stored at the C level
2762 * and that the type can be reinstantiated using PyErr_Format
2763 */
2764 caught_type_size = caught_type->tp_basicsize;
2765 base_exc_size = _PyExc_BaseException.tp_basicsize;
2766 same_basic_size = (
2767 caught_type_size == base_exc_size ||
2768 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002769 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002770 )
2771 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002772 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002773 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002774 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002775 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002776 /* We can't be sure we can wrap this safely, since it may contain
2777 * more state than just the exception type. Accordingly, we just
2778 * leave it alone.
2779 */
2780 PyErr_Restore(exc, val, tb);
2781 return NULL;
2782 }
2783
2784 /* Check the args are empty or contain a single string */
2785 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002786 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002787 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002788 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002789 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002790 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002791 /* More than 1 arg, or the one arg we do have isn't a string
2792 */
2793 PyErr_Restore(exc, val, tb);
2794 return NULL;
2795 }
2796
2797 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002798 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002799 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002800 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002801 /* While we could potentially copy a non-empty instance dictionary
2802 * to the replacement exception, for now we take the more
2803 * conservative path of leaving exceptions with attributes set
2804 * alone.
2805 */
2806 PyErr_Restore(exc, val, tb);
2807 return NULL;
2808 }
2809
2810 /* For exceptions that we can wrap safely, we chain the original
2811 * exception to a new one of the exact same type with an
2812 * error message that mentions the additional details and the
2813 * original exception.
2814 *
2815 * It would be nice to wrap OSError and various other exception
2816 * types as well, but that's quite a bit trickier due to the extra
2817 * state potentially stored on OSError instances.
2818 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002819 /* Ensure the traceback is set correctly on the existing exception */
2820 if (tb != NULL) {
2821 PyException_SetTraceback(val, tb);
2822 Py_DECREF(tb);
2823 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002824
Christian Heimes507eabd2013-11-14 01:39:35 +01002825#ifdef HAVE_STDARG_PROTOTYPES
2826 va_start(vargs, format);
2827#else
2828 va_start(vargs);
2829#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002830 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002831 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002832 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002833 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002834 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002835 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002836 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002837
2838 PyErr_Format(exc, "%U (%s: %S)",
2839 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002840 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002841 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002842 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2843 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2844 PyException_SetCause(new_val, val);
2845 PyErr_Restore(new_exc, new_val, new_tb);
2846 return new_val;
2847}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002848
2849
2850/* To help with migration from Python 2, SyntaxError.__init__ applies some
2851 * heuristics to try to report a more meaningful exception when print and
2852 * exec are used like statements.
2853 *
2854 * The heuristics are currently expected to detect the following cases:
2855 * - top level statement
2856 * - statement in a nested suite
2857 * - trailing section of a one line complex statement
2858 *
2859 * They're currently known not to trigger:
2860 * - after a semi-colon
2861 *
2862 * The error message can be a bit odd in cases where the "arguments" are
2863 * completely illegal syntactically, but that isn't worth the hassle of
2864 * fixing.
2865 *
2866 * We also can't do anything about cases that are legal Python 3 syntax
2867 * but mean something entirely different from what they did in Python 2
2868 * (omitting the arguments entirely, printing items preceded by a unary plus
2869 * or minus, using the stream redirection syntax).
2870 */
2871
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302872
2873// Static helper for setting legacy print error message
2874static int
2875_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2876{
2877 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2878 if (strip_sep_obj == NULL)
2879 return -1;
2880
2881 // PRINT_OFFSET is to remove `print ` word from the data.
2882 const int PRINT_OFFSET = 6;
2883 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2884 PyObject *data = PyUnicode_Substring(self->text, PRINT_OFFSET, text_len);
2885
2886 if (data == NULL) {
2887 Py_DECREF(strip_sep_obj);
2888 return -1;
2889 }
2890 PyObject *new_data = _PyUnicode_XStrip(data, 2, strip_sep_obj);
2891 Py_DECREF(data);
2892 Py_DECREF(strip_sep_obj);
2893
2894 if (new_data == NULL) {
2895 return -1;
2896 }
2897 // gets the modified text_len after stripping `print `
2898 text_len = PyUnicode_GET_LENGTH(new_data);
2899 const char *maybe_end_arg = "";
2900 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2901 maybe_end_arg = " end=\" \"";
2902 }
2903 PyObject *error_msg = PyUnicode_FromFormat(
2904 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2905 new_data, maybe_end_arg
2906 );
2907 Py_DECREF(new_data);
2908 if (error_msg == NULL)
2909 return -1;
2910
2911 Py_XSETREF(self->msg, error_msg);
2912 return 1;
2913}
2914
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002915static int
2916_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2917{
2918 /* Return values:
2919 * -1: an error occurred
2920 * 0: nothing happened
2921 * 1: the check triggered & the error message was changed
2922 */
2923 static PyObject *print_prefix = NULL;
2924 static PyObject *exec_prefix = NULL;
2925 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2926 int kind = PyUnicode_KIND(self->text);
2927 void *data = PyUnicode_DATA(self->text);
2928
2929 /* Ignore leading whitespace */
2930 while (start < text_len) {
2931 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2932 if (!Py_UNICODE_ISSPACE(ch))
2933 break;
2934 start++;
2935 }
2936 /* Checking against an empty or whitespace-only part of the string */
2937 if (start == text_len) {
2938 return 0;
2939 }
2940
2941 /* Check for legacy print statements */
2942 if (print_prefix == NULL) {
2943 print_prefix = PyUnicode_InternFromString("print ");
2944 if (print_prefix == NULL) {
2945 return -1;
2946 }
2947 }
2948 if (PyUnicode_Tailmatch(self->text, print_prefix,
2949 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302950
2951 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002952 }
2953
2954 /* Check for legacy exec statements */
2955 if (exec_prefix == NULL) {
2956 exec_prefix = PyUnicode_InternFromString("exec ");
2957 if (exec_prefix == NULL) {
2958 return -1;
2959 }
2960 }
2961 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2962 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002963 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002964 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002965 return 1;
2966 }
2967 /* Fall back to the default error message */
2968 return 0;
2969}
2970
2971static int
2972_report_missing_parentheses(PySyntaxErrorObject *self)
2973{
2974 Py_UCS4 left_paren = 40;
2975 Py_ssize_t left_paren_index;
2976 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2977 int legacy_check_result = 0;
2978
2979 /* Skip entirely if there is an opening parenthesis */
2980 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2981 0, text_len, 1);
2982 if (left_paren_index < -1) {
2983 return -1;
2984 }
2985 if (left_paren_index != -1) {
2986 /* Use default error message for any line with an opening paren */
2987 return 0;
2988 }
2989 /* Handle the simple statement case */
2990 legacy_check_result = _check_for_legacy_statements(self, 0);
2991 if (legacy_check_result < 0) {
2992 return -1;
2993
2994 }
2995 if (legacy_check_result == 0) {
2996 /* Handle the one-line complex statement case */
2997 Py_UCS4 colon = 58;
2998 Py_ssize_t colon_index;
2999 colon_index = PyUnicode_FindChar(self->text, colon,
3000 0, text_len, 1);
3001 if (colon_index < -1) {
3002 return -1;
3003 }
3004 if (colon_index >= 0 && colon_index < text_len) {
3005 /* Check again, starting from just after the colon */
3006 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3007 return -1;
3008 }
3009 }
3010 }
3011 return 0;
3012}