blob: d158b9768d45f50663d620b3c91a87aebadcaddd [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020019
20/* The dict map from errno codes to OSError subclasses */
21static PyObject *errnomap = NULL;
22
23
Thomas Wouters477c8d52006-05-27 19:21:47 +000024/* NOTE: If the exception class hierarchy changes, don't forget to update
25 * Lib/test/exception_hierarchy.txt
26 */
27
Thomas Wouters477c8d52006-05-27 19:21:47 +000028/*
29 * BaseException
30 */
31static PyObject *
32BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
33{
34 PyBaseExceptionObject *self;
35
36 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 if (!self)
38 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000039 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000040 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000041 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070042 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000043
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010044 if (args) {
45 self->args = args;
46 Py_INCREF(args);
47 return (PyObject *)self;
48 }
49
Thomas Wouters477c8d52006-05-27 19:21:47 +000050 self->args = PyTuple_New(0);
51 if (!self->args) {
52 Py_DECREF(self);
53 return NULL;
54 }
55
Thomas Wouters477c8d52006-05-27 19:21:47 +000056 return (PyObject *)self;
57}
58
59static int
60BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
61{
Christian Heimes90aa7642007-12-19 02:45:37 +000062 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000063 return -1;
64
Serhiy Storchaka576f1322016-01-05 21:27:54 +020065 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030066 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068 return 0;
69}
70
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000071static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000072BaseException_clear(PyBaseExceptionObject *self)
73{
74 Py_CLEAR(self->dict);
75 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000076 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000077 Py_CLEAR(self->cause);
78 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000079 return 0;
80}
81
82static void
83BaseException_dealloc(PyBaseExceptionObject *self)
84{
Thomas Wouters89f507f2006-12-13 04:49:30 +000085 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000087 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088}
89
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000090static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000091BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
92{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000095 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000096 Py_VISIT(self->cause);
97 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000098 return 0;
99}
100
101static PyObject *
102BaseException_str(PyBaseExceptionObject *self)
103{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000104 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000106 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112}
113
114static PyObject *
115BaseException_repr(PyBaseExceptionObject *self)
116{
Serhiy Storchakac6792272013-10-19 21:03:34 +0300117 const char *name;
118 const char *dot;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119
Serhiy Storchakac6792272013-10-19 21:03:34 +0300120 name = Py_TYPE(self)->tp_name;
121 dot = (const char *) strrchr(name, '.');
Thomas Wouters477c8d52006-05-27 19:21:47 +0000122 if (dot != NULL) name = dot+1;
123
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000124 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125}
126
127/* Pickling support */
128static PyObject *
129BaseException_reduce(PyBaseExceptionObject *self)
130{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135}
136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137/*
138 * Needed for backward compatibility, since exceptions used to store
139 * all their attributes in the __dict__. Code is taken from cPickle's
140 * load_build function.
141 */
142static PyObject *
143BaseException_setstate(PyObject *self, PyObject *state)
144{
145 PyObject *d_key, *d_value;
146 Py_ssize_t i = 0;
147
148 if (state != Py_None) {
149 if (!PyDict_Check(state)) {
150 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
151 return NULL;
152 }
153 while (PyDict_Next(state, &i, &d_key, &d_value)) {
154 if (PyObject_SetAttr(self, d_key, d_value) < 0)
155 return NULL;
156 }
157 }
158 Py_RETURN_NONE;
159}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000160
Collin Winter828f04a2007-08-31 00:04:24 +0000161static PyObject *
162BaseException_with_traceback(PyObject *self, PyObject *tb) {
163 if (PyException_SetTraceback(self, tb))
164 return NULL;
165
166 Py_INCREF(self);
167 return self;
168}
169
Georg Brandl76941002008-05-05 21:38:47 +0000170PyDoc_STRVAR(with_traceback_doc,
171"Exception.with_traceback(tb) --\n\
172 set self.__traceback__ to tb and return self.");
173
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174
175static PyMethodDef BaseException_methods[] = {
176 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000178 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
179 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 {NULL, NULL, 0, NULL},
181};
182
Thomas Wouters477c8d52006-05-27 19:21:47 +0000183static PyObject *
184BaseException_get_args(PyBaseExceptionObject *self)
185{
186 if (self->args == NULL) {
187 Py_INCREF(Py_None);
188 return Py_None;
189 }
190 Py_INCREF(self->args);
191 return self->args;
192}
193
194static int
195BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
196{
197 PyObject *seq;
198 if (val == NULL) {
199 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
200 return -1;
201 }
202 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500203 if (!seq)
204 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300205 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000206 return 0;
207}
208
Collin Winter828f04a2007-08-31 00:04:24 +0000209static PyObject *
210BaseException_get_tb(PyBaseExceptionObject *self)
211{
212 if (self->traceback == NULL) {
213 Py_INCREF(Py_None);
214 return Py_None;
215 }
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
634 if (name) {
635 Py_INCREF(name);
636 Py_XSETREF(self->name, name);
637 }
638 if (path) {
639 Py_INCREF(path);
640 Py_XSETREF(self->path, path);
641 }
642 if (PyTuple_GET_SIZE(args) == 1) {
643 msg = PyTuple_GET_ITEM(args, 0);
644 Py_INCREF(msg);
645 Py_XSETREF(self->msg, msg);
646 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400647
648 return 0;
649}
650
651static int
652ImportError_clear(PyImportErrorObject *self)
653{
654 Py_CLEAR(self->msg);
655 Py_CLEAR(self->name);
656 Py_CLEAR(self->path);
657 return BaseException_clear((PyBaseExceptionObject *)self);
658}
659
660static void
661ImportError_dealloc(PyImportErrorObject *self)
662{
663 _PyObject_GC_UNTRACK(self);
664 ImportError_clear(self);
665 Py_TYPE(self)->tp_free((PyObject *)self);
666}
667
668static int
669ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
670{
671 Py_VISIT(self->msg);
672 Py_VISIT(self->name);
673 Py_VISIT(self->path);
674 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
675}
676
677static PyObject *
678ImportError_str(PyImportErrorObject *self)
679{
Brett Cannon07c6e712012-08-24 13:05:09 -0400680 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400681 Py_INCREF(self->msg);
682 return self->msg;
683 }
684 else {
685 return BaseException_str((PyBaseExceptionObject *)self);
686 }
687}
688
Serhiy Storchakaaf685f92017-04-08 11:25:47 +0300689static PyObject *
690ImportError_getstate(PyImportErrorObject *self)
691{
692 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
693 if (self->name || self->path) {
694 _Py_IDENTIFIER(name);
695 _Py_IDENTIFIER(path);
696 dict = dict ? PyDict_Copy(dict) : PyDict_New();
697 if (dict == NULL)
698 return NULL;
699 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
700 Py_DECREF(dict);
701 return NULL;
702 }
703 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
704 Py_DECREF(dict);
705 return NULL;
706 }
707 return dict;
708 }
709 else if (dict) {
710 Py_INCREF(dict);
711 return dict;
712 }
713 else {
714 Py_RETURN_NONE;
715 }
716}
717
718/* Pickling support */
719static PyObject *
720ImportError_reduce(PyImportErrorObject *self)
721{
722 PyObject *res;
723 PyObject *args;
724 PyObject *state = ImportError_getstate(self);
725 if (state == NULL)
726 return NULL;
727 args = ((PyBaseExceptionObject *)self)->args;
728 if (state == Py_None)
729 res = PyTuple_Pack(2, Py_TYPE(self), args);
730 else
731 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
732 Py_DECREF(state);
733 return res;
734}
735
Brett Cannon79ec55e2012-04-12 20:24:54 -0400736static PyMemberDef ImportError_members[] = {
737 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
738 PyDoc_STR("exception message")},
739 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
740 PyDoc_STR("module name")},
741 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
742 PyDoc_STR("module path")},
743 {NULL} /* Sentinel */
744};
745
746static PyMethodDef ImportError_methods[] = {
Serhiy Storchakaaf685f92017-04-08 11:25:47 +0300747 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400748 {NULL}
749};
750
751ComplexExtendsException(PyExc_Exception, ImportError,
752 ImportError, 0 /* new */,
753 ImportError_methods, ImportError_members,
754 0 /* getset */, ImportError_str,
755 "Import can't find module, or can't find name in "
756 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000757
758/*
Eric Snowc9432652016-09-07 15:42:32 -0700759 * ModuleNotFoundError extends ImportError
760 */
761
762MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
763 "Module not found.");
764
765/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200766 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000767 */
768
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200769#ifdef MS_WINDOWS
770#include "errmap.h"
771#endif
772
Thomas Wouters477c8d52006-05-27 19:21:47 +0000773/* Where a function has a single filename, such as open() or some
774 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
775 * called, giving a third argument which is the filename. But, so
776 * that old code using in-place unpacking doesn't break, e.g.:
777 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200778 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000779 *
780 * we hack args so that it only contains two items. This also
781 * means we need our own __str__() which prints out the filename
782 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800783 *
784 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800785 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
786 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000787 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200788
Antoine Pitroue0e27352011-12-15 14:31:28 +0100789/* This function doesn't cleanup on error, the caller should */
790static int
791oserror_parse_args(PyObject **p_args,
792 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800793 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200794#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100795 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200796#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100797 )
798{
799 Py_ssize_t nargs;
800 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800801#ifndef MS_WINDOWS
802 /*
803 * ignored on non-Windows platforms,
804 * but parsed so OSError has a consistent signature
805 */
806 PyObject *_winerror = NULL;
807 PyObject **winerror = &_winerror;
808#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200810 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000811
Larry Hastingsb0827312014-02-09 22:05:19 -0800812 if (nargs >= 2 && nargs <= 5) {
813 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
814 myerrno, strerror,
815 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100816 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800817#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100818 if (*winerror && PyLong_Check(*winerror)) {
819 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 PyObject *newargs;
821 Py_ssize_t i;
822
Antoine Pitroue0e27352011-12-15 14:31:28 +0100823 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200824 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100825 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200826 /* Set errno to the corresponding POSIX errno (overriding
827 first argument). Windows Socket error codes (>= 10000)
828 have the same value as their POSIX counterparts.
829 */
830 if (winerrcode < 10000)
831 errcode = winerror_to_errno(winerrcode);
832 else
833 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100834 *myerrno = PyLong_FromLong(errcode);
835 if (!*myerrno)
836 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200837 newargs = PyTuple_New(nargs);
838 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100839 return -1;
840 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200841 for (i = 1; i < nargs; i++) {
842 PyObject *val = PyTuple_GET_ITEM(args, i);
843 Py_INCREF(val);
844 PyTuple_SET_ITEM(newargs, i, val);
845 }
846 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100847 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200848 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800849#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200850 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000851
Antoine Pitroue0e27352011-12-15 14:31:28 +0100852 return 0;
853}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000854
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855static int
856oserror_init(PyOSErrorObject *self, PyObject **p_args,
857 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800858 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100859#ifdef MS_WINDOWS
860 , PyObject *winerror
861#endif
862 )
863{
864 PyObject *args = *p_args;
865 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000866
867 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200868 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100869 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200870 PyNumber_Check(filename)) {
871 /* BlockingIOError's 3rd argument can be the number of
872 * characters written.
873 */
874 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
875 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100876 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200877 }
878 else {
879 Py_INCREF(filename);
880 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881
Larry Hastingsb0827312014-02-09 22:05:19 -0800882 if (filename2 && filename2 != Py_None) {
883 Py_INCREF(filename2);
884 self->filename2 = filename2;
885 }
886
887 if (nargs >= 2 && nargs <= 5) {
888 /* filename, filename2, and winerror are removed from the args tuple
889 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100890 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100892 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000893
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200894 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100895 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200896 }
897 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000898 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200899 Py_XINCREF(myerrno);
900 self->myerrno = myerrno;
901
902 Py_XINCREF(strerror);
903 self->strerror = strerror;
904
905#ifdef MS_WINDOWS
906 Py_XINCREF(winerror);
907 self->winerror = winerror;
908#endif
909
Antoine Pitroue0e27352011-12-15 14:31:28 +0100910 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300911 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100912 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100913
914 return 0;
915}
916
917static PyObject *
918OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
919static int
920OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
921
922static int
923oserror_use_init(PyTypeObject *type)
924{
Martin Panter7462b6492015-11-02 03:37:02 +0000925 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100926 extraneous argument to __new__ to be ignored. The only reasonable
927 solution, given __new__ takes a variable number of arguments,
928 is to defer arg parsing and initialization to __init__.
929
Martin Pantere26da7c2016-06-02 10:07:09 +0000930 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100931 with the right arguments.
932
933 (see http://bugs.python.org/issue12555#msg148829 )
934 */
935 if (type->tp_init != (initproc) OSError_init &&
936 type->tp_new == (newfunc) OSError_new) {
937 assert((PyObject *) type != PyExc_OSError);
938 return 1;
939 }
940 return 0;
941}
942
943static PyObject *
944OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
945{
946 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800947 PyObject *myerrno = NULL, *strerror = NULL;
948 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100949#ifdef MS_WINDOWS
950 PyObject *winerror = NULL;
951#endif
952
Victor Stinner46ef3192013-11-14 22:31:41 +0100953 Py_INCREF(args);
954
Antoine Pitroue0e27352011-12-15 14:31:28 +0100955 if (!oserror_use_init(type)) {
956 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100957 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100958
Larry Hastingsb0827312014-02-09 22:05:19 -0800959 if (oserror_parse_args(&args, &myerrno, &strerror,
960 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100961#ifdef MS_WINDOWS
962 , &winerror
963#endif
964 ))
965 goto error;
966
967 if (myerrno && PyLong_Check(myerrno) &&
968 errnomap && (PyObject *) type == PyExc_OSError) {
969 PyObject *newtype;
970 newtype = PyDict_GetItem(errnomap, myerrno);
971 if (newtype) {
972 assert(PyType_Check(newtype));
973 type = (PyTypeObject *) newtype;
974 }
975 else if (PyErr_Occurred())
976 goto error;
977 }
978 }
979
980 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
981 if (!self)
982 goto error;
983
984 self->dict = NULL;
985 self->traceback = self->cause = self->context = NULL;
986 self->written = -1;
987
988 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800989 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100990#ifdef MS_WINDOWS
991 , winerror
992#endif
993 ))
994 goto error;
995 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200996 else {
997 self->args = PyTuple_New(0);
998 if (self->args == NULL)
999 goto error;
1000 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001001
Victor Stinner46ef3192013-11-14 22:31:41 +01001002 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001003 return (PyObject *) self;
1004
1005error:
1006 Py_XDECREF(args);
1007 Py_XDECREF(self);
1008 return NULL;
1009}
1010
1011static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001012OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001013{
Larry Hastingsb0827312014-02-09 22:05:19 -08001014 PyObject *myerrno = NULL, *strerror = NULL;
1015 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001016#ifdef MS_WINDOWS
1017 PyObject *winerror = NULL;
1018#endif
1019
1020 if (!oserror_use_init(Py_TYPE(self)))
1021 /* Everything already done in OSError_new */
1022 return 0;
1023
1024 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1025 return -1;
1026
1027 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001028 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001029#ifdef MS_WINDOWS
1030 , &winerror
1031#endif
1032 ))
1033 goto error;
1034
Larry Hastingsb0827312014-02-09 22:05:19 -08001035 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001036#ifdef MS_WINDOWS
1037 , winerror
1038#endif
1039 ))
1040 goto error;
1041
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001043
1044error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001045 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001046 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001047}
1048
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001049static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001050OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051{
1052 Py_CLEAR(self->myerrno);
1053 Py_CLEAR(self->strerror);
1054 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001055 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056#ifdef MS_WINDOWS
1057 Py_CLEAR(self->winerror);
1058#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001059 return BaseException_clear((PyBaseExceptionObject *)self);
1060}
1061
1062static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001063OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001066 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001067 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068}
1069
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001070static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072 void *arg)
1073{
1074 Py_VISIT(self->myerrno);
1075 Py_VISIT(self->strerror);
1076 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001077 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078#ifdef MS_WINDOWS
1079 Py_VISIT(self->winerror);
1080#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1082}
1083
1084static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001085OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086{
Larry Hastingsb0827312014-02-09 22:05:19 -08001087#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001088#ifdef MS_WINDOWS
1089 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001090 if (self->winerror && self->filename) {
1091 if (self->filename2) {
1092 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1093 OR_NONE(self->winerror),
1094 OR_NONE(self->strerror),
1095 self->filename,
1096 self->filename2);
1097 } else {
1098 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1099 OR_NONE(self->winerror),
1100 OR_NONE(self->strerror),
1101 self->filename);
1102 }
1103 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001105 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001106 self->winerror ? self->winerror: Py_None,
1107 self->strerror ? self->strerror: Py_None);
1108#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001109 if (self->filename) {
1110 if (self->filename2) {
1111 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1112 OR_NONE(self->myerrno),
1113 OR_NONE(self->strerror),
1114 self->filename,
1115 self->filename2);
1116 } else {
1117 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1118 OR_NONE(self->myerrno),
1119 OR_NONE(self->strerror),
1120 self->filename);
1121 }
1122 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001123 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001124 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001125 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001126 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127}
1128
Thomas Wouters477c8d52006-05-27 19:21:47 +00001129static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131{
1132 PyObject *args = self->args;
1133 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001136 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001137 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001138 Py_ssize_t size = self->filename2 ? 5 : 3;
1139 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001140 if (!args)
1141 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001142
1143 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 Py_INCREF(tmp);
1145 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001146
1147 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148 Py_INCREF(tmp);
1149 PyTuple_SET_ITEM(args, 1, tmp);
1150
1151 Py_INCREF(self->filename);
1152 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001153
1154 if (self->filename2) {
1155 /*
1156 * This tuple is essentially used as OSError(*args).
1157 * So, to recreate filename2, we need to pass in
1158 * winerror as well.
1159 */
1160 Py_INCREF(Py_None);
1161 PyTuple_SET_ITEM(args, 3, Py_None);
1162
1163 /* filename2 */
1164 Py_INCREF(self->filename2);
1165 PyTuple_SET_ITEM(args, 4, self->filename2);
1166 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001167 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001168 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001169
1170 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001171 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001172 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001173 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001174 Py_DECREF(args);
1175 return res;
1176}
1177
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001178static PyObject *
1179OSError_written_get(PyOSErrorObject *self, void *context)
1180{
1181 if (self->written == -1) {
1182 PyErr_SetString(PyExc_AttributeError, "characters_written");
1183 return NULL;
1184 }
1185 return PyLong_FromSsize_t(self->written);
1186}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001187
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001188static int
1189OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1190{
1191 Py_ssize_t n;
1192 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1193 if (n == -1 && PyErr_Occurred())
1194 return -1;
1195 self->written = n;
1196 return 0;
1197}
1198
1199static PyMemberDef OSError_members[] = {
1200 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1201 PyDoc_STR("POSIX exception code")},
1202 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1203 PyDoc_STR("exception strerror")},
1204 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1205 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001206 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1207 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001208#ifdef MS_WINDOWS
1209 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1210 PyDoc_STR("Win32 exception code")},
1211#endif
1212 {NULL} /* Sentinel */
1213};
1214
1215static PyMethodDef OSError_methods[] = {
1216 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001217 {NULL}
1218};
1219
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001220static PyGetSetDef OSError_getset[] = {
1221 {"characters_written", (getter) OSError_written_get,
1222 (setter) OSError_written_set, NULL},
1223 {NULL}
1224};
1225
1226
1227ComplexExtendsException(PyExc_Exception, OSError,
1228 OSError, OSError_new,
1229 OSError_methods, OSError_members, OSError_getset,
1230 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001231 "Base class for I/O related errors.");
1232
1233
1234/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001235 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001237MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1238 "I/O operation would block.");
1239MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1240 "Connection error.");
1241MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1242 "Child process error.");
1243MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1244 "Broken pipe.");
1245MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1246 "Connection aborted.");
1247MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1248 "Connection refused.");
1249MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1250 "Connection reset.");
1251MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1252 "File already exists.");
1253MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1254 "File not found.");
1255MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1256 "Operation doesn't work on directories.");
1257MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1258 "Operation only works on directories.");
1259MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1260 "Interrupted by signal.");
1261MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1262 "Not enough permissions.");
1263MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1264 "Process not found.");
1265MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1266 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267
1268/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001269 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001271SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001272 "Read beyond end of file.");
1273
1274
1275/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001276 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001277 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001278SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001279 "Unspecified run-time error.");
1280
Yury Selivanovf488fb42015-07-03 01:04:23 -04001281/*
1282 * RecursionError extends RuntimeError
1283 */
1284SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1285 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001286
1287/*
1288 * NotImplementedError extends RuntimeError
1289 */
1290SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1291 "Method or function hasn't been implemented yet.");
1292
1293/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001294 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001296SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001297 "Name not found globally.");
1298
1299/*
1300 * UnboundLocalError extends NameError
1301 */
1302SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1303 "Local name referenced but not bound to a value.");
1304
1305/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001306 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001307 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001308SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001309 "Attribute not found.");
1310
1311
1312/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001313 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001316/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001317static int _report_missing_parentheses(PySyntaxErrorObject *self);
1318
Thomas Wouters477c8d52006-05-27 19:21:47 +00001319static int
1320SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1321{
1322 PyObject *info = NULL;
1323 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1324
1325 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1326 return -1;
1327
1328 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001329 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001330 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001331 }
1332 if (lenargs == 2) {
1333 info = PyTuple_GET_ITEM(args, 1);
1334 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001335 if (!info)
1336 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001338 if (PyTuple_GET_SIZE(info) != 4) {
1339 /* not a very good error message, but it's what Python 2.4 gives */
1340 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1341 Py_DECREF(info);
1342 return -1;
1343 }
1344
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001345 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001346 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001348 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001349 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001350
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001351 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001352 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001354 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001355 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001356
1357 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001358
1359 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1360 if (self->text && PyUnicode_Check(self->text)) {
1361 if (_report_missing_parentheses(self) < 0) {
1362 return -1;
1363 }
1364 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001365 }
1366 return 0;
1367}
1368
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001369static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370SyntaxError_clear(PySyntaxErrorObject *self)
1371{
1372 Py_CLEAR(self->msg);
1373 Py_CLEAR(self->filename);
1374 Py_CLEAR(self->lineno);
1375 Py_CLEAR(self->offset);
1376 Py_CLEAR(self->text);
1377 Py_CLEAR(self->print_file_and_line);
1378 return BaseException_clear((PyBaseExceptionObject *)self);
1379}
1380
1381static void
1382SyntaxError_dealloc(PySyntaxErrorObject *self)
1383{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001385 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001386 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387}
1388
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001389static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001390SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1391{
1392 Py_VISIT(self->msg);
1393 Py_VISIT(self->filename);
1394 Py_VISIT(self->lineno);
1395 Py_VISIT(self->offset);
1396 Py_VISIT(self->text);
1397 Py_VISIT(self->print_file_and_line);
1398 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1399}
1400
1401/* This is called "my_basename" instead of just "basename" to avoid name
1402 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1403 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001404static PyObject*
1405my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001406{
Victor Stinner6237daf2010-04-28 17:26:19 +00001407 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001408 int kind;
1409 void *data;
1410
1411 if (PyUnicode_READY(name))
1412 return NULL;
1413 kind = PyUnicode_KIND(name);
1414 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001415 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001416 offset = 0;
1417 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001418 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001419 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001420 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001421 if (offset != 0)
1422 return PyUnicode_Substring(name, offset, size);
1423 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001424 Py_INCREF(name);
1425 return name;
1426 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001427}
1428
1429
1430static PyObject *
1431SyntaxError_str(PySyntaxErrorObject *self)
1432{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001433 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001434 PyObject *filename;
1435 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001436 /* Below, we always ignore overflow errors, just printing -1.
1437 Still, we cannot allow an OverflowError to be raised, so
1438 we need to call PyLong_AsLongAndOverflow. */
1439 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001440
1441 /* XXX -- do all the additional formatting with filename and
1442 lineno here */
1443
Neal Norwitzed2b7392007-08-26 04:51:10 +00001444 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001445 filename = my_basename(self->filename);
1446 if (filename == NULL)
1447 return NULL;
1448 } else {
1449 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001450 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001451 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001453 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001454 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001456 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001457 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001458 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001459 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001461 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001462 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001463 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001464 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001465 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001466 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001467 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001468 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001469 Py_XDECREF(filename);
1470 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001471}
1472
1473static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001474 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1475 PyDoc_STR("exception msg")},
1476 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1477 PyDoc_STR("exception filename")},
1478 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1479 PyDoc_STR("exception lineno")},
1480 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1481 PyDoc_STR("exception offset")},
1482 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1483 PyDoc_STR("exception text")},
1484 {"print_file_and_line", T_OBJECT,
1485 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1486 PyDoc_STR("exception print_file_and_line")},
1487 {NULL} /* Sentinel */
1488};
1489
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001490ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001491 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001492 SyntaxError_str, "Invalid syntax.");
1493
1494
1495/*
1496 * IndentationError extends SyntaxError
1497 */
1498MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1499 "Improper indentation.");
1500
1501
1502/*
1503 * TabError extends IndentationError
1504 */
1505MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1506 "Improper mixture of spaces and tabs.");
1507
1508
1509/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001510 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001511 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001512SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001513 "Base class for lookup errors.");
1514
1515
1516/*
1517 * IndexError extends LookupError
1518 */
1519SimpleExtendsException(PyExc_LookupError, IndexError,
1520 "Sequence index out of range.");
1521
1522
1523/*
1524 * KeyError extends LookupError
1525 */
1526static PyObject *
1527KeyError_str(PyBaseExceptionObject *self)
1528{
1529 /* If args is a tuple of exactly one item, apply repr to args[0].
1530 This is done so that e.g. the exception raised by {}[''] prints
1531 KeyError: ''
1532 rather than the confusing
1533 KeyError
1534 alone. The downside is that if KeyError is raised with an explanatory
1535 string, that string will be displayed in quotes. Too bad.
1536 If args is anything else, use the default BaseException__str__().
1537 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001538 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001539 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001540 }
1541 return BaseException_str(self);
1542}
1543
1544ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001545 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001546
1547
1548/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001549 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001550 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001551SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001552 "Inappropriate argument value (of correct type).");
1553
1554/*
1555 * UnicodeError extends ValueError
1556 */
1557
1558SimpleExtendsException(PyExc_ValueError, UnicodeError,
1559 "Unicode related error.");
1560
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001562get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001563{
1564 if (!attr) {
1565 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1566 return NULL;
1567 }
1568
Christian Heimes72b710a2008-05-26 13:28:38 +00001569 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001570 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1571 return NULL;
1572 }
1573 Py_INCREF(attr);
1574 return attr;
1575}
1576
1577static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001578get_unicode(PyObject *attr, const char *name)
1579{
1580 if (!attr) {
1581 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1582 return NULL;
1583 }
1584
1585 if (!PyUnicode_Check(attr)) {
1586 PyErr_Format(PyExc_TypeError,
1587 "%.200s attribute must be unicode", name);
1588 return NULL;
1589 }
1590 Py_INCREF(attr);
1591 return attr;
1592}
1593
Walter Dörwaldd2034312007-05-18 16:29:38 +00001594static int
1595set_unicodefromstring(PyObject **attr, const char *value)
1596{
1597 PyObject *obj = PyUnicode_FromString(value);
1598 if (!obj)
1599 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001600 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001601 return 0;
1602}
1603
Thomas Wouters477c8d52006-05-27 19:21:47 +00001604PyObject *
1605PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1606{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001607 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001608}
1609
1610PyObject *
1611PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1612{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001613 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001614}
1615
1616PyObject *
1617PyUnicodeEncodeError_GetObject(PyObject *exc)
1618{
1619 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1620}
1621
1622PyObject *
1623PyUnicodeDecodeError_GetObject(PyObject *exc)
1624{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001625 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001626}
1627
1628PyObject *
1629PyUnicodeTranslateError_GetObject(PyObject *exc)
1630{
1631 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1632}
1633
1634int
1635PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1636{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001637 Py_ssize_t size;
1638 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1639 "object");
1640 if (!obj)
1641 return -1;
1642 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001643 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001644 if (*start<0)
1645 *start = 0; /*XXX check for values <0*/
1646 if (*start>=size)
1647 *start = size-1;
1648 Py_DECREF(obj);
1649 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001650}
1651
1652
1653int
1654PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1655{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001656 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001657 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001658 if (!obj)
1659 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001660 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001661 *start = ((PyUnicodeErrorObject *)exc)->start;
1662 if (*start<0)
1663 *start = 0;
1664 if (*start>=size)
1665 *start = size-1;
1666 Py_DECREF(obj);
1667 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001668}
1669
1670
1671int
1672PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1673{
1674 return PyUnicodeEncodeError_GetStart(exc, start);
1675}
1676
1677
1678int
1679PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1680{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001681 ((PyUnicodeErrorObject *)exc)->start = start;
1682 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001683}
1684
1685
1686int
1687PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1688{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001689 ((PyUnicodeErrorObject *)exc)->start = start;
1690 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001691}
1692
1693
1694int
1695PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1696{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001697 ((PyUnicodeErrorObject *)exc)->start = start;
1698 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699}
1700
1701
1702int
1703PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1704{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001705 Py_ssize_t size;
1706 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1707 "object");
1708 if (!obj)
1709 return -1;
1710 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001711 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001712 if (*end<1)
1713 *end = 1;
1714 if (*end>size)
1715 *end = size;
1716 Py_DECREF(obj);
1717 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718}
1719
1720
1721int
1722PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1723{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001724 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001725 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001726 if (!obj)
1727 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001728 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001729 *end = ((PyUnicodeErrorObject *)exc)->end;
1730 if (*end<1)
1731 *end = 1;
1732 if (*end>size)
1733 *end = size;
1734 Py_DECREF(obj);
1735 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001736}
1737
1738
1739int
1740PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1741{
1742 return PyUnicodeEncodeError_GetEnd(exc, start);
1743}
1744
1745
1746int
1747PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1748{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001749 ((PyUnicodeErrorObject *)exc)->end = end;
1750 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001751}
1752
1753
1754int
1755PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1756{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001757 ((PyUnicodeErrorObject *)exc)->end = end;
1758 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759}
1760
1761
1762int
1763PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1764{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001765 ((PyUnicodeErrorObject *)exc)->end = end;
1766 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001767}
1768
1769PyObject *
1770PyUnicodeEncodeError_GetReason(PyObject *exc)
1771{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001772 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773}
1774
1775
1776PyObject *
1777PyUnicodeDecodeError_GetReason(PyObject *exc)
1778{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001779 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780}
1781
1782
1783PyObject *
1784PyUnicodeTranslateError_GetReason(PyObject *exc)
1785{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001786 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001787}
1788
1789
1790int
1791PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1792{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001793 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1794 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001795}
1796
1797
1798int
1799PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1800{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001801 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1802 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803}
1804
1805
1806int
1807PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1808{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001809 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1810 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001811}
1812
1813
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815UnicodeError_clear(PyUnicodeErrorObject *self)
1816{
1817 Py_CLEAR(self->encoding);
1818 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819 Py_CLEAR(self->reason);
1820 return BaseException_clear((PyBaseExceptionObject *)self);
1821}
1822
1823static void
1824UnicodeError_dealloc(PyUnicodeErrorObject *self)
1825{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001826 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001827 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001828 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829}
1830
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001831static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1833{
1834 Py_VISIT(self->encoding);
1835 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836 Py_VISIT(self->reason);
1837 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1838}
1839
1840static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001841 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1842 PyDoc_STR("exception encoding")},
1843 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1844 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001845 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001847 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 PyDoc_STR("exception end")},
1849 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1850 PyDoc_STR("exception reason")},
1851 {NULL} /* Sentinel */
1852};
1853
1854
1855/*
1856 * UnicodeEncodeError extends UnicodeError
1857 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001858
1859static int
1860UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1861{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001862 PyUnicodeErrorObject *err;
1863
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1865 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001866
1867 err = (PyUnicodeErrorObject *)self;
1868
1869 Py_CLEAR(err->encoding);
1870 Py_CLEAR(err->object);
1871 Py_CLEAR(err->reason);
1872
1873 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1874 &PyUnicode_Type, &err->encoding,
1875 &PyUnicode_Type, &err->object,
1876 &err->start,
1877 &err->end,
1878 &PyUnicode_Type, &err->reason)) {
1879 err->encoding = err->object = err->reason = NULL;
1880 return -1;
1881 }
1882
Martin v. Löwisb09af032011-11-04 11:16:41 +01001883 if (PyUnicode_READY(err->object) < -1) {
1884 err->encoding = NULL;
1885 return -1;
1886 }
1887
Guido van Rossum98297ee2007-11-06 21:34:58 +00001888 Py_INCREF(err->encoding);
1889 Py_INCREF(err->object);
1890 Py_INCREF(err->reason);
1891
1892 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893}
1894
1895static PyObject *
1896UnicodeEncodeError_str(PyObject *self)
1897{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001898 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001899 PyObject *result = NULL;
1900 PyObject *reason_str = NULL;
1901 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001902
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001903 if (!uself->object)
1904 /* Not properly initialized. */
1905 return PyUnicode_FromString("");
1906
Eric Smith0facd772010-02-24 15:42:29 +00001907 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001908 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001909 reason_str = PyObject_Str(uself->reason);
1910 if (reason_str == NULL)
1911 goto done;
1912 encoding_str = PyObject_Str(uself->encoding);
1913 if (encoding_str == NULL)
1914 goto done;
1915
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001916 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1917 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001918 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001919 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001920 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001921 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001922 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001923 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001924 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001925 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001926 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001927 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001928 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001929 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001930 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931 }
Eric Smith0facd772010-02-24 15:42:29 +00001932 else {
1933 result = PyUnicode_FromFormat(
1934 "'%U' codec can't encode characters in position %zd-%zd: %U",
1935 encoding_str,
1936 uself->start,
1937 uself->end-1,
1938 reason_str);
1939 }
1940done:
1941 Py_XDECREF(reason_str);
1942 Py_XDECREF(encoding_str);
1943 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944}
1945
1946static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001947 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001948 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001949 sizeof(PyUnicodeErrorObject), 0,
1950 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1951 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1952 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001953 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1954 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001955 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001956 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957};
1958PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1959
1960PyObject *
1961PyUnicodeEncodeError_Create(
1962 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1963 Py_ssize_t start, Py_ssize_t end, const char *reason)
1964{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001965 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001966 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001967}
1968
1969
1970/*
1971 * UnicodeDecodeError extends UnicodeError
1972 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973
1974static int
1975UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1976{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001977 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001978
Thomas Wouters477c8d52006-05-27 19:21:47 +00001979 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1980 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001981
1982 ude = (PyUnicodeErrorObject *)self;
1983
1984 Py_CLEAR(ude->encoding);
1985 Py_CLEAR(ude->object);
1986 Py_CLEAR(ude->reason);
1987
1988 if (!PyArg_ParseTuple(args, "O!OnnO!",
1989 &PyUnicode_Type, &ude->encoding,
1990 &ude->object,
1991 &ude->start,
1992 &ude->end,
1993 &PyUnicode_Type, &ude->reason)) {
1994 ude->encoding = ude->object = ude->reason = NULL;
1995 return -1;
1996 }
1997
Guido van Rossum98297ee2007-11-06 21:34:58 +00001998 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001999 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002000 Py_INCREF(ude->reason);
2001
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002002 if (!PyBytes_Check(ude->object)) {
2003 Py_buffer view;
2004 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2005 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002006 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002007 PyBuffer_Release(&view);
2008 if (!ude->object)
2009 goto error;
2010 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002011 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002012
2013error:
2014 Py_CLEAR(ude->encoding);
2015 Py_CLEAR(ude->object);
2016 Py_CLEAR(ude->reason);
2017 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002018}
2019
2020static PyObject *
2021UnicodeDecodeError_str(PyObject *self)
2022{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002023 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002024 PyObject *result = NULL;
2025 PyObject *reason_str = NULL;
2026 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002027
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002028 if (!uself->object)
2029 /* Not properly initialized. */
2030 return PyUnicode_FromString("");
2031
Eric Smith0facd772010-02-24 15:42:29 +00002032 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002033 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002034 reason_str = PyObject_Str(uself->reason);
2035 if (reason_str == NULL)
2036 goto done;
2037 encoding_str = PyObject_Str(uself->encoding);
2038 if (encoding_str == NULL)
2039 goto done;
2040
2041 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002042 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002043 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002044 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002045 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002046 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002047 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002048 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002049 }
Eric Smith0facd772010-02-24 15:42:29 +00002050 else {
2051 result = PyUnicode_FromFormat(
2052 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2053 encoding_str,
2054 uself->start,
2055 uself->end-1,
2056 reason_str
2057 );
2058 }
2059done:
2060 Py_XDECREF(reason_str);
2061 Py_XDECREF(encoding_str);
2062 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002063}
2064
2065static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002066 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002067 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068 sizeof(PyUnicodeErrorObject), 0,
2069 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2070 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2071 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002072 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2073 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002075 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002076};
2077PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2078
2079PyObject *
2080PyUnicodeDecodeError_Create(
2081 const char *encoding, const char *object, Py_ssize_t length,
2082 Py_ssize_t start, Py_ssize_t end, const char *reason)
2083{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002084 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002085 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002086}
2087
2088
2089/*
2090 * UnicodeTranslateError extends UnicodeError
2091 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002092
2093static int
2094UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2095 PyObject *kwds)
2096{
2097 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2098 return -1;
2099
2100 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101 Py_CLEAR(self->reason);
2102
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002103 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002105 &self->start,
2106 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00002107 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002108 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002109 return -1;
2110 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002111
Thomas Wouters477c8d52006-05-27 19:21:47 +00002112 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002113 Py_INCREF(self->reason);
2114
2115 return 0;
2116}
2117
2118
2119static PyObject *
2120UnicodeTranslateError_str(PyObject *self)
2121{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002122 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002123 PyObject *result = NULL;
2124 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002125
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002126 if (!uself->object)
2127 /* Not properly initialized. */
2128 return PyUnicode_FromString("");
2129
Eric Smith0facd772010-02-24 15:42:29 +00002130 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002131 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002132 reason_str = PyObject_Str(uself->reason);
2133 if (reason_str == NULL)
2134 goto done;
2135
Victor Stinner53b33e72011-11-21 01:17:27 +01002136 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2137 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002138 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002139 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002140 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002141 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002142 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002143 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002144 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002145 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002146 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002147 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002148 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002149 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002150 );
Eric Smith0facd772010-02-24 15:42:29 +00002151 } else {
2152 result = PyUnicode_FromFormat(
2153 "can't translate characters in position %zd-%zd: %U",
2154 uself->start,
2155 uself->end-1,
2156 reason_str
2157 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002158 }
Eric Smith0facd772010-02-24 15:42:29 +00002159done:
2160 Py_XDECREF(reason_str);
2161 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162}
2163
2164static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002165 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002166 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002167 sizeof(PyUnicodeErrorObject), 0,
2168 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2169 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2170 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002172 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2173 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002174 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002175};
2176PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2177
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002178/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002179PyObject *
2180PyUnicodeTranslateError_Create(
2181 const Py_UNICODE *object, Py_ssize_t length,
2182 Py_ssize_t start, Py_ssize_t end, const char *reason)
2183{
2184 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002185 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002186}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002187
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002188PyObject *
2189_PyUnicodeTranslateError_Create(
2190 PyObject *object,
2191 Py_ssize_t start, Py_ssize_t end, const char *reason)
2192{
Victor Stinner69598d4c2014-04-04 20:59:44 +02002193 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002194 object, start, end, reason);
2195}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196
2197/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002198 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002199 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002200SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002201 "Assertion failed.");
2202
2203
2204/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002205 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002206 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002207SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002208 "Base class for arithmetic errors.");
2209
2210
2211/*
2212 * FloatingPointError extends ArithmeticError
2213 */
2214SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2215 "Floating point operation failed.");
2216
2217
2218/*
2219 * OverflowError extends ArithmeticError
2220 */
2221SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2222 "Result too large to be represented.");
2223
2224
2225/*
2226 * ZeroDivisionError extends ArithmeticError
2227 */
2228SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2229 "Second argument to a division or modulo operation was zero.");
2230
2231
2232/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002233 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002234 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002235SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002236 "Internal error in the Python interpreter.\n"
2237 "\n"
2238 "Please report this to the Python maintainer, along with the traceback,\n"
2239 "the Python version, and the hardware/OS platform and version.");
2240
2241
2242/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002243 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002244 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002245SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002246 "Weak ref proxy used after referent went away.");
2247
2248
2249/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002250 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002251 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002252
2253#define MEMERRORS_SAVE 16
2254static PyBaseExceptionObject *memerrors_freelist = NULL;
2255static int memerrors_numfree = 0;
2256
2257static PyObject *
2258MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2259{
2260 PyBaseExceptionObject *self;
2261
2262 if (type != (PyTypeObject *) PyExc_MemoryError)
2263 return BaseException_new(type, args, kwds);
2264 if (memerrors_freelist == NULL)
2265 return BaseException_new(type, args, kwds);
2266 /* Fetch object from freelist and revive it */
2267 self = memerrors_freelist;
2268 self->args = PyTuple_New(0);
2269 /* This shouldn't happen since the empty tuple is persistent */
2270 if (self->args == NULL)
2271 return NULL;
2272 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2273 memerrors_numfree--;
2274 self->dict = NULL;
2275 _Py_NewReference((PyObject *)self);
2276 _PyObject_GC_TRACK(self);
2277 return (PyObject *)self;
2278}
2279
2280static void
2281MemoryError_dealloc(PyBaseExceptionObject *self)
2282{
2283 _PyObject_GC_UNTRACK(self);
2284 BaseException_clear(self);
2285 if (memerrors_numfree >= MEMERRORS_SAVE)
2286 Py_TYPE(self)->tp_free((PyObject *)self);
2287 else {
2288 self->dict = (PyObject *) memerrors_freelist;
2289 memerrors_freelist = self;
2290 memerrors_numfree++;
2291 }
2292}
2293
2294static void
2295preallocate_memerrors(void)
2296{
2297 /* We create enough MemoryErrors and then decref them, which will fill
2298 up the freelist. */
2299 int i;
2300 PyObject *errors[MEMERRORS_SAVE];
2301 for (i = 0; i < MEMERRORS_SAVE; i++) {
2302 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2303 NULL, NULL);
2304 if (!errors[i])
2305 Py_FatalError("Could not preallocate MemoryError object");
2306 }
2307 for (i = 0; i < MEMERRORS_SAVE; i++) {
2308 Py_DECREF(errors[i]);
2309 }
2310}
2311
2312static void
2313free_preallocated_memerrors(void)
2314{
2315 while (memerrors_freelist != NULL) {
2316 PyObject *self = (PyObject *) memerrors_freelist;
2317 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2318 Py_TYPE(self)->tp_free((PyObject *)self);
2319 }
2320}
2321
2322
2323static PyTypeObject _PyExc_MemoryError = {
2324 PyVarObject_HEAD_INIT(NULL, 0)
2325 "MemoryError",
2326 sizeof(PyBaseExceptionObject),
2327 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2328 0, 0, 0, 0, 0, 0, 0,
2329 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2330 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2331 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2332 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2333 (initproc)BaseException_init, 0, MemoryError_new
2334};
2335PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2336
Thomas Wouters477c8d52006-05-27 19:21:47 +00002337
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002338/*
2339 * BufferError extends Exception
2340 */
2341SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2342
Thomas Wouters477c8d52006-05-27 19:21:47 +00002343
2344/* Warning category docstrings */
2345
2346/*
2347 * Warning extends Exception
2348 */
2349SimpleExtendsException(PyExc_Exception, Warning,
2350 "Base class for warning categories.");
2351
2352
2353/*
2354 * UserWarning extends Warning
2355 */
2356SimpleExtendsException(PyExc_Warning, UserWarning,
2357 "Base class for warnings generated by user code.");
2358
2359
2360/*
2361 * DeprecationWarning extends Warning
2362 */
2363SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2364 "Base class for warnings about deprecated features.");
2365
2366
2367/*
2368 * PendingDeprecationWarning extends Warning
2369 */
2370SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2371 "Base class for warnings about features which will be deprecated\n"
2372 "in the future.");
2373
2374
2375/*
2376 * SyntaxWarning extends Warning
2377 */
2378SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2379 "Base class for warnings about dubious syntax.");
2380
2381
2382/*
2383 * RuntimeWarning extends Warning
2384 */
2385SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2386 "Base class for warnings about dubious runtime behavior.");
2387
2388
2389/*
2390 * FutureWarning extends Warning
2391 */
2392SimpleExtendsException(PyExc_Warning, FutureWarning,
2393 "Base class for warnings about constructs that will change semantically\n"
2394 "in the future.");
2395
2396
2397/*
2398 * ImportWarning extends Warning
2399 */
2400SimpleExtendsException(PyExc_Warning, ImportWarning,
2401 "Base class for warnings about probable mistakes in module imports");
2402
2403
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002404/*
2405 * UnicodeWarning extends Warning
2406 */
2407SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2408 "Base class for warnings about Unicode related problems, mostly\n"
2409 "related to conversion problems.");
2410
Georg Brandl08be72d2010-10-24 15:11:22 +00002411
Guido van Rossum98297ee2007-11-06 21:34:58 +00002412/*
2413 * BytesWarning extends Warning
2414 */
2415SimpleExtendsException(PyExc_Warning, BytesWarning,
2416 "Base class for warnings about bytes and buffer related problems, mostly\n"
2417 "related to conversion from str or comparing to str.");
2418
2419
Georg Brandl08be72d2010-10-24 15:11:22 +00002420/*
2421 * ResourceWarning extends Warning
2422 */
2423SimpleExtendsException(PyExc_Warning, ResourceWarning,
2424 "Base class for warnings about resource usage.");
2425
2426
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002427
Yury Selivanovf488fb42015-07-03 01:04:23 -04002428/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002429 Meant to be used when normalizing the exception for exceeding the recursion
2430 depth will cause its own infinite recursion.
2431*/
2432PyObject *PyExc_RecursionErrorInst = NULL;
2433
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002434#define PRE_INIT(TYPE) \
2435 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2436 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2437 Py_FatalError("exceptions bootstrapping error."); \
2438 Py_INCREF(PyExc_ ## TYPE); \
2439 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002440
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002441#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002442 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2443 Py_FatalError("Module dictionary insertion problem.");
2444
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002445#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002446 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002447 PyExc_ ## NAME = PyExc_ ## TYPE; \
2448 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2449 Py_FatalError("Module dictionary insertion problem.");
2450
2451#define ADD_ERRNO(TYPE, CODE) { \
2452 PyObject *_code = PyLong_FromLong(CODE); \
2453 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2454 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2455 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002456 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002457 }
2458
2459#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002460#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002461/* The following constants were added to errno.h in VS2010 but have
2462 preferred WSA equivalents. */
2463#undef EADDRINUSE
2464#undef EADDRNOTAVAIL
2465#undef EAFNOSUPPORT
2466#undef EALREADY
2467#undef ECONNABORTED
2468#undef ECONNREFUSED
2469#undef ECONNRESET
2470#undef EDESTADDRREQ
2471#undef EHOSTUNREACH
2472#undef EINPROGRESS
2473#undef EISCONN
2474#undef ELOOP
2475#undef EMSGSIZE
2476#undef ENETDOWN
2477#undef ENETRESET
2478#undef ENETUNREACH
2479#undef ENOBUFS
2480#undef ENOPROTOOPT
2481#undef ENOTCONN
2482#undef ENOTSOCK
2483#undef EOPNOTSUPP
2484#undef EPROTONOSUPPORT
2485#undef EPROTOTYPE
2486#undef ETIMEDOUT
2487#undef EWOULDBLOCK
2488
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002489#if defined(WSAEALREADY) && !defined(EALREADY)
2490#define EALREADY WSAEALREADY
2491#endif
2492#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2493#define ECONNABORTED WSAECONNABORTED
2494#endif
2495#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2496#define ECONNREFUSED WSAECONNREFUSED
2497#endif
2498#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2499#define ECONNRESET WSAECONNRESET
2500#endif
2501#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2502#define EINPROGRESS WSAEINPROGRESS
2503#endif
2504#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2505#define ESHUTDOWN WSAESHUTDOWN
2506#endif
2507#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2508#define ETIMEDOUT WSAETIMEDOUT
2509#endif
2510#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2511#define EWOULDBLOCK WSAEWOULDBLOCK
2512#endif
2513#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002514
Martin v. Löwis1a214512008-06-11 05:26:20 +00002515void
Brett Cannonfd074152012-04-14 14:10:13 -04002516_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002517{
Brett Cannonfd074152012-04-14 14:10:13 -04002518 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002519
2520 PRE_INIT(BaseException)
2521 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002522 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002523 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002524 PRE_INIT(StopIteration)
2525 PRE_INIT(GeneratorExit)
2526 PRE_INIT(SystemExit)
2527 PRE_INIT(KeyboardInterrupt)
2528 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002529 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002530 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531 PRE_INIT(EOFError)
2532 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002533 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002534 PRE_INIT(NotImplementedError)
2535 PRE_INIT(NameError)
2536 PRE_INIT(UnboundLocalError)
2537 PRE_INIT(AttributeError)
2538 PRE_INIT(SyntaxError)
2539 PRE_INIT(IndentationError)
2540 PRE_INIT(TabError)
2541 PRE_INIT(LookupError)
2542 PRE_INIT(IndexError)
2543 PRE_INIT(KeyError)
2544 PRE_INIT(ValueError)
2545 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002546 PRE_INIT(UnicodeEncodeError)
2547 PRE_INIT(UnicodeDecodeError)
2548 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002549 PRE_INIT(AssertionError)
2550 PRE_INIT(ArithmeticError)
2551 PRE_INIT(FloatingPointError)
2552 PRE_INIT(OverflowError)
2553 PRE_INIT(ZeroDivisionError)
2554 PRE_INIT(SystemError)
2555 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002556 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002557 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002558 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002559 PRE_INIT(Warning)
2560 PRE_INIT(UserWarning)
2561 PRE_INIT(DeprecationWarning)
2562 PRE_INIT(PendingDeprecationWarning)
2563 PRE_INIT(SyntaxWarning)
2564 PRE_INIT(RuntimeWarning)
2565 PRE_INIT(FutureWarning)
2566 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002567 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002568 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002569 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002571 /* OSError subclasses */
2572 PRE_INIT(ConnectionError);
2573
2574 PRE_INIT(BlockingIOError);
2575 PRE_INIT(BrokenPipeError);
2576 PRE_INIT(ChildProcessError);
2577 PRE_INIT(ConnectionAbortedError);
2578 PRE_INIT(ConnectionRefusedError);
2579 PRE_INIT(ConnectionResetError);
2580 PRE_INIT(FileExistsError);
2581 PRE_INIT(FileNotFoundError);
2582 PRE_INIT(IsADirectoryError);
2583 PRE_INIT(NotADirectoryError);
2584 PRE_INIT(InterruptedError);
2585 PRE_INIT(PermissionError);
2586 PRE_INIT(ProcessLookupError);
2587 PRE_INIT(TimeoutError);
2588
Thomas Wouters477c8d52006-05-27 19:21:47 +00002589 bdict = PyModule_GetDict(bltinmod);
2590 if (bdict == NULL)
2591 Py_FatalError("exceptions bootstrapping error.");
2592
2593 POST_INIT(BaseException)
2594 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002596 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597 POST_INIT(StopIteration)
2598 POST_INIT(GeneratorExit)
2599 POST_INIT(SystemExit)
2600 POST_INIT(KeyboardInterrupt)
2601 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002602 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002603 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002604 INIT_ALIAS(EnvironmentError, OSError)
2605 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002606#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002607 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002608#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609 POST_INIT(EOFError)
2610 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002611 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612 POST_INIT(NotImplementedError)
2613 POST_INIT(NameError)
2614 POST_INIT(UnboundLocalError)
2615 POST_INIT(AttributeError)
2616 POST_INIT(SyntaxError)
2617 POST_INIT(IndentationError)
2618 POST_INIT(TabError)
2619 POST_INIT(LookupError)
2620 POST_INIT(IndexError)
2621 POST_INIT(KeyError)
2622 POST_INIT(ValueError)
2623 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002624 POST_INIT(UnicodeEncodeError)
2625 POST_INIT(UnicodeDecodeError)
2626 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002627 POST_INIT(AssertionError)
2628 POST_INIT(ArithmeticError)
2629 POST_INIT(FloatingPointError)
2630 POST_INIT(OverflowError)
2631 POST_INIT(ZeroDivisionError)
2632 POST_INIT(SystemError)
2633 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002634 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002635 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002636 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002637 POST_INIT(Warning)
2638 POST_INIT(UserWarning)
2639 POST_INIT(DeprecationWarning)
2640 POST_INIT(PendingDeprecationWarning)
2641 POST_INIT(SyntaxWarning)
2642 POST_INIT(RuntimeWarning)
2643 POST_INIT(FutureWarning)
2644 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002645 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002646 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002647 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002648
Antoine Pitrouac456a12012-01-18 21:35:21 +01002649 if (!errnomap) {
2650 errnomap = PyDict_New();
2651 if (!errnomap)
2652 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2653 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002654
2655 /* OSError subclasses */
2656 POST_INIT(ConnectionError);
2657
2658 POST_INIT(BlockingIOError);
2659 ADD_ERRNO(BlockingIOError, EAGAIN);
2660 ADD_ERRNO(BlockingIOError, EALREADY);
2661 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2662 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2663 POST_INIT(BrokenPipeError);
2664 ADD_ERRNO(BrokenPipeError, EPIPE);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002665#ifdef ESHUTDOWN
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002666 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002667#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002668 POST_INIT(ChildProcessError);
2669 ADD_ERRNO(ChildProcessError, ECHILD);
2670 POST_INIT(ConnectionAbortedError);
2671 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2672 POST_INIT(ConnectionRefusedError);
2673 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2674 POST_INIT(ConnectionResetError);
2675 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2676 POST_INIT(FileExistsError);
2677 ADD_ERRNO(FileExistsError, EEXIST);
2678 POST_INIT(FileNotFoundError);
2679 ADD_ERRNO(FileNotFoundError, ENOENT);
2680 POST_INIT(IsADirectoryError);
2681 ADD_ERRNO(IsADirectoryError, EISDIR);
2682 POST_INIT(NotADirectoryError);
2683 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2684 POST_INIT(InterruptedError);
2685 ADD_ERRNO(InterruptedError, EINTR);
2686 POST_INIT(PermissionError);
2687 ADD_ERRNO(PermissionError, EACCES);
2688 ADD_ERRNO(PermissionError, EPERM);
2689 POST_INIT(ProcessLookupError);
2690 ADD_ERRNO(ProcessLookupError, ESRCH);
2691 POST_INIT(TimeoutError);
2692 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2693
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002694 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002695
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002696 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002697 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002698 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002699 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002700 "recursion errors");
2701 else {
2702 PyBaseExceptionObject *err_inst =
2703 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2704 PyObject *args_tuple;
2705 PyObject *exc_message;
2706 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2707 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002708 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002709 "pre-allocation");
2710 args_tuple = PyTuple_Pack(1, exc_message);
2711 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002712 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002713 "pre-allocation");
2714 Py_DECREF(exc_message);
2715 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002716 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002717 Py_DECREF(args_tuple);
2718 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002719 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002720}
2721
2722void
2723_PyExc_Fini(void)
2724{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002725 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002726 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002727 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002728}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002729
2730/* Helper to do the equivalent of "raise X from Y" in C, but always using
2731 * the current exception rather than passing one in.
2732 *
2733 * We currently limit this to *only* exceptions that use the BaseException
2734 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2735 * those correctly without losing data and without losing backwards
2736 * compatibility.
2737 *
2738 * We also aim to rule out *all* exceptions that might be storing additional
2739 * state, whether by having a size difference relative to BaseException,
2740 * additional arguments passed in during construction or by having a
2741 * non-empty instance dict.
2742 *
2743 * We need to be very careful with what we wrap, since changing types to
2744 * a broader exception type would be backwards incompatible for
2745 * existing codecs, and with different init or new method implementations
2746 * may either not support instantiation with PyErr_Format or lose
2747 * information when instantiated that way.
2748 *
2749 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2750 * fact that exceptions are expected to support pickling. If more builtin
2751 * exceptions (e.g. AttributeError) start to be converted to rich
2752 * exceptions with additional attributes, that's probably a better approach
2753 * to pursue over adding special cases for particular stateful subclasses.
2754 *
2755 * Returns a borrowed reference to the new exception (if any), NULL if the
2756 * existing exception was left in place.
2757 */
2758PyObject *
2759_PyErr_TrySetFromCause(const char *format, ...)
2760{
2761 PyObject* msg_prefix;
2762 PyObject *exc, *val, *tb;
2763 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002764 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002765 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002766 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002767 PyObject *new_exc, *new_val, *new_tb;
2768 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002769 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002770
Nick Coghlan8b097b42013-11-13 23:49:21 +10002771 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002772 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002773 /* Ensure type info indicates no extra state is stored at the C level
2774 * and that the type can be reinstantiated using PyErr_Format
2775 */
2776 caught_type_size = caught_type->tp_basicsize;
2777 base_exc_size = _PyExc_BaseException.tp_basicsize;
2778 same_basic_size = (
2779 caught_type_size == base_exc_size ||
2780 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002781 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002782 )
2783 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002784 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002785 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002786 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002787 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002788 /* We can't be sure we can wrap this safely, since it may contain
2789 * more state than just the exception type. Accordingly, we just
2790 * leave it alone.
2791 */
2792 PyErr_Restore(exc, val, tb);
2793 return NULL;
2794 }
2795
2796 /* Check the args are empty or contain a single string */
2797 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002798 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002799 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002800 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002801 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002802 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002803 /* More than 1 arg, or the one arg we do have isn't a string
2804 */
2805 PyErr_Restore(exc, val, tb);
2806 return NULL;
2807 }
2808
2809 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002810 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002811 if (dictptr != NULL && *dictptr != NULL &&
2812 PyObject_Length(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002813 /* While we could potentially copy a non-empty instance dictionary
2814 * to the replacement exception, for now we take the more
2815 * conservative path of leaving exceptions with attributes set
2816 * alone.
2817 */
2818 PyErr_Restore(exc, val, tb);
2819 return NULL;
2820 }
2821
2822 /* For exceptions that we can wrap safely, we chain the original
2823 * exception to a new one of the exact same type with an
2824 * error message that mentions the additional details and the
2825 * original exception.
2826 *
2827 * It would be nice to wrap OSError and various other exception
2828 * types as well, but that's quite a bit trickier due to the extra
2829 * state potentially stored on OSError instances.
2830 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002831 /* Ensure the traceback is set correctly on the existing exception */
2832 if (tb != NULL) {
2833 PyException_SetTraceback(val, tb);
2834 Py_DECREF(tb);
2835 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002836
Christian Heimes507eabd2013-11-14 01:39:35 +01002837#ifdef HAVE_STDARG_PROTOTYPES
2838 va_start(vargs, format);
2839#else
2840 va_start(vargs);
2841#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002842 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002843 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002844 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002845 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002846 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002847 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002848 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002849
2850 PyErr_Format(exc, "%U (%s: %S)",
2851 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002852 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002853 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002854 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2855 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2856 PyException_SetCause(new_val, val);
2857 PyErr_Restore(new_exc, new_val, new_tb);
2858 return new_val;
2859}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002860
2861
2862/* To help with migration from Python 2, SyntaxError.__init__ applies some
2863 * heuristics to try to report a more meaningful exception when print and
2864 * exec are used like statements.
2865 *
2866 * The heuristics are currently expected to detect the following cases:
2867 * - top level statement
2868 * - statement in a nested suite
2869 * - trailing section of a one line complex statement
2870 *
2871 * They're currently known not to trigger:
2872 * - after a semi-colon
2873 *
2874 * The error message can be a bit odd in cases where the "arguments" are
2875 * completely illegal syntactically, but that isn't worth the hassle of
2876 * fixing.
2877 *
2878 * We also can't do anything about cases that are legal Python 3 syntax
2879 * but mean something entirely different from what they did in Python 2
2880 * (omitting the arguments entirely, printing items preceded by a unary plus
2881 * or minus, using the stream redirection syntax).
2882 */
2883
2884static int
2885_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2886{
2887 /* Return values:
2888 * -1: an error occurred
2889 * 0: nothing happened
2890 * 1: the check triggered & the error message was changed
2891 */
2892 static PyObject *print_prefix = NULL;
2893 static PyObject *exec_prefix = NULL;
2894 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2895 int kind = PyUnicode_KIND(self->text);
2896 void *data = PyUnicode_DATA(self->text);
2897
2898 /* Ignore leading whitespace */
2899 while (start < text_len) {
2900 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2901 if (!Py_UNICODE_ISSPACE(ch))
2902 break;
2903 start++;
2904 }
2905 /* Checking against an empty or whitespace-only part of the string */
2906 if (start == text_len) {
2907 return 0;
2908 }
2909
2910 /* Check for legacy print statements */
2911 if (print_prefix == NULL) {
2912 print_prefix = PyUnicode_InternFromString("print ");
2913 if (print_prefix == NULL) {
2914 return -1;
2915 }
2916 }
2917 if (PyUnicode_Tailmatch(self->text, print_prefix,
2918 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002919 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002920 PyUnicode_FromString("Missing parentheses in call to 'print'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002921 return 1;
2922 }
2923
2924 /* Check for legacy exec statements */
2925 if (exec_prefix == NULL) {
2926 exec_prefix = PyUnicode_InternFromString("exec ");
2927 if (exec_prefix == NULL) {
2928 return -1;
2929 }
2930 }
2931 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2932 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002933 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002934 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002935 return 1;
2936 }
2937 /* Fall back to the default error message */
2938 return 0;
2939}
2940
2941static int
2942_report_missing_parentheses(PySyntaxErrorObject *self)
2943{
2944 Py_UCS4 left_paren = 40;
2945 Py_ssize_t left_paren_index;
2946 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2947 int legacy_check_result = 0;
2948
2949 /* Skip entirely if there is an opening parenthesis */
2950 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2951 0, text_len, 1);
2952 if (left_paren_index < -1) {
2953 return -1;
2954 }
2955 if (left_paren_index != -1) {
2956 /* Use default error message for any line with an opening paren */
2957 return 0;
2958 }
2959 /* Handle the simple statement case */
2960 legacy_check_result = _check_for_legacy_statements(self, 0);
2961 if (legacy_check_result < 0) {
2962 return -1;
2963
2964 }
2965 if (legacy_check_result == 0) {
2966 /* Handle the one-line complex statement case */
2967 Py_UCS4 colon = 58;
2968 Py_ssize_t colon_index;
2969 colon_index = PyUnicode_FindChar(self->text, colon,
2970 0, text_len, 1);
2971 if (colon_index < -1) {
2972 return -1;
2973 }
2974 if (colon_index >= 0 && colon_index < text_len) {
2975 /* Check again, starting from just after the colon */
2976 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2977 return -1;
2978 }
2979 }
2980 }
2981 return 0;
2982}