blob: 57a786c0220458c4125849cfe037e6acd0fd3b75 [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
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300634 Py_XINCREF(name);
635 Py_XSETREF(self->name, name);
636
637 Py_XINCREF(path);
638 Py_XSETREF(self->path, path);
639
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300640 if (PyTuple_GET_SIZE(args) == 1) {
641 msg = PyTuple_GET_ITEM(args, 0);
642 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300643 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300644 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400645
646 return 0;
647}
648
649static int
650ImportError_clear(PyImportErrorObject *self)
651{
652 Py_CLEAR(self->msg);
653 Py_CLEAR(self->name);
654 Py_CLEAR(self->path);
655 return BaseException_clear((PyBaseExceptionObject *)self);
656}
657
658static void
659ImportError_dealloc(PyImportErrorObject *self)
660{
661 _PyObject_GC_UNTRACK(self);
662 ImportError_clear(self);
663 Py_TYPE(self)->tp_free((PyObject *)self);
664}
665
666static int
667ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
668{
669 Py_VISIT(self->msg);
670 Py_VISIT(self->name);
671 Py_VISIT(self->path);
672 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
673}
674
675static PyObject *
676ImportError_str(PyImportErrorObject *self)
677{
Brett Cannon07c6e712012-08-24 13:05:09 -0400678 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400679 Py_INCREF(self->msg);
680 return self->msg;
681 }
682 else {
683 return BaseException_str((PyBaseExceptionObject *)self);
684 }
685}
686
687static PyMemberDef ImportError_members[] = {
688 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
689 PyDoc_STR("exception message")},
690 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
691 PyDoc_STR("module name")},
692 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
693 PyDoc_STR("module path")},
694 {NULL} /* Sentinel */
695};
696
697static PyMethodDef ImportError_methods[] = {
698 {NULL}
699};
700
701ComplexExtendsException(PyExc_Exception, ImportError,
702 ImportError, 0 /* new */,
703 ImportError_methods, ImportError_members,
704 0 /* getset */, ImportError_str,
705 "Import can't find module, or can't find name in "
706 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000707
708/*
Eric Snowc9432652016-09-07 15:42:32 -0700709 * ModuleNotFoundError extends ImportError
710 */
711
712MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
713 "Module not found.");
714
715/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200716 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000717 */
718
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200719#ifdef MS_WINDOWS
720#include "errmap.h"
721#endif
722
Thomas Wouters477c8d52006-05-27 19:21:47 +0000723/* Where a function has a single filename, such as open() or some
724 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
725 * called, giving a third argument which is the filename. But, so
726 * that old code using in-place unpacking doesn't break, e.g.:
727 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200728 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000729 *
730 * we hack args so that it only contains two items. This also
731 * means we need our own __str__() which prints out the filename
732 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800733 *
734 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800735 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
736 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000737 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200738
Antoine Pitroue0e27352011-12-15 14:31:28 +0100739/* This function doesn't cleanup on error, the caller should */
740static int
741oserror_parse_args(PyObject **p_args,
742 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800743 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200744#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100745 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200746#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100747 )
748{
749 Py_ssize_t nargs;
750 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800751#ifndef MS_WINDOWS
752 /*
753 * ignored on non-Windows platforms,
754 * but parsed so OSError has a consistent signature
755 */
756 PyObject *_winerror = NULL;
757 PyObject **winerror = &_winerror;
758#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200760 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000761
Larry Hastingsb0827312014-02-09 22:05:19 -0800762 if (nargs >= 2 && nargs <= 5) {
763 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
764 myerrno, strerror,
765 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100766 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800767#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100768 if (*winerror && PyLong_Check(*winerror)) {
769 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200770 PyObject *newargs;
771 Py_ssize_t i;
772
Antoine Pitroue0e27352011-12-15 14:31:28 +0100773 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200774 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100775 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200776 /* Set errno to the corresponding POSIX errno (overriding
777 first argument). Windows Socket error codes (>= 10000)
778 have the same value as their POSIX counterparts.
779 */
780 if (winerrcode < 10000)
781 errcode = winerror_to_errno(winerrcode);
782 else
783 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100784 *myerrno = PyLong_FromLong(errcode);
785 if (!*myerrno)
786 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200787 newargs = PyTuple_New(nargs);
788 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100789 return -1;
790 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200791 for (i = 1; i < nargs; i++) {
792 PyObject *val = PyTuple_GET_ITEM(args, i);
793 Py_INCREF(val);
794 PyTuple_SET_ITEM(newargs, i, val);
795 }
796 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100797 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200798 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800799#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200800 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000801
Antoine Pitroue0e27352011-12-15 14:31:28 +0100802 return 0;
803}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000804
Antoine Pitroue0e27352011-12-15 14:31:28 +0100805static int
806oserror_init(PyOSErrorObject *self, PyObject **p_args,
807 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800808 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100809#ifdef MS_WINDOWS
810 , PyObject *winerror
811#endif
812 )
813{
814 PyObject *args = *p_args;
815 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000816
817 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100819 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 PyNumber_Check(filename)) {
821 /* BlockingIOError's 3rd argument can be the number of
822 * characters written.
823 */
824 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
825 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100826 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200827 }
828 else {
829 Py_INCREF(filename);
830 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000831
Larry Hastingsb0827312014-02-09 22:05:19 -0800832 if (filename2 && filename2 != Py_None) {
833 Py_INCREF(filename2);
834 self->filename2 = filename2;
835 }
836
837 if (nargs >= 2 && nargs <= 5) {
838 /* filename, filename2, and winerror are removed from the args tuple
839 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100840 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200841 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100842 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000843
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200844 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100845 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200846 }
847 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000848 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200849 Py_XINCREF(myerrno);
850 self->myerrno = myerrno;
851
852 Py_XINCREF(strerror);
853 self->strerror = strerror;
854
855#ifdef MS_WINDOWS
856 Py_XINCREF(winerror);
857 self->winerror = winerror;
858#endif
859
Antoine Pitroue0e27352011-12-15 14:31:28 +0100860 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300861 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100862 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100863
864 return 0;
865}
866
867static PyObject *
868OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
869static int
870OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
871
872static int
873oserror_use_init(PyTypeObject *type)
874{
Martin Panter7462b6492015-11-02 03:37:02 +0000875 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100876 extraneous argument to __new__ to be ignored. The only reasonable
877 solution, given __new__ takes a variable number of arguments,
878 is to defer arg parsing and initialization to __init__.
879
Martin Pantere26da7c2016-06-02 10:07:09 +0000880 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100881 with the right arguments.
882
883 (see http://bugs.python.org/issue12555#msg148829 )
884 */
885 if (type->tp_init != (initproc) OSError_init &&
886 type->tp_new == (newfunc) OSError_new) {
887 assert((PyObject *) type != PyExc_OSError);
888 return 1;
889 }
890 return 0;
891}
892
893static PyObject *
894OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
895{
896 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800897 PyObject *myerrno = NULL, *strerror = NULL;
898 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100899#ifdef MS_WINDOWS
900 PyObject *winerror = NULL;
901#endif
902
Victor Stinner46ef3192013-11-14 22:31:41 +0100903 Py_INCREF(args);
904
Antoine Pitroue0e27352011-12-15 14:31:28 +0100905 if (!oserror_use_init(type)) {
906 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100907 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100908
Larry Hastingsb0827312014-02-09 22:05:19 -0800909 if (oserror_parse_args(&args, &myerrno, &strerror,
910 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100911#ifdef MS_WINDOWS
912 , &winerror
913#endif
914 ))
915 goto error;
916
917 if (myerrno && PyLong_Check(myerrno) &&
918 errnomap && (PyObject *) type == PyExc_OSError) {
919 PyObject *newtype;
920 newtype = PyDict_GetItem(errnomap, myerrno);
921 if (newtype) {
922 assert(PyType_Check(newtype));
923 type = (PyTypeObject *) newtype;
924 }
925 else if (PyErr_Occurred())
926 goto error;
927 }
928 }
929
930 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
931 if (!self)
932 goto error;
933
934 self->dict = NULL;
935 self->traceback = self->cause = self->context = NULL;
936 self->written = -1;
937
938 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800939 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100940#ifdef MS_WINDOWS
941 , winerror
942#endif
943 ))
944 goto error;
945 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200946 else {
947 self->args = PyTuple_New(0);
948 if (self->args == NULL)
949 goto error;
950 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100951
Victor Stinner46ef3192013-11-14 22:31:41 +0100952 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200953 return (PyObject *) self;
954
955error:
956 Py_XDECREF(args);
957 Py_XDECREF(self);
958 return NULL;
959}
960
961static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100962OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200963{
Larry Hastingsb0827312014-02-09 22:05:19 -0800964 PyObject *myerrno = NULL, *strerror = NULL;
965 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100966#ifdef MS_WINDOWS
967 PyObject *winerror = NULL;
968#endif
969
970 if (!oserror_use_init(Py_TYPE(self)))
971 /* Everything already done in OSError_new */
972 return 0;
973
974 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
975 return -1;
976
977 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -0800978 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100979#ifdef MS_WINDOWS
980 , &winerror
981#endif
982 ))
983 goto error;
984
Larry Hastingsb0827312014-02-09 22:05:19 -0800985 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100986#ifdef MS_WINDOWS
987 , winerror
988#endif
989 ))
990 goto error;
991
Thomas Wouters477c8d52006-05-27 19:21:47 +0000992 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100993
994error:
Serhiy Storchaka37665722016-08-20 21:22:03 +0300995 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100996 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000997}
998
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000999static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001000OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001001{
1002 Py_CLEAR(self->myerrno);
1003 Py_CLEAR(self->strerror);
1004 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001005 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001006#ifdef MS_WINDOWS
1007 Py_CLEAR(self->winerror);
1008#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001009 return BaseException_clear((PyBaseExceptionObject *)self);
1010}
1011
1012static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001013OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001014{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001015 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001016 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001017 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001018}
1019
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001020static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001021OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001022 void *arg)
1023{
1024 Py_VISIT(self->myerrno);
1025 Py_VISIT(self->strerror);
1026 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001027 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001028#ifdef MS_WINDOWS
1029 Py_VISIT(self->winerror);
1030#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001031 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1032}
1033
1034static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001035OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001036{
Larry Hastingsb0827312014-02-09 22:05:19 -08001037#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001038#ifdef MS_WINDOWS
1039 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001040 if (self->winerror && self->filename) {
1041 if (self->filename2) {
1042 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1043 OR_NONE(self->winerror),
1044 OR_NONE(self->strerror),
1045 self->filename,
1046 self->filename2);
1047 } else {
1048 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1049 OR_NONE(self->winerror),
1050 OR_NONE(self->strerror),
1051 self->filename);
1052 }
1053 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001055 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056 self->winerror ? self->winerror: Py_None,
1057 self->strerror ? self->strerror: Py_None);
1058#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001059 if (self->filename) {
1060 if (self->filename2) {
1061 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1062 OR_NONE(self->myerrno),
1063 OR_NONE(self->strerror),
1064 self->filename,
1065 self->filename2);
1066 } else {
1067 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1068 OR_NONE(self->myerrno),
1069 OR_NONE(self->strerror),
1070 self->filename);
1071 }
1072 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001073 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001074 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001075 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001076 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077}
1078
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081{
1082 PyObject *args = self->args;
1083 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001084
Thomas Wouters477c8d52006-05-27 19:21:47 +00001085 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001086 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001087 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001088 Py_ssize_t size = self->filename2 ? 5 : 3;
1089 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001090 if (!args)
1091 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001092
1093 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001094 Py_INCREF(tmp);
1095 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001096
1097 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001098 Py_INCREF(tmp);
1099 PyTuple_SET_ITEM(args, 1, tmp);
1100
1101 Py_INCREF(self->filename);
1102 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001103
1104 if (self->filename2) {
1105 /*
1106 * This tuple is essentially used as OSError(*args).
1107 * So, to recreate filename2, we need to pass in
1108 * winerror as well.
1109 */
1110 Py_INCREF(Py_None);
1111 PyTuple_SET_ITEM(args, 3, Py_None);
1112
1113 /* filename2 */
1114 Py_INCREF(self->filename2);
1115 PyTuple_SET_ITEM(args, 4, self->filename2);
1116 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001117 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001118 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001119
1120 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001121 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001122 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001123 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001124 Py_DECREF(args);
1125 return res;
1126}
1127
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001128static PyObject *
1129OSError_written_get(PyOSErrorObject *self, void *context)
1130{
1131 if (self->written == -1) {
1132 PyErr_SetString(PyExc_AttributeError, "characters_written");
1133 return NULL;
1134 }
1135 return PyLong_FromSsize_t(self->written);
1136}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001137
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001138static int
1139OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1140{
1141 Py_ssize_t n;
1142 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1143 if (n == -1 && PyErr_Occurred())
1144 return -1;
1145 self->written = n;
1146 return 0;
1147}
1148
1149static PyMemberDef OSError_members[] = {
1150 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1151 PyDoc_STR("POSIX exception code")},
1152 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1153 PyDoc_STR("exception strerror")},
1154 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1155 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001156 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1157 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001158#ifdef MS_WINDOWS
1159 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1160 PyDoc_STR("Win32 exception code")},
1161#endif
1162 {NULL} /* Sentinel */
1163};
1164
1165static PyMethodDef OSError_methods[] = {
1166 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001167 {NULL}
1168};
1169
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001170static PyGetSetDef OSError_getset[] = {
1171 {"characters_written", (getter) OSError_written_get,
1172 (setter) OSError_written_set, NULL},
1173 {NULL}
1174};
1175
1176
1177ComplexExtendsException(PyExc_Exception, OSError,
1178 OSError, OSError_new,
1179 OSError_methods, OSError_members, OSError_getset,
1180 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001181 "Base class for I/O related errors.");
1182
1183
1184/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001185 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001186 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001187MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1188 "I/O operation would block.");
1189MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1190 "Connection error.");
1191MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1192 "Child process error.");
1193MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1194 "Broken pipe.");
1195MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1196 "Connection aborted.");
1197MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1198 "Connection refused.");
1199MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1200 "Connection reset.");
1201MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1202 "File already exists.");
1203MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1204 "File not found.");
1205MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1206 "Operation doesn't work on directories.");
1207MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1208 "Operation only works on directories.");
1209MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1210 "Interrupted by signal.");
1211MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1212 "Not enough permissions.");
1213MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1214 "Process not found.");
1215MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1216 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001217
1218/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001219 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001220 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001221SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222 "Read beyond end of file.");
1223
1224
1225/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001226 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001227 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001228SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001229 "Unspecified run-time error.");
1230
Yury Selivanovf488fb42015-07-03 01:04:23 -04001231/*
1232 * RecursionError extends RuntimeError
1233 */
1234SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1235 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236
1237/*
1238 * NotImplementedError extends RuntimeError
1239 */
1240SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1241 "Method or function hasn't been implemented yet.");
1242
1243/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001244 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001246SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001247 "Name not found globally.");
1248
1249/*
1250 * UnboundLocalError extends NameError
1251 */
1252SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1253 "Local name referenced but not bound to a value.");
1254
1255/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001256 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001257 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001258SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259 "Attribute not found.");
1260
1261
1262/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001263 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001265
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001266/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001267static int _report_missing_parentheses(PySyntaxErrorObject *self);
1268
Thomas Wouters477c8d52006-05-27 19:21:47 +00001269static int
1270SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1271{
1272 PyObject *info = NULL;
1273 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1274
1275 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1276 return -1;
1277
1278 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001279 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001280 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001281 }
1282 if (lenargs == 2) {
1283 info = PyTuple_GET_ITEM(args, 1);
1284 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001285 if (!info)
1286 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001287
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001288 if (PyTuple_GET_SIZE(info) != 4) {
1289 /* not a very good error message, but it's what Python 2.4 gives */
1290 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1291 Py_DECREF(info);
1292 return -1;
1293 }
1294
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001295 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001296 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001297
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001298 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001299 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001300
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001301 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001302 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001303
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001304 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001305 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001306
1307 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001308
1309 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1310 if (self->text && PyUnicode_Check(self->text)) {
1311 if (_report_missing_parentheses(self) < 0) {
1312 return -1;
1313 }
1314 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315 }
1316 return 0;
1317}
1318
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001319static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001320SyntaxError_clear(PySyntaxErrorObject *self)
1321{
1322 Py_CLEAR(self->msg);
1323 Py_CLEAR(self->filename);
1324 Py_CLEAR(self->lineno);
1325 Py_CLEAR(self->offset);
1326 Py_CLEAR(self->text);
1327 Py_CLEAR(self->print_file_and_line);
1328 return BaseException_clear((PyBaseExceptionObject *)self);
1329}
1330
1331static void
1332SyntaxError_dealloc(PySyntaxErrorObject *self)
1333{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001334 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001336 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337}
1338
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001339static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001340SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1341{
1342 Py_VISIT(self->msg);
1343 Py_VISIT(self->filename);
1344 Py_VISIT(self->lineno);
1345 Py_VISIT(self->offset);
1346 Py_VISIT(self->text);
1347 Py_VISIT(self->print_file_and_line);
1348 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1349}
1350
1351/* This is called "my_basename" instead of just "basename" to avoid name
1352 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1353 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001354static PyObject*
1355my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001356{
Victor Stinner6237daf2010-04-28 17:26:19 +00001357 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001358 int kind;
1359 void *data;
1360
1361 if (PyUnicode_READY(name))
1362 return NULL;
1363 kind = PyUnicode_KIND(name);
1364 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001365 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001366 offset = 0;
1367 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001368 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001369 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001371 if (offset != 0)
1372 return PyUnicode_Substring(name, offset, size);
1373 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001374 Py_INCREF(name);
1375 return name;
1376 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001377}
1378
1379
1380static PyObject *
1381SyntaxError_str(PySyntaxErrorObject *self)
1382{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001383 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001384 PyObject *filename;
1385 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001386 /* Below, we always ignore overflow errors, just printing -1.
1387 Still, we cannot allow an OverflowError to be raised, so
1388 we need to call PyLong_AsLongAndOverflow. */
1389 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001390
1391 /* XXX -- do all the additional formatting with filename and
1392 lineno here */
1393
Neal Norwitzed2b7392007-08-26 04:51:10 +00001394 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001395 filename = my_basename(self->filename);
1396 if (filename == NULL)
1397 return NULL;
1398 } else {
1399 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001400 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001401 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001402
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001403 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001404 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001406 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001407 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001408 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001409 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001411 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001412 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001413 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001414 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001415 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001416 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001417 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001418 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001419 Py_XDECREF(filename);
1420 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421}
1422
1423static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001424 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1425 PyDoc_STR("exception msg")},
1426 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1427 PyDoc_STR("exception filename")},
1428 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1429 PyDoc_STR("exception lineno")},
1430 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1431 PyDoc_STR("exception offset")},
1432 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1433 PyDoc_STR("exception text")},
1434 {"print_file_and_line", T_OBJECT,
1435 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1436 PyDoc_STR("exception print_file_and_line")},
1437 {NULL} /* Sentinel */
1438};
1439
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001440ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001441 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001442 SyntaxError_str, "Invalid syntax.");
1443
1444
1445/*
1446 * IndentationError extends SyntaxError
1447 */
1448MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1449 "Improper indentation.");
1450
1451
1452/*
1453 * TabError extends IndentationError
1454 */
1455MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1456 "Improper mixture of spaces and tabs.");
1457
1458
1459/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001460 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001461 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001462SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001463 "Base class for lookup errors.");
1464
1465
1466/*
1467 * IndexError extends LookupError
1468 */
1469SimpleExtendsException(PyExc_LookupError, IndexError,
1470 "Sequence index out of range.");
1471
1472
1473/*
1474 * KeyError extends LookupError
1475 */
1476static PyObject *
1477KeyError_str(PyBaseExceptionObject *self)
1478{
1479 /* If args is a tuple of exactly one item, apply repr to args[0].
1480 This is done so that e.g. the exception raised by {}[''] prints
1481 KeyError: ''
1482 rather than the confusing
1483 KeyError
1484 alone. The downside is that if KeyError is raised with an explanatory
1485 string, that string will be displayed in quotes. Too bad.
1486 If args is anything else, use the default BaseException__str__().
1487 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001488 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001489 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001490 }
1491 return BaseException_str(self);
1492}
1493
1494ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001495 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496
1497
1498/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001499 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001500 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001501SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001502 "Inappropriate argument value (of correct type).");
1503
1504/*
1505 * UnicodeError extends ValueError
1506 */
1507
1508SimpleExtendsException(PyExc_ValueError, UnicodeError,
1509 "Unicode related error.");
1510
Thomas Wouters477c8d52006-05-27 19:21:47 +00001511static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001512get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001513{
1514 if (!attr) {
1515 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1516 return NULL;
1517 }
1518
Christian Heimes72b710a2008-05-26 13:28:38 +00001519 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001520 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1521 return NULL;
1522 }
1523 Py_INCREF(attr);
1524 return attr;
1525}
1526
1527static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001528get_unicode(PyObject *attr, const char *name)
1529{
1530 if (!attr) {
1531 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1532 return NULL;
1533 }
1534
1535 if (!PyUnicode_Check(attr)) {
1536 PyErr_Format(PyExc_TypeError,
1537 "%.200s attribute must be unicode", name);
1538 return NULL;
1539 }
1540 Py_INCREF(attr);
1541 return attr;
1542}
1543
Walter Dörwaldd2034312007-05-18 16:29:38 +00001544static int
1545set_unicodefromstring(PyObject **attr, const char *value)
1546{
1547 PyObject *obj = PyUnicode_FromString(value);
1548 if (!obj)
1549 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001550 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001551 return 0;
1552}
1553
Thomas Wouters477c8d52006-05-27 19:21:47 +00001554PyObject *
1555PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1556{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001557 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558}
1559
1560PyObject *
1561PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1562{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001563 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001564}
1565
1566PyObject *
1567PyUnicodeEncodeError_GetObject(PyObject *exc)
1568{
1569 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1570}
1571
1572PyObject *
1573PyUnicodeDecodeError_GetObject(PyObject *exc)
1574{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001575 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001576}
1577
1578PyObject *
1579PyUnicodeTranslateError_GetObject(PyObject *exc)
1580{
1581 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1582}
1583
1584int
1585PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1586{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001587 Py_ssize_t size;
1588 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1589 "object");
1590 if (!obj)
1591 return -1;
1592 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001593 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001594 if (*start<0)
1595 *start = 0; /*XXX check for values <0*/
1596 if (*start>=size)
1597 *start = size-1;
1598 Py_DECREF(obj);
1599 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001600}
1601
1602
1603int
1604PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1605{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001606 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001607 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001608 if (!obj)
1609 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001610 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001611 *start = ((PyUnicodeErrorObject *)exc)->start;
1612 if (*start<0)
1613 *start = 0;
1614 if (*start>=size)
1615 *start = size-1;
1616 Py_DECREF(obj);
1617 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001618}
1619
1620
1621int
1622PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1623{
1624 return PyUnicodeEncodeError_GetStart(exc, start);
1625}
1626
1627
1628int
1629PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1630{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001631 ((PyUnicodeErrorObject *)exc)->start = start;
1632 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001633}
1634
1635
1636int
1637PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1638{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001639 ((PyUnicodeErrorObject *)exc)->start = start;
1640 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001641}
1642
1643
1644int
1645PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1646{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001647 ((PyUnicodeErrorObject *)exc)->start = start;
1648 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001649}
1650
1651
1652int
1653PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1654{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001655 Py_ssize_t size;
1656 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1657 "object");
1658 if (!obj)
1659 return -1;
1660 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001661 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001662 if (*end<1)
1663 *end = 1;
1664 if (*end>size)
1665 *end = size;
1666 Py_DECREF(obj);
1667 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001668}
1669
1670
1671int
1672PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1673{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001674 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001675 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001676 if (!obj)
1677 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001678 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001679 *end = ((PyUnicodeErrorObject *)exc)->end;
1680 if (*end<1)
1681 *end = 1;
1682 if (*end>size)
1683 *end = size;
1684 Py_DECREF(obj);
1685 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001686}
1687
1688
1689int
1690PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1691{
1692 return PyUnicodeEncodeError_GetEnd(exc, start);
1693}
1694
1695
1696int
1697PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1698{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001699 ((PyUnicodeErrorObject *)exc)->end = end;
1700 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001701}
1702
1703
1704int
1705PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1706{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001707 ((PyUnicodeErrorObject *)exc)->end = end;
1708 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001709}
1710
1711
1712int
1713PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1714{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001715 ((PyUnicodeErrorObject *)exc)->end = end;
1716 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001717}
1718
1719PyObject *
1720PyUnicodeEncodeError_GetReason(PyObject *exc)
1721{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001722 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723}
1724
1725
1726PyObject *
1727PyUnicodeDecodeError_GetReason(PyObject *exc)
1728{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001729 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001730}
1731
1732
1733PyObject *
1734PyUnicodeTranslateError_GetReason(PyObject *exc)
1735{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001736 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737}
1738
1739
1740int
1741PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1742{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001743 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1744 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001745}
1746
1747
1748int
1749PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1750{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001751 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1752 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001753}
1754
1755
1756int
1757PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1758{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001759 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1760 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001761}
1762
1763
Thomas Wouters477c8d52006-05-27 19:21:47 +00001764static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001765UnicodeError_clear(PyUnicodeErrorObject *self)
1766{
1767 Py_CLEAR(self->encoding);
1768 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001769 Py_CLEAR(self->reason);
1770 return BaseException_clear((PyBaseExceptionObject *)self);
1771}
1772
1773static void
1774UnicodeError_dealloc(PyUnicodeErrorObject *self)
1775{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001776 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001778 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779}
1780
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001781static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001782UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1783{
1784 Py_VISIT(self->encoding);
1785 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001786 Py_VISIT(self->reason);
1787 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1788}
1789
1790static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1792 PyDoc_STR("exception encoding")},
1793 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1794 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001795 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001797 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001798 PyDoc_STR("exception end")},
1799 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1800 PyDoc_STR("exception reason")},
1801 {NULL} /* Sentinel */
1802};
1803
1804
1805/*
1806 * UnicodeEncodeError extends UnicodeError
1807 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808
1809static int
1810UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1811{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001812 PyUnicodeErrorObject *err;
1813
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1815 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001816
1817 err = (PyUnicodeErrorObject *)self;
1818
1819 Py_CLEAR(err->encoding);
1820 Py_CLEAR(err->object);
1821 Py_CLEAR(err->reason);
1822
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001823 if (!PyArg_ParseTuple(args, "UUnnU",
1824 &err->encoding, &err->object,
1825 &err->start, &err->end, &err->reason)) {
1826 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001827 return -1;
1828 }
1829
Guido van Rossum98297ee2007-11-06 21:34:58 +00001830 Py_INCREF(err->encoding);
1831 Py_INCREF(err->object);
1832 Py_INCREF(err->reason);
1833
1834 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835}
1836
1837static PyObject *
1838UnicodeEncodeError_str(PyObject *self)
1839{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001840 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001841 PyObject *result = NULL;
1842 PyObject *reason_str = NULL;
1843 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001845 if (!uself->object)
1846 /* Not properly initialized. */
1847 return PyUnicode_FromString("");
1848
Eric Smith0facd772010-02-24 15:42:29 +00001849 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001850 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001851 reason_str = PyObject_Str(uself->reason);
1852 if (reason_str == NULL)
1853 goto done;
1854 encoding_str = PyObject_Str(uself->encoding);
1855 if (encoding_str == NULL)
1856 goto done;
1857
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001858 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1859 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001860 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001861 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001862 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001863 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001864 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001865 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001866 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001867 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001868 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001869 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001870 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001871 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001872 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001873 }
Eric Smith0facd772010-02-24 15:42:29 +00001874 else {
1875 result = PyUnicode_FromFormat(
1876 "'%U' codec can't encode characters in position %zd-%zd: %U",
1877 encoding_str,
1878 uself->start,
1879 uself->end-1,
1880 reason_str);
1881 }
1882done:
1883 Py_XDECREF(reason_str);
1884 Py_XDECREF(encoding_str);
1885 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001886}
1887
1888static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001889 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001890 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001891 sizeof(PyUnicodeErrorObject), 0,
1892 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1893 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1894 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001895 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1896 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001898 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899};
1900PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1901
1902PyObject *
1903PyUnicodeEncodeError_Create(
1904 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1905 Py_ssize_t start, Py_ssize_t end, const char *reason)
1906{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001907 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001908 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001909}
1910
1911
1912/*
1913 * UnicodeDecodeError extends UnicodeError
1914 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001915
1916static int
1917UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1918{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001919 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001920
Thomas Wouters477c8d52006-05-27 19:21:47 +00001921 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1922 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001923
1924 ude = (PyUnicodeErrorObject *)self;
1925
1926 Py_CLEAR(ude->encoding);
1927 Py_CLEAR(ude->object);
1928 Py_CLEAR(ude->reason);
1929
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001930 if (!PyArg_ParseTuple(args, "UOnnU",
1931 &ude->encoding, &ude->object,
1932 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001933 ude->encoding = ude->object = ude->reason = NULL;
1934 return -1;
1935 }
1936
Guido van Rossum98297ee2007-11-06 21:34:58 +00001937 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001938 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001939 Py_INCREF(ude->reason);
1940
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001941 if (!PyBytes_Check(ude->object)) {
1942 Py_buffer view;
1943 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1944 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001945 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001946 PyBuffer_Release(&view);
1947 if (!ude->object)
1948 goto error;
1949 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001950 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001951
1952error:
1953 Py_CLEAR(ude->encoding);
1954 Py_CLEAR(ude->object);
1955 Py_CLEAR(ude->reason);
1956 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957}
1958
1959static PyObject *
1960UnicodeDecodeError_str(PyObject *self)
1961{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001962 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001963 PyObject *result = NULL;
1964 PyObject *reason_str = NULL;
1965 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001966
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001967 if (!uself->object)
1968 /* Not properly initialized. */
1969 return PyUnicode_FromString("");
1970
Eric Smith0facd772010-02-24 15:42:29 +00001971 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001972 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001973 reason_str = PyObject_Str(uself->reason);
1974 if (reason_str == NULL)
1975 goto done;
1976 encoding_str = PyObject_Str(uself->encoding);
1977 if (encoding_str == NULL)
1978 goto done;
1979
1980 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001981 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001982 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001983 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001984 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001985 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001986 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001987 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988 }
Eric Smith0facd772010-02-24 15:42:29 +00001989 else {
1990 result = PyUnicode_FromFormat(
1991 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1992 encoding_str,
1993 uself->start,
1994 uself->end-1,
1995 reason_str
1996 );
1997 }
1998done:
1999 Py_XDECREF(reason_str);
2000 Py_XDECREF(encoding_str);
2001 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002002}
2003
2004static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002005 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002006 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002007 sizeof(PyUnicodeErrorObject), 0,
2008 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2009 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2010 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002011 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2012 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002013 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002014 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002015};
2016PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2017
2018PyObject *
2019PyUnicodeDecodeError_Create(
2020 const char *encoding, const char *object, Py_ssize_t length,
2021 Py_ssize_t start, Py_ssize_t end, const char *reason)
2022{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002023 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002024 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002025}
2026
2027
2028/*
2029 * UnicodeTranslateError extends UnicodeError
2030 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002031
2032static int
2033UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2034 PyObject *kwds)
2035{
2036 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2037 return -1;
2038
2039 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002040 Py_CLEAR(self->reason);
2041
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002042 if (!PyArg_ParseTuple(args, "UnnU",
2043 &self->object,
2044 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002045 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002046 return -1;
2047 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002048
Thomas Wouters477c8d52006-05-27 19:21:47 +00002049 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002050 Py_INCREF(self->reason);
2051
2052 return 0;
2053}
2054
2055
2056static PyObject *
2057UnicodeTranslateError_str(PyObject *self)
2058{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002059 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002060 PyObject *result = NULL;
2061 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002062
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002063 if (!uself->object)
2064 /* Not properly initialized. */
2065 return PyUnicode_FromString("");
2066
Eric Smith0facd772010-02-24 15:42:29 +00002067 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002068 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002069 reason_str = PyObject_Str(uself->reason);
2070 if (reason_str == NULL)
2071 goto done;
2072
Victor Stinner53b33e72011-11-21 01:17:27 +01002073 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2074 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002075 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002076 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002077 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002078 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002079 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002080 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002081 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002082 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002083 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002084 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002085 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002086 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002087 );
Eric Smith0facd772010-02-24 15:42:29 +00002088 } else {
2089 result = PyUnicode_FromFormat(
2090 "can't translate characters in position %zd-%zd: %U",
2091 uself->start,
2092 uself->end-1,
2093 reason_str
2094 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002095 }
Eric Smith0facd772010-02-24 15:42:29 +00002096done:
2097 Py_XDECREF(reason_str);
2098 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099}
2100
2101static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002102 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002103 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 sizeof(PyUnicodeErrorObject), 0,
2105 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2106 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2107 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002108 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002109 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2110 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002111 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002112};
2113PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2114
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002115/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002116PyObject *
2117PyUnicodeTranslateError_Create(
2118 const Py_UNICODE *object, Py_ssize_t length,
2119 Py_ssize_t start, Py_ssize_t end, const char *reason)
2120{
2121 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002122 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002123}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002124
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002125PyObject *
2126_PyUnicodeTranslateError_Create(
2127 PyObject *object,
2128 Py_ssize_t start, Py_ssize_t end, const char *reason)
2129{
Victor Stinner69598d42014-04-04 20:59:44 +02002130 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002131 object, start, end, reason);
2132}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002133
2134/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002135 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002136 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002137SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002138 "Assertion failed.");
2139
2140
2141/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002142 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002143 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002144SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002145 "Base class for arithmetic errors.");
2146
2147
2148/*
2149 * FloatingPointError extends ArithmeticError
2150 */
2151SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2152 "Floating point operation failed.");
2153
2154
2155/*
2156 * OverflowError extends ArithmeticError
2157 */
2158SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2159 "Result too large to be represented.");
2160
2161
2162/*
2163 * ZeroDivisionError extends ArithmeticError
2164 */
2165SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2166 "Second argument to a division or modulo operation was zero.");
2167
2168
2169/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002170 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002172SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002173 "Internal error in the Python interpreter.\n"
2174 "\n"
2175 "Please report this to the Python maintainer, along with the traceback,\n"
2176 "the Python version, and the hardware/OS platform and version.");
2177
2178
2179/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002180 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002181 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002182SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002183 "Weak ref proxy used after referent went away.");
2184
2185
2186/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002187 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002189
2190#define MEMERRORS_SAVE 16
2191static PyBaseExceptionObject *memerrors_freelist = NULL;
2192static int memerrors_numfree = 0;
2193
2194static PyObject *
2195MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2196{
2197 PyBaseExceptionObject *self;
2198
2199 if (type != (PyTypeObject *) PyExc_MemoryError)
2200 return BaseException_new(type, args, kwds);
2201 if (memerrors_freelist == NULL)
2202 return BaseException_new(type, args, kwds);
2203 /* Fetch object from freelist and revive it */
2204 self = memerrors_freelist;
2205 self->args = PyTuple_New(0);
2206 /* This shouldn't happen since the empty tuple is persistent */
2207 if (self->args == NULL)
2208 return NULL;
2209 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2210 memerrors_numfree--;
2211 self->dict = NULL;
2212 _Py_NewReference((PyObject *)self);
2213 _PyObject_GC_TRACK(self);
2214 return (PyObject *)self;
2215}
2216
2217static void
2218MemoryError_dealloc(PyBaseExceptionObject *self)
2219{
2220 _PyObject_GC_UNTRACK(self);
2221 BaseException_clear(self);
2222 if (memerrors_numfree >= MEMERRORS_SAVE)
2223 Py_TYPE(self)->tp_free((PyObject *)self);
2224 else {
2225 self->dict = (PyObject *) memerrors_freelist;
2226 memerrors_freelist = self;
2227 memerrors_numfree++;
2228 }
2229}
2230
2231static void
2232preallocate_memerrors(void)
2233{
2234 /* We create enough MemoryErrors and then decref them, which will fill
2235 up the freelist. */
2236 int i;
2237 PyObject *errors[MEMERRORS_SAVE];
2238 for (i = 0; i < MEMERRORS_SAVE; i++) {
2239 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2240 NULL, NULL);
2241 if (!errors[i])
2242 Py_FatalError("Could not preallocate MemoryError object");
2243 }
2244 for (i = 0; i < MEMERRORS_SAVE; i++) {
2245 Py_DECREF(errors[i]);
2246 }
2247}
2248
2249static void
2250free_preallocated_memerrors(void)
2251{
2252 while (memerrors_freelist != NULL) {
2253 PyObject *self = (PyObject *) memerrors_freelist;
2254 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2255 Py_TYPE(self)->tp_free((PyObject *)self);
2256 }
2257}
2258
2259
2260static PyTypeObject _PyExc_MemoryError = {
2261 PyVarObject_HEAD_INIT(NULL, 0)
2262 "MemoryError",
2263 sizeof(PyBaseExceptionObject),
2264 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2265 0, 0, 0, 0, 0, 0, 0,
2266 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2267 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2268 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2269 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2270 (initproc)BaseException_init, 0, MemoryError_new
2271};
2272PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2273
Thomas Wouters477c8d52006-05-27 19:21:47 +00002274
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002275/*
2276 * BufferError extends Exception
2277 */
2278SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2279
Thomas Wouters477c8d52006-05-27 19:21:47 +00002280
2281/* Warning category docstrings */
2282
2283/*
2284 * Warning extends Exception
2285 */
2286SimpleExtendsException(PyExc_Exception, Warning,
2287 "Base class for warning categories.");
2288
2289
2290/*
2291 * UserWarning extends Warning
2292 */
2293SimpleExtendsException(PyExc_Warning, UserWarning,
2294 "Base class for warnings generated by user code.");
2295
2296
2297/*
2298 * DeprecationWarning extends Warning
2299 */
2300SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2301 "Base class for warnings about deprecated features.");
2302
2303
2304/*
2305 * PendingDeprecationWarning extends Warning
2306 */
2307SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2308 "Base class for warnings about features which will be deprecated\n"
2309 "in the future.");
2310
2311
2312/*
2313 * SyntaxWarning extends Warning
2314 */
2315SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2316 "Base class for warnings about dubious syntax.");
2317
2318
2319/*
2320 * RuntimeWarning extends Warning
2321 */
2322SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2323 "Base class for warnings about dubious runtime behavior.");
2324
2325
2326/*
2327 * FutureWarning extends Warning
2328 */
2329SimpleExtendsException(PyExc_Warning, FutureWarning,
2330 "Base class for warnings about constructs that will change semantically\n"
2331 "in the future.");
2332
2333
2334/*
2335 * ImportWarning extends Warning
2336 */
2337SimpleExtendsException(PyExc_Warning, ImportWarning,
2338 "Base class for warnings about probable mistakes in module imports");
2339
2340
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002341/*
2342 * UnicodeWarning extends Warning
2343 */
2344SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2345 "Base class for warnings about Unicode related problems, mostly\n"
2346 "related to conversion problems.");
2347
Georg Brandl08be72d2010-10-24 15:11:22 +00002348
Guido van Rossum98297ee2007-11-06 21:34:58 +00002349/*
2350 * BytesWarning extends Warning
2351 */
2352SimpleExtendsException(PyExc_Warning, BytesWarning,
2353 "Base class for warnings about bytes and buffer related problems, mostly\n"
2354 "related to conversion from str or comparing to str.");
2355
2356
Georg Brandl08be72d2010-10-24 15:11:22 +00002357/*
2358 * ResourceWarning extends Warning
2359 */
2360SimpleExtendsException(PyExc_Warning, ResourceWarning,
2361 "Base class for warnings about resource usage.");
2362
2363
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002364
Yury Selivanovf488fb42015-07-03 01:04:23 -04002365/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002366 Meant to be used when normalizing the exception for exceeding the recursion
2367 depth will cause its own infinite recursion.
2368*/
2369PyObject *PyExc_RecursionErrorInst = NULL;
2370
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002371#define PRE_INIT(TYPE) \
2372 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2373 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2374 Py_FatalError("exceptions bootstrapping error."); \
2375 Py_INCREF(PyExc_ ## TYPE); \
2376 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002378#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002379 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2380 Py_FatalError("Module dictionary insertion problem.");
2381
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002382#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002383 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002384 PyExc_ ## NAME = PyExc_ ## TYPE; \
2385 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2386 Py_FatalError("Module dictionary insertion problem.");
2387
2388#define ADD_ERRNO(TYPE, CODE) { \
2389 PyObject *_code = PyLong_FromLong(CODE); \
2390 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2391 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2392 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002393 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002394 }
2395
2396#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002397#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002398/* The following constants were added to errno.h in VS2010 but have
2399 preferred WSA equivalents. */
2400#undef EADDRINUSE
2401#undef EADDRNOTAVAIL
2402#undef EAFNOSUPPORT
2403#undef EALREADY
2404#undef ECONNABORTED
2405#undef ECONNREFUSED
2406#undef ECONNRESET
2407#undef EDESTADDRREQ
2408#undef EHOSTUNREACH
2409#undef EINPROGRESS
2410#undef EISCONN
2411#undef ELOOP
2412#undef EMSGSIZE
2413#undef ENETDOWN
2414#undef ENETRESET
2415#undef ENETUNREACH
2416#undef ENOBUFS
2417#undef ENOPROTOOPT
2418#undef ENOTCONN
2419#undef ENOTSOCK
2420#undef EOPNOTSUPP
2421#undef EPROTONOSUPPORT
2422#undef EPROTOTYPE
2423#undef ETIMEDOUT
2424#undef EWOULDBLOCK
2425
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002426#if defined(WSAEALREADY) && !defined(EALREADY)
2427#define EALREADY WSAEALREADY
2428#endif
2429#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2430#define ECONNABORTED WSAECONNABORTED
2431#endif
2432#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2433#define ECONNREFUSED WSAECONNREFUSED
2434#endif
2435#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2436#define ECONNRESET WSAECONNRESET
2437#endif
2438#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2439#define EINPROGRESS WSAEINPROGRESS
2440#endif
2441#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2442#define ESHUTDOWN WSAESHUTDOWN
2443#endif
2444#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2445#define ETIMEDOUT WSAETIMEDOUT
2446#endif
2447#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2448#define EWOULDBLOCK WSAEWOULDBLOCK
2449#endif
2450#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002451
Martin v. Löwis1a214512008-06-11 05:26:20 +00002452void
Brett Cannonfd074152012-04-14 14:10:13 -04002453_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002454{
Brett Cannonfd074152012-04-14 14:10:13 -04002455 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002456
2457 PRE_INIT(BaseException)
2458 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002460 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461 PRE_INIT(StopIteration)
2462 PRE_INIT(GeneratorExit)
2463 PRE_INIT(SystemExit)
2464 PRE_INIT(KeyboardInterrupt)
2465 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002466 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002467 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002468 PRE_INIT(EOFError)
2469 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002470 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002471 PRE_INIT(NotImplementedError)
2472 PRE_INIT(NameError)
2473 PRE_INIT(UnboundLocalError)
2474 PRE_INIT(AttributeError)
2475 PRE_INIT(SyntaxError)
2476 PRE_INIT(IndentationError)
2477 PRE_INIT(TabError)
2478 PRE_INIT(LookupError)
2479 PRE_INIT(IndexError)
2480 PRE_INIT(KeyError)
2481 PRE_INIT(ValueError)
2482 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002483 PRE_INIT(UnicodeEncodeError)
2484 PRE_INIT(UnicodeDecodeError)
2485 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002486 PRE_INIT(AssertionError)
2487 PRE_INIT(ArithmeticError)
2488 PRE_INIT(FloatingPointError)
2489 PRE_INIT(OverflowError)
2490 PRE_INIT(ZeroDivisionError)
2491 PRE_INIT(SystemError)
2492 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002493 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002494 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002495 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002496 PRE_INIT(Warning)
2497 PRE_INIT(UserWarning)
2498 PRE_INIT(DeprecationWarning)
2499 PRE_INIT(PendingDeprecationWarning)
2500 PRE_INIT(SyntaxWarning)
2501 PRE_INIT(RuntimeWarning)
2502 PRE_INIT(FutureWarning)
2503 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002504 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002505 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002506 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002507
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002508 /* OSError subclasses */
2509 PRE_INIT(ConnectionError);
2510
2511 PRE_INIT(BlockingIOError);
2512 PRE_INIT(BrokenPipeError);
2513 PRE_INIT(ChildProcessError);
2514 PRE_INIT(ConnectionAbortedError);
2515 PRE_INIT(ConnectionRefusedError);
2516 PRE_INIT(ConnectionResetError);
2517 PRE_INIT(FileExistsError);
2518 PRE_INIT(FileNotFoundError);
2519 PRE_INIT(IsADirectoryError);
2520 PRE_INIT(NotADirectoryError);
2521 PRE_INIT(InterruptedError);
2522 PRE_INIT(PermissionError);
2523 PRE_INIT(ProcessLookupError);
2524 PRE_INIT(TimeoutError);
2525
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526 bdict = PyModule_GetDict(bltinmod);
2527 if (bdict == NULL)
2528 Py_FatalError("exceptions bootstrapping error.");
2529
2530 POST_INIT(BaseException)
2531 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002533 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002534 POST_INIT(StopIteration)
2535 POST_INIT(GeneratorExit)
2536 POST_INIT(SystemExit)
2537 POST_INIT(KeyboardInterrupt)
2538 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002539 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002541 INIT_ALIAS(EnvironmentError, OSError)
2542 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002544 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002545#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002546 POST_INIT(EOFError)
2547 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002548 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002549 POST_INIT(NotImplementedError)
2550 POST_INIT(NameError)
2551 POST_INIT(UnboundLocalError)
2552 POST_INIT(AttributeError)
2553 POST_INIT(SyntaxError)
2554 POST_INIT(IndentationError)
2555 POST_INIT(TabError)
2556 POST_INIT(LookupError)
2557 POST_INIT(IndexError)
2558 POST_INIT(KeyError)
2559 POST_INIT(ValueError)
2560 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002561 POST_INIT(UnicodeEncodeError)
2562 POST_INIT(UnicodeDecodeError)
2563 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002564 POST_INIT(AssertionError)
2565 POST_INIT(ArithmeticError)
2566 POST_INIT(FloatingPointError)
2567 POST_INIT(OverflowError)
2568 POST_INIT(ZeroDivisionError)
2569 POST_INIT(SystemError)
2570 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002571 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002573 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002574 POST_INIT(Warning)
2575 POST_INIT(UserWarning)
2576 POST_INIT(DeprecationWarning)
2577 POST_INIT(PendingDeprecationWarning)
2578 POST_INIT(SyntaxWarning)
2579 POST_INIT(RuntimeWarning)
2580 POST_INIT(FutureWarning)
2581 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002582 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002583 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002584 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002585
Antoine Pitrouac456a12012-01-18 21:35:21 +01002586 if (!errnomap) {
2587 errnomap = PyDict_New();
2588 if (!errnomap)
2589 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2590 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002591
2592 /* OSError subclasses */
2593 POST_INIT(ConnectionError);
2594
2595 POST_INIT(BlockingIOError);
2596 ADD_ERRNO(BlockingIOError, EAGAIN);
2597 ADD_ERRNO(BlockingIOError, EALREADY);
2598 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2599 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2600 POST_INIT(BrokenPipeError);
2601 ADD_ERRNO(BrokenPipeError, EPIPE);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002602#ifdef ESHUTDOWN
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002603 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002604#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002605 POST_INIT(ChildProcessError);
2606 ADD_ERRNO(ChildProcessError, ECHILD);
2607 POST_INIT(ConnectionAbortedError);
2608 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2609 POST_INIT(ConnectionRefusedError);
2610 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2611 POST_INIT(ConnectionResetError);
2612 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2613 POST_INIT(FileExistsError);
2614 ADD_ERRNO(FileExistsError, EEXIST);
2615 POST_INIT(FileNotFoundError);
2616 ADD_ERRNO(FileNotFoundError, ENOENT);
2617 POST_INIT(IsADirectoryError);
2618 ADD_ERRNO(IsADirectoryError, EISDIR);
2619 POST_INIT(NotADirectoryError);
2620 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2621 POST_INIT(InterruptedError);
2622 ADD_ERRNO(InterruptedError, EINTR);
2623 POST_INIT(PermissionError);
2624 ADD_ERRNO(PermissionError, EACCES);
2625 ADD_ERRNO(PermissionError, EPERM);
2626 POST_INIT(ProcessLookupError);
2627 ADD_ERRNO(ProcessLookupError, ESRCH);
2628 POST_INIT(TimeoutError);
2629 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2630
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002631 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002633 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002634 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002635 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002636 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002637 "recursion errors");
2638 else {
2639 PyBaseExceptionObject *err_inst =
2640 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2641 PyObject *args_tuple;
2642 PyObject *exc_message;
2643 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2644 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002645 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002646 "pre-allocation");
2647 args_tuple = PyTuple_Pack(1, exc_message);
2648 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002649 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002650 "pre-allocation");
2651 Py_DECREF(exc_message);
2652 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002653 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002654 Py_DECREF(args_tuple);
2655 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657}
2658
2659void
2660_PyExc_Fini(void)
2661{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002662 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002663 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002664 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002666
2667/* Helper to do the equivalent of "raise X from Y" in C, but always using
2668 * the current exception rather than passing one in.
2669 *
2670 * We currently limit this to *only* exceptions that use the BaseException
2671 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2672 * those correctly without losing data and without losing backwards
2673 * compatibility.
2674 *
2675 * We also aim to rule out *all* exceptions that might be storing additional
2676 * state, whether by having a size difference relative to BaseException,
2677 * additional arguments passed in during construction or by having a
2678 * non-empty instance dict.
2679 *
2680 * We need to be very careful with what we wrap, since changing types to
2681 * a broader exception type would be backwards incompatible for
2682 * existing codecs, and with different init or new method implementations
2683 * may either not support instantiation with PyErr_Format or lose
2684 * information when instantiated that way.
2685 *
2686 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2687 * fact that exceptions are expected to support pickling. If more builtin
2688 * exceptions (e.g. AttributeError) start to be converted to rich
2689 * exceptions with additional attributes, that's probably a better approach
2690 * to pursue over adding special cases for particular stateful subclasses.
2691 *
2692 * Returns a borrowed reference to the new exception (if any), NULL if the
2693 * existing exception was left in place.
2694 */
2695PyObject *
2696_PyErr_TrySetFromCause(const char *format, ...)
2697{
2698 PyObject* msg_prefix;
2699 PyObject *exc, *val, *tb;
2700 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002701 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002702 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002703 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002704 PyObject *new_exc, *new_val, *new_tb;
2705 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002706 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002707
Nick Coghlan8b097b42013-11-13 23:49:21 +10002708 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002709 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002710 /* Ensure type info indicates no extra state is stored at the C level
2711 * and that the type can be reinstantiated using PyErr_Format
2712 */
2713 caught_type_size = caught_type->tp_basicsize;
2714 base_exc_size = _PyExc_BaseException.tp_basicsize;
2715 same_basic_size = (
2716 caught_type_size == base_exc_size ||
2717 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002718 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002719 )
2720 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002721 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002722 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002723 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002724 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002725 /* We can't be sure we can wrap this safely, since it may contain
2726 * more state than just the exception type. Accordingly, we just
2727 * leave it alone.
2728 */
2729 PyErr_Restore(exc, val, tb);
2730 return NULL;
2731 }
2732
2733 /* Check the args are empty or contain a single string */
2734 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002735 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002736 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002737 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002738 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002739 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002740 /* More than 1 arg, or the one arg we do have isn't a string
2741 */
2742 PyErr_Restore(exc, val, tb);
2743 return NULL;
2744 }
2745
2746 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002747 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002748 if (dictptr != NULL && *dictptr != NULL &&
2749 PyObject_Length(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002750 /* While we could potentially copy a non-empty instance dictionary
2751 * to the replacement exception, for now we take the more
2752 * conservative path of leaving exceptions with attributes set
2753 * alone.
2754 */
2755 PyErr_Restore(exc, val, tb);
2756 return NULL;
2757 }
2758
2759 /* For exceptions that we can wrap safely, we chain the original
2760 * exception to a new one of the exact same type with an
2761 * error message that mentions the additional details and the
2762 * original exception.
2763 *
2764 * It would be nice to wrap OSError and various other exception
2765 * types as well, but that's quite a bit trickier due to the extra
2766 * state potentially stored on OSError instances.
2767 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002768 /* Ensure the traceback is set correctly on the existing exception */
2769 if (tb != NULL) {
2770 PyException_SetTraceback(val, tb);
2771 Py_DECREF(tb);
2772 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002773
Christian Heimes507eabd2013-11-14 01:39:35 +01002774#ifdef HAVE_STDARG_PROTOTYPES
2775 va_start(vargs, format);
2776#else
2777 va_start(vargs);
2778#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002779 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002780 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002781 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002782 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002783 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002784 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002785 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002786
2787 PyErr_Format(exc, "%U (%s: %S)",
2788 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002789 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002790 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002791 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2792 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2793 PyException_SetCause(new_val, val);
2794 PyErr_Restore(new_exc, new_val, new_tb);
2795 return new_val;
2796}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002797
2798
2799/* To help with migration from Python 2, SyntaxError.__init__ applies some
2800 * heuristics to try to report a more meaningful exception when print and
2801 * exec are used like statements.
2802 *
2803 * The heuristics are currently expected to detect the following cases:
2804 * - top level statement
2805 * - statement in a nested suite
2806 * - trailing section of a one line complex statement
2807 *
2808 * They're currently known not to trigger:
2809 * - after a semi-colon
2810 *
2811 * The error message can be a bit odd in cases where the "arguments" are
2812 * completely illegal syntactically, but that isn't worth the hassle of
2813 * fixing.
2814 *
2815 * We also can't do anything about cases that are legal Python 3 syntax
2816 * but mean something entirely different from what they did in Python 2
2817 * (omitting the arguments entirely, printing items preceded by a unary plus
2818 * or minus, using the stream redirection syntax).
2819 */
2820
2821static int
2822_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2823{
2824 /* Return values:
2825 * -1: an error occurred
2826 * 0: nothing happened
2827 * 1: the check triggered & the error message was changed
2828 */
2829 static PyObject *print_prefix = NULL;
2830 static PyObject *exec_prefix = NULL;
2831 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2832 int kind = PyUnicode_KIND(self->text);
2833 void *data = PyUnicode_DATA(self->text);
2834
2835 /* Ignore leading whitespace */
2836 while (start < text_len) {
2837 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2838 if (!Py_UNICODE_ISSPACE(ch))
2839 break;
2840 start++;
2841 }
2842 /* Checking against an empty or whitespace-only part of the string */
2843 if (start == text_len) {
2844 return 0;
2845 }
2846
2847 /* Check for legacy print statements */
2848 if (print_prefix == NULL) {
2849 print_prefix = PyUnicode_InternFromString("print ");
2850 if (print_prefix == NULL) {
2851 return -1;
2852 }
2853 }
2854 if (PyUnicode_Tailmatch(self->text, print_prefix,
2855 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002856 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002857 PyUnicode_FromString("Missing parentheses in call to 'print'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002858 return 1;
2859 }
2860
2861 /* Check for legacy exec statements */
2862 if (exec_prefix == NULL) {
2863 exec_prefix = PyUnicode_InternFromString("exec ");
2864 if (exec_prefix == NULL) {
2865 return -1;
2866 }
2867 }
2868 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2869 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002870 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002871 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002872 return 1;
2873 }
2874 /* Fall back to the default error message */
2875 return 0;
2876}
2877
2878static int
2879_report_missing_parentheses(PySyntaxErrorObject *self)
2880{
2881 Py_UCS4 left_paren = 40;
2882 Py_ssize_t left_paren_index;
2883 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2884 int legacy_check_result = 0;
2885
2886 /* Skip entirely if there is an opening parenthesis */
2887 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2888 0, text_len, 1);
2889 if (left_paren_index < -1) {
2890 return -1;
2891 }
2892 if (left_paren_index != -1) {
2893 /* Use default error message for any line with an opening paren */
2894 return 0;
2895 }
2896 /* Handle the simple statement case */
2897 legacy_check_result = _check_for_legacy_statements(self, 0);
2898 if (legacy_check_result < 0) {
2899 return -1;
2900
2901 }
2902 if (legacy_check_result == 0) {
2903 /* Handle the one-line complex statement case */
2904 Py_UCS4 colon = 58;
2905 Py_ssize_t colon_index;
2906 colon_index = PyUnicode_FindChar(self->text, colon,
2907 0, text_len, 1);
2908 if (colon_index < -1) {
2909 return -1;
2910 }
2911 if (colon_index >= 0 && colon_index < text_len) {
2912 /* Check again, starting from just after the colon */
2913 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2914 return -1;
2915 }
2916 }
2917 }
2918 return 0;
2919}