blob: 2c7688ca6249bb64b57ca052d59552544fe735c9 [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
233 Py_XINCREF(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{
615 PyObject *msg = NULL;
616 PyObject *name = NULL;
617 PyObject *path = NULL;
618
619/* Macro replacement doesn't allow ## to start the first line of a macro,
620 so we move the assignment and NULL check into the if-statement. */
621#define GET_KWD(kwd) { \
622 kwd = PyDict_GetItemString(kwds, #kwd); \
623 if (kwd) { \
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200624 Py_INCREF(kwd); \
Serhiy Storchaka48842712016-04-06 09:45:48 +0300625 Py_XSETREF(self->kwd, kwd); \
Brett Cannon79ec55e2012-04-12 20:24:54 -0400626 if (PyDict_DelItemString(kwds, #kwd)) \
627 return -1; \
628 } \
629 }
630
631 if (kwds) {
632 GET_KWD(name);
633 GET_KWD(path);
634 }
635
636 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
637 return -1;
638 if (PyTuple_GET_SIZE(args) != 1)
639 return 0;
640 if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
641 return -1;
642
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200643 Py_INCREF(msg);
Serhiy Storchaka48842712016-04-06 09:45:48 +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/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200709 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000710 */
711
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200712#ifdef MS_WINDOWS
713#include "errmap.h"
714#endif
715
Thomas Wouters477c8d52006-05-27 19:21:47 +0000716/* Where a function has a single filename, such as open() or some
717 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
718 * called, giving a third argument which is the filename. But, so
719 * that old code using in-place unpacking doesn't break, e.g.:
720 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200721 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000722 *
723 * we hack args so that it only contains two items. This also
724 * means we need our own __str__() which prints out the filename
725 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800726 *
727 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800728 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
729 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000730 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200731
Antoine Pitroue0e27352011-12-15 14:31:28 +0100732/* This function doesn't cleanup on error, the caller should */
733static int
734oserror_parse_args(PyObject **p_args,
735 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800736 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200737#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100738 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200739#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100740 )
741{
742 Py_ssize_t nargs;
743 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800744#ifndef MS_WINDOWS
745 /*
746 * ignored on non-Windows platforms,
747 * but parsed so OSError has a consistent signature
748 */
749 PyObject *_winerror = NULL;
750 PyObject **winerror = &_winerror;
751#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000752
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200753 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000754
Larry Hastingsb0827312014-02-09 22:05:19 -0800755 if (nargs >= 2 && nargs <= 5) {
756 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
757 myerrno, strerror,
758 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100759 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800760#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100761 if (*winerror && PyLong_Check(*winerror)) {
762 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200763 PyObject *newargs;
764 Py_ssize_t i;
765
Antoine Pitroue0e27352011-12-15 14:31:28 +0100766 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200767 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100768 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200769 /* Set errno to the corresponding POSIX errno (overriding
770 first argument). Windows Socket error codes (>= 10000)
771 have the same value as their POSIX counterparts.
772 */
773 if (winerrcode < 10000)
774 errcode = winerror_to_errno(winerrcode);
775 else
776 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100777 *myerrno = PyLong_FromLong(errcode);
778 if (!*myerrno)
779 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200780 newargs = PyTuple_New(nargs);
781 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100782 return -1;
783 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200784 for (i = 1; i < nargs; i++) {
785 PyObject *val = PyTuple_GET_ITEM(args, i);
786 Py_INCREF(val);
787 PyTuple_SET_ITEM(newargs, i, val);
788 }
789 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100790 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200791 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800792#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200793 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000794
Antoine Pitroue0e27352011-12-15 14:31:28 +0100795 return 0;
796}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000797
Antoine Pitroue0e27352011-12-15 14:31:28 +0100798static int
799oserror_init(PyOSErrorObject *self, PyObject **p_args,
800 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800801 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100802#ifdef MS_WINDOWS
803 , PyObject *winerror
804#endif
805 )
806{
807 PyObject *args = *p_args;
808 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809
810 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200811 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100812 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200813 PyNumber_Check(filename)) {
814 /* BlockingIOError's 3rd argument can be the number of
815 * characters written.
816 */
817 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
818 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100819 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 }
821 else {
822 Py_INCREF(filename);
823 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000824
Larry Hastingsb0827312014-02-09 22:05:19 -0800825 if (filename2 && filename2 != Py_None) {
826 Py_INCREF(filename2);
827 self->filename2 = filename2;
828 }
829
830 if (nargs >= 2 && nargs <= 5) {
831 /* filename, filename2, and winerror are removed from the args tuple
832 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100833 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200834 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100835 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000836
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200837 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100838 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200839 }
840 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000841 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200842 Py_XINCREF(myerrno);
843 self->myerrno = myerrno;
844
845 Py_XINCREF(strerror);
846 self->strerror = strerror;
847
848#ifdef MS_WINDOWS
849 Py_XINCREF(winerror);
850 self->winerror = winerror;
851#endif
852
Antoine Pitroue0e27352011-12-15 14:31:28 +0100853 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300854 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100855 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100856
857 return 0;
858}
859
860static PyObject *
861OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
862static int
863OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
864
865static int
866oserror_use_init(PyTypeObject *type)
867{
Martin Panter7462b6492015-11-02 03:37:02 +0000868 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100869 extraneous argument to __new__ to be ignored. The only reasonable
870 solution, given __new__ takes a variable number of arguments,
871 is to defer arg parsing and initialization to __init__.
872
873 But when __new__ is overriden as well, it should call our __new__
874 with the right arguments.
875
876 (see http://bugs.python.org/issue12555#msg148829 )
877 */
878 if (type->tp_init != (initproc) OSError_init &&
879 type->tp_new == (newfunc) OSError_new) {
880 assert((PyObject *) type != PyExc_OSError);
881 return 1;
882 }
883 return 0;
884}
885
886static PyObject *
887OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
888{
889 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800890 PyObject *myerrno = NULL, *strerror = NULL;
891 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100892#ifdef MS_WINDOWS
893 PyObject *winerror = NULL;
894#endif
895
Victor Stinner46ef3192013-11-14 22:31:41 +0100896 Py_INCREF(args);
897
Antoine Pitroue0e27352011-12-15 14:31:28 +0100898 if (!oserror_use_init(type)) {
899 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100900 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100901
Larry Hastingsb0827312014-02-09 22:05:19 -0800902 if (oserror_parse_args(&args, &myerrno, &strerror,
903 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100904#ifdef MS_WINDOWS
905 , &winerror
906#endif
907 ))
908 goto error;
909
910 if (myerrno && PyLong_Check(myerrno) &&
911 errnomap && (PyObject *) type == PyExc_OSError) {
912 PyObject *newtype;
913 newtype = PyDict_GetItem(errnomap, myerrno);
914 if (newtype) {
915 assert(PyType_Check(newtype));
916 type = (PyTypeObject *) newtype;
917 }
918 else if (PyErr_Occurred())
919 goto error;
920 }
921 }
922
923 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
924 if (!self)
925 goto error;
926
927 self->dict = NULL;
928 self->traceback = self->cause = self->context = NULL;
929 self->written = -1;
930
931 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800932 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100933#ifdef MS_WINDOWS
934 , winerror
935#endif
936 ))
937 goto error;
938 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200939 else {
940 self->args = PyTuple_New(0);
941 if (self->args == NULL)
942 goto error;
943 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100944
Victor Stinner46ef3192013-11-14 22:31:41 +0100945 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200946 return (PyObject *) self;
947
948error:
949 Py_XDECREF(args);
950 Py_XDECREF(self);
951 return NULL;
952}
953
954static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100955OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200956{
Larry Hastingsb0827312014-02-09 22:05:19 -0800957 PyObject *myerrno = NULL, *strerror = NULL;
958 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100959#ifdef MS_WINDOWS
960 PyObject *winerror = NULL;
961#endif
962
963 if (!oserror_use_init(Py_TYPE(self)))
964 /* Everything already done in OSError_new */
965 return 0;
966
967 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
968 return -1;
969
970 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -0800971 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100972#ifdef MS_WINDOWS
973 , &winerror
974#endif
975 ))
976 goto error;
977
Larry Hastingsb0827312014-02-09 22:05:19 -0800978 if (oserror_init(self, &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
Thomas Wouters477c8d52006-05-27 19:21:47 +0000985 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100986
987error:
988 Py_XDECREF(args);
989 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000990}
991
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000992static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200993OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000994{
995 Py_CLEAR(self->myerrno);
996 Py_CLEAR(self->strerror);
997 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -0800998 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200999#ifdef MS_WINDOWS
1000 Py_CLEAR(self->winerror);
1001#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001002 return BaseException_clear((PyBaseExceptionObject *)self);
1003}
1004
1005static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001006OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001007{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001008 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001009 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001010 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001011}
1012
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001013static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001014OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001015 void *arg)
1016{
1017 Py_VISIT(self->myerrno);
1018 Py_VISIT(self->strerror);
1019 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001020 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001021#ifdef MS_WINDOWS
1022 Py_VISIT(self->winerror);
1023#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001024 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1025}
1026
1027static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001028OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029{
Larry Hastingsb0827312014-02-09 22:05:19 -08001030#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001031#ifdef MS_WINDOWS
1032 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001033 if (self->winerror && self->filename) {
1034 if (self->filename2) {
1035 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1036 OR_NONE(self->winerror),
1037 OR_NONE(self->strerror),
1038 self->filename,
1039 self->filename2);
1040 } else {
1041 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1042 OR_NONE(self->winerror),
1043 OR_NONE(self->strerror),
1044 self->filename);
1045 }
1046 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001047 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001048 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001049 self->winerror ? self->winerror: Py_None,
1050 self->strerror ? self->strerror: Py_None);
1051#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001052 if (self->filename) {
1053 if (self->filename2) {
1054 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1055 OR_NONE(self->myerrno),
1056 OR_NONE(self->strerror),
1057 self->filename,
1058 self->filename2);
1059 } else {
1060 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1061 OR_NONE(self->myerrno),
1062 OR_NONE(self->strerror),
1063 self->filename);
1064 }
1065 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001066 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001067 return PyUnicode_FromFormat("[Errno %S] %S",
1068 self->myerrno ? self->myerrno: Py_None,
1069 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001070 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071}
1072
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001075{
1076 PyObject *args = self->args;
1077 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001078
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001081 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001082 Py_ssize_t size = self->filename2 ? 5 : 3;
1083 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001084 if (!args)
1085 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001086
1087 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001088 Py_INCREF(tmp);
1089 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001090
1091 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 Py_INCREF(tmp);
1093 PyTuple_SET_ITEM(args, 1, tmp);
1094
1095 Py_INCREF(self->filename);
1096 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001097
1098 if (self->filename2) {
1099 /*
1100 * This tuple is essentially used as OSError(*args).
1101 * So, to recreate filename2, we need to pass in
1102 * winerror as well.
1103 */
1104 Py_INCREF(Py_None);
1105 PyTuple_SET_ITEM(args, 3, Py_None);
1106
1107 /* filename2 */
1108 Py_INCREF(self->filename2);
1109 PyTuple_SET_ITEM(args, 4, self->filename2);
1110 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001111 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001112 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001113
1114 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001115 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001116 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001117 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001118 Py_DECREF(args);
1119 return res;
1120}
1121
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001122static PyObject *
1123OSError_written_get(PyOSErrorObject *self, void *context)
1124{
1125 if (self->written == -1) {
1126 PyErr_SetString(PyExc_AttributeError, "characters_written");
1127 return NULL;
1128 }
1129 return PyLong_FromSsize_t(self->written);
1130}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001132static int
1133OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1134{
1135 Py_ssize_t n;
1136 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1137 if (n == -1 && PyErr_Occurred())
1138 return -1;
1139 self->written = n;
1140 return 0;
1141}
1142
1143static PyMemberDef OSError_members[] = {
1144 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1145 PyDoc_STR("POSIX exception code")},
1146 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1147 PyDoc_STR("exception strerror")},
1148 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1149 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001150 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1151 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001152#ifdef MS_WINDOWS
1153 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1154 PyDoc_STR("Win32 exception code")},
1155#endif
1156 {NULL} /* Sentinel */
1157};
1158
1159static PyMethodDef OSError_methods[] = {
1160 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001161 {NULL}
1162};
1163
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001164static PyGetSetDef OSError_getset[] = {
1165 {"characters_written", (getter) OSError_written_get,
1166 (setter) OSError_written_set, NULL},
1167 {NULL}
1168};
1169
1170
1171ComplexExtendsException(PyExc_Exception, OSError,
1172 OSError, OSError_new,
1173 OSError_methods, OSError_members, OSError_getset,
1174 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001175 "Base class for I/O related errors.");
1176
1177
1178/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001179 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001180 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001181MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1182 "I/O operation would block.");
1183MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1184 "Connection error.");
1185MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1186 "Child process error.");
1187MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1188 "Broken pipe.");
1189MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1190 "Connection aborted.");
1191MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1192 "Connection refused.");
1193MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1194 "Connection reset.");
1195MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1196 "File already exists.");
1197MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1198 "File not found.");
1199MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1200 "Operation doesn't work on directories.");
1201MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1202 "Operation only works on directories.");
1203MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1204 "Interrupted by signal.");
1205MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1206 "Not enough permissions.");
1207MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1208 "Process not found.");
1209MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1210 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001211
1212/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001213 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001214 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001215SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001216 "Read beyond end of file.");
1217
1218
1219/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001220 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001221 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001222SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223 "Unspecified run-time error.");
1224
Yury Selivanovf488fb42015-07-03 01:04:23 -04001225/*
1226 * RecursionError extends RuntimeError
1227 */
1228SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1229 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001230
1231/*
1232 * NotImplementedError extends RuntimeError
1233 */
1234SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1235 "Method or function hasn't been implemented yet.");
1236
1237/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001238 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001239 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001240SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001241 "Name not found globally.");
1242
1243/*
1244 * UnboundLocalError extends NameError
1245 */
1246SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1247 "Local name referenced but not bound to a value.");
1248
1249/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001250 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001251 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001252SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001253 "Attribute not found.");
1254
1255
1256/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001257 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001258 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001260/* Helper function to customise error message for some syntax errors */
1261static int _report_missing_parentheses(PySyntaxErrorObject *self);
1262
Thomas Wouters477c8d52006-05-27 19:21:47 +00001263static int
1264SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1265{
1266 PyObject *info = NULL;
1267 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1268
1269 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1270 return -1;
1271
1272 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001273 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001274 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275 }
1276 if (lenargs == 2) {
1277 info = PyTuple_GET_ITEM(args, 1);
1278 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001279 if (!info)
1280 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001281
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001282 if (PyTuple_GET_SIZE(info) != 4) {
1283 /* not a very good error message, but it's what Python 2.4 gives */
1284 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1285 Py_DECREF(info);
1286 return -1;
1287 }
1288
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001289 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001290 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001291
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001292 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001293 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001294
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001295 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001296 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001297
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001298 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001299 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001300
1301 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001302
1303 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1304 if (self->text && PyUnicode_Check(self->text)) {
1305 if (_report_missing_parentheses(self) < 0) {
1306 return -1;
1307 }
1308 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001309 }
1310 return 0;
1311}
1312
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001313static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314SyntaxError_clear(PySyntaxErrorObject *self)
1315{
1316 Py_CLEAR(self->msg);
1317 Py_CLEAR(self->filename);
1318 Py_CLEAR(self->lineno);
1319 Py_CLEAR(self->offset);
1320 Py_CLEAR(self->text);
1321 Py_CLEAR(self->print_file_and_line);
1322 return BaseException_clear((PyBaseExceptionObject *)self);
1323}
1324
1325static void
1326SyntaxError_dealloc(PySyntaxErrorObject *self)
1327{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001328 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001329 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001330 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001331}
1332
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001333static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001334SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1335{
1336 Py_VISIT(self->msg);
1337 Py_VISIT(self->filename);
1338 Py_VISIT(self->lineno);
1339 Py_VISIT(self->offset);
1340 Py_VISIT(self->text);
1341 Py_VISIT(self->print_file_and_line);
1342 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1343}
1344
1345/* This is called "my_basename" instead of just "basename" to avoid name
1346 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1347 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001348static PyObject*
1349my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001350{
Victor Stinner6237daf2010-04-28 17:26:19 +00001351 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001352 int kind;
1353 void *data;
1354
1355 if (PyUnicode_READY(name))
1356 return NULL;
1357 kind = PyUnicode_KIND(name);
1358 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001359 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001360 offset = 0;
1361 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001362 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001363 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001364 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001365 if (offset != 0)
1366 return PyUnicode_Substring(name, offset, size);
1367 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001368 Py_INCREF(name);
1369 return name;
1370 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001371}
1372
1373
1374static PyObject *
1375SyntaxError_str(PySyntaxErrorObject *self)
1376{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001377 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001378 PyObject *filename;
1379 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001380 /* Below, we always ignore overflow errors, just printing -1.
1381 Still, we cannot allow an OverflowError to be raised, so
1382 we need to call PyLong_AsLongAndOverflow. */
1383 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001384
1385 /* XXX -- do all the additional formatting with filename and
1386 lineno here */
1387
Neal Norwitzed2b7392007-08-26 04:51:10 +00001388 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001389 filename = my_basename(self->filename);
1390 if (filename == NULL)
1391 return NULL;
1392 } else {
1393 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001394 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001395 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001396
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001397 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001398 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001399
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001400 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001401 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001402 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001403 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001405 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001406 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001407 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001408 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001409 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001410 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001411 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001412 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001413 Py_XDECREF(filename);
1414 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001415}
1416
1417static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001418 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1419 PyDoc_STR("exception msg")},
1420 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1421 PyDoc_STR("exception filename")},
1422 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1423 PyDoc_STR("exception lineno")},
1424 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1425 PyDoc_STR("exception offset")},
1426 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1427 PyDoc_STR("exception text")},
1428 {"print_file_and_line", T_OBJECT,
1429 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1430 PyDoc_STR("exception print_file_and_line")},
1431 {NULL} /* Sentinel */
1432};
1433
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001434ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001435 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001436 SyntaxError_str, "Invalid syntax.");
1437
1438
1439/*
1440 * IndentationError extends SyntaxError
1441 */
1442MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1443 "Improper indentation.");
1444
1445
1446/*
1447 * TabError extends IndentationError
1448 */
1449MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1450 "Improper mixture of spaces and tabs.");
1451
1452
1453/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001454 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001456SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001457 "Base class for lookup errors.");
1458
1459
1460/*
1461 * IndexError extends LookupError
1462 */
1463SimpleExtendsException(PyExc_LookupError, IndexError,
1464 "Sequence index out of range.");
1465
1466
1467/*
1468 * KeyError extends LookupError
1469 */
1470static PyObject *
1471KeyError_str(PyBaseExceptionObject *self)
1472{
1473 /* If args is a tuple of exactly one item, apply repr to args[0].
1474 This is done so that e.g. the exception raised by {}[''] prints
1475 KeyError: ''
1476 rather than the confusing
1477 KeyError
1478 alone. The downside is that if KeyError is raised with an explanatory
1479 string, that string will be displayed in quotes. Too bad.
1480 If args is anything else, use the default BaseException__str__().
1481 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001482 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001483 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001484 }
1485 return BaseException_str(self);
1486}
1487
1488ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001489 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001490
1491
1492/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001493 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001494 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001495SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496 "Inappropriate argument value (of correct type).");
1497
1498/*
1499 * UnicodeError extends ValueError
1500 */
1501
1502SimpleExtendsException(PyExc_ValueError, UnicodeError,
1503 "Unicode related error.");
1504
Thomas Wouters477c8d52006-05-27 19:21:47 +00001505static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001506get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001507{
1508 if (!attr) {
1509 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1510 return NULL;
1511 }
1512
Christian Heimes72b710a2008-05-26 13:28:38 +00001513 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001514 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1515 return NULL;
1516 }
1517 Py_INCREF(attr);
1518 return attr;
1519}
1520
1521static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001522get_unicode(PyObject *attr, const char *name)
1523{
1524 if (!attr) {
1525 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1526 return NULL;
1527 }
1528
1529 if (!PyUnicode_Check(attr)) {
1530 PyErr_Format(PyExc_TypeError,
1531 "%.200s attribute must be unicode", name);
1532 return NULL;
1533 }
1534 Py_INCREF(attr);
1535 return attr;
1536}
1537
Walter Dörwaldd2034312007-05-18 16:29:38 +00001538static int
1539set_unicodefromstring(PyObject **attr, const char *value)
1540{
1541 PyObject *obj = PyUnicode_FromString(value);
1542 if (!obj)
1543 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001544 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001545 return 0;
1546}
1547
Thomas Wouters477c8d52006-05-27 19:21:47 +00001548PyObject *
1549PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1550{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001551 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001552}
1553
1554PyObject *
1555PyUnicodeDecodeError_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 *
1561PyUnicodeEncodeError_GetObject(PyObject *exc)
1562{
1563 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1564}
1565
1566PyObject *
1567PyUnicodeDecodeError_GetObject(PyObject *exc)
1568{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001569 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001570}
1571
1572PyObject *
1573PyUnicodeTranslateError_GetObject(PyObject *exc)
1574{
1575 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1576}
1577
1578int
1579PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1580{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001581 Py_ssize_t size;
1582 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1583 "object");
1584 if (!obj)
1585 return -1;
1586 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001587 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001588 if (*start<0)
1589 *start = 0; /*XXX check for values <0*/
1590 if (*start>=size)
1591 *start = size-1;
1592 Py_DECREF(obj);
1593 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001594}
1595
1596
1597int
1598PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1599{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001600 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001601 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001602 if (!obj)
1603 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001604 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001605 *start = ((PyUnicodeErrorObject *)exc)->start;
1606 if (*start<0)
1607 *start = 0;
1608 if (*start>=size)
1609 *start = size-1;
1610 Py_DECREF(obj);
1611 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001612}
1613
1614
1615int
1616PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1617{
1618 return PyUnicodeEncodeError_GetStart(exc, start);
1619}
1620
1621
1622int
1623PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1624{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001625 ((PyUnicodeErrorObject *)exc)->start = start;
1626 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001627}
1628
1629
1630int
1631PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1632{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001633 ((PyUnicodeErrorObject *)exc)->start = start;
1634 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001635}
1636
1637
1638int
1639PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1640{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001641 ((PyUnicodeErrorObject *)exc)->start = start;
1642 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643}
1644
1645
1646int
1647PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1648{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001649 Py_ssize_t size;
1650 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1651 "object");
1652 if (!obj)
1653 return -1;
1654 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001655 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001656 if (*end<1)
1657 *end = 1;
1658 if (*end>size)
1659 *end = size;
1660 Py_DECREF(obj);
1661 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001662}
1663
1664
1665int
1666PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1667{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001668 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001669 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001670 if (!obj)
1671 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001672 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001673 *end = ((PyUnicodeErrorObject *)exc)->end;
1674 if (*end<1)
1675 *end = 1;
1676 if (*end>size)
1677 *end = size;
1678 Py_DECREF(obj);
1679 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001680}
1681
1682
1683int
1684PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1685{
1686 return PyUnicodeEncodeError_GetEnd(exc, start);
1687}
1688
1689
1690int
1691PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1692{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001693 ((PyUnicodeErrorObject *)exc)->end = end;
1694 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001695}
1696
1697
1698int
1699PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1700{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001701 ((PyUnicodeErrorObject *)exc)->end = end;
1702 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001703}
1704
1705
1706int
1707PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1708{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001709 ((PyUnicodeErrorObject *)exc)->end = end;
1710 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711}
1712
1713PyObject *
1714PyUnicodeEncodeError_GetReason(PyObject *exc)
1715{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001716 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001717}
1718
1719
1720PyObject *
1721PyUnicodeDecodeError_GetReason(PyObject *exc)
1722{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001723 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001724}
1725
1726
1727PyObject *
1728PyUnicodeTranslateError_GetReason(PyObject *exc)
1729{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001730 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001731}
1732
1733
1734int
1735PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1736{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001737 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1738 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001739}
1740
1741
1742int
1743PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1744{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001745 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1746 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001747}
1748
1749
1750int
1751PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1752{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001753 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1754 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001755}
1756
1757
Thomas Wouters477c8d52006-05-27 19:21:47 +00001758static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759UnicodeError_clear(PyUnicodeErrorObject *self)
1760{
1761 Py_CLEAR(self->encoding);
1762 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763 Py_CLEAR(self->reason);
1764 return BaseException_clear((PyBaseExceptionObject *)self);
1765}
1766
1767static void
1768UnicodeError_dealloc(PyUnicodeErrorObject *self)
1769{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001770 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001771 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001772 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773}
1774
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001775static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1777{
1778 Py_VISIT(self->encoding);
1779 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780 Py_VISIT(self->reason);
1781 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1782}
1783
1784static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001785 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1786 PyDoc_STR("exception encoding")},
1787 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1788 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001789 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001790 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001791 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001792 PyDoc_STR("exception end")},
1793 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1794 PyDoc_STR("exception reason")},
1795 {NULL} /* Sentinel */
1796};
1797
1798
1799/*
1800 * UnicodeEncodeError extends UnicodeError
1801 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802
1803static int
1804UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1805{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001806 PyUnicodeErrorObject *err;
1807
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1809 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001810
1811 err = (PyUnicodeErrorObject *)self;
1812
1813 Py_CLEAR(err->encoding);
1814 Py_CLEAR(err->object);
1815 Py_CLEAR(err->reason);
1816
1817 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1818 &PyUnicode_Type, &err->encoding,
1819 &PyUnicode_Type, &err->object,
1820 &err->start,
1821 &err->end,
1822 &PyUnicode_Type, &err->reason)) {
1823 err->encoding = err->object = err->reason = NULL;
1824 return -1;
1825 }
1826
Martin v. Löwisb09af032011-11-04 11:16:41 +01001827 if (PyUnicode_READY(err->object) < -1) {
1828 err->encoding = NULL;
1829 return -1;
1830 }
1831
Guido van Rossum98297ee2007-11-06 21:34:58 +00001832 Py_INCREF(err->encoding);
1833 Py_INCREF(err->object);
1834 Py_INCREF(err->reason);
1835
1836 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837}
1838
1839static PyObject *
1840UnicodeEncodeError_str(PyObject *self)
1841{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001842 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001843 PyObject *result = NULL;
1844 PyObject *reason_str = NULL;
1845 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001847 if (!uself->object)
1848 /* Not properly initialized. */
1849 return PyUnicode_FromString("");
1850
Eric Smith0facd772010-02-24 15:42:29 +00001851 /* Get reason and encoding as strings, which they might not be if
1852 they've been modified after we were contructed. */
1853 reason_str = PyObject_Str(uself->reason);
1854 if (reason_str == NULL)
1855 goto done;
1856 encoding_str = PyObject_Str(uself->encoding);
1857 if (encoding_str == NULL)
1858 goto done;
1859
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001860 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1861 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001862 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001863 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001864 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001865 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001866 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001867 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001868 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001869 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001870 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001871 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001872 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001873 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001874 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001875 }
Eric Smith0facd772010-02-24 15:42:29 +00001876 else {
1877 result = PyUnicode_FromFormat(
1878 "'%U' codec can't encode characters in position %zd-%zd: %U",
1879 encoding_str,
1880 uself->start,
1881 uself->end-1,
1882 reason_str);
1883 }
1884done:
1885 Py_XDECREF(reason_str);
1886 Py_XDECREF(encoding_str);
1887 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001888}
1889
1890static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001891 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001892 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893 sizeof(PyUnicodeErrorObject), 0,
1894 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1895 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1896 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001897 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1898 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001900 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001901};
1902PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1903
1904PyObject *
1905PyUnicodeEncodeError_Create(
1906 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1907 Py_ssize_t start, Py_ssize_t end, const char *reason)
1908{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001909 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001910 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001911}
1912
1913
1914/*
1915 * UnicodeDecodeError extends UnicodeError
1916 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001917
1918static int
1919UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1920{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001921 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001922
Thomas Wouters477c8d52006-05-27 19:21:47 +00001923 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1924 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001925
1926 ude = (PyUnicodeErrorObject *)self;
1927
1928 Py_CLEAR(ude->encoding);
1929 Py_CLEAR(ude->object);
1930 Py_CLEAR(ude->reason);
1931
1932 if (!PyArg_ParseTuple(args, "O!OnnO!",
1933 &PyUnicode_Type, &ude->encoding,
1934 &ude->object,
1935 &ude->start,
1936 &ude->end,
1937 &PyUnicode_Type, &ude->reason)) {
1938 ude->encoding = ude->object = ude->reason = NULL;
1939 return -1;
1940 }
1941
Guido van Rossum98297ee2007-11-06 21:34:58 +00001942 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001943 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001944 Py_INCREF(ude->reason);
1945
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001946 if (!PyBytes_Check(ude->object)) {
1947 Py_buffer view;
1948 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1949 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001950 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001951 PyBuffer_Release(&view);
1952 if (!ude->object)
1953 goto error;
1954 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001955 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001956
1957error:
1958 Py_CLEAR(ude->encoding);
1959 Py_CLEAR(ude->object);
1960 Py_CLEAR(ude->reason);
1961 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962}
1963
1964static PyObject *
1965UnicodeDecodeError_str(PyObject *self)
1966{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001967 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001968 PyObject *result = NULL;
1969 PyObject *reason_str = NULL;
1970 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001971
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001972 if (!uself->object)
1973 /* Not properly initialized. */
1974 return PyUnicode_FromString("");
1975
Eric Smith0facd772010-02-24 15:42:29 +00001976 /* Get reason and encoding as strings, which they might not be if
1977 they've been modified after we were contructed. */
1978 reason_str = PyObject_Str(uself->reason);
1979 if (reason_str == NULL)
1980 goto done;
1981 encoding_str = PyObject_Str(uself->encoding);
1982 if (encoding_str == NULL)
1983 goto done;
1984
1985 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001986 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001987 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001988 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001989 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001990 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001991 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001992 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993 }
Eric Smith0facd772010-02-24 15:42:29 +00001994 else {
1995 result = PyUnicode_FromFormat(
1996 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1997 encoding_str,
1998 uself->start,
1999 uself->end-1,
2000 reason_str
2001 );
2002 }
2003done:
2004 Py_XDECREF(reason_str);
2005 Py_XDECREF(encoding_str);
2006 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002007}
2008
2009static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002010 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002011 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002012 sizeof(PyUnicodeErrorObject), 0,
2013 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2014 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2015 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002016 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2017 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002018 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002019 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002020};
2021PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2022
2023PyObject *
2024PyUnicodeDecodeError_Create(
2025 const char *encoding, const char *object, Py_ssize_t length,
2026 Py_ssize_t start, Py_ssize_t end, const char *reason)
2027{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002028 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002029 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002030}
2031
2032
2033/*
2034 * UnicodeTranslateError extends UnicodeError
2035 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002036
2037static int
2038UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2039 PyObject *kwds)
2040{
2041 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2042 return -1;
2043
2044 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002045 Py_CLEAR(self->reason);
2046
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002047 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002048 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002049 &self->start,
2050 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00002051 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002052 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002053 return -1;
2054 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002055
Thomas Wouters477c8d52006-05-27 19:21:47 +00002056 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002057 Py_INCREF(self->reason);
2058
2059 return 0;
2060}
2061
2062
2063static PyObject *
2064UnicodeTranslateError_str(PyObject *self)
2065{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002066 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002067 PyObject *result = NULL;
2068 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002069
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002070 if (!uself->object)
2071 /* Not properly initialized. */
2072 return PyUnicode_FromString("");
2073
Eric Smith0facd772010-02-24 15:42:29 +00002074 /* Get reason as a string, which it might not be if it's been
2075 modified after we were contructed. */
2076 reason_str = PyObject_Str(uself->reason);
2077 if (reason_str == NULL)
2078 goto done;
2079
Victor Stinner53b33e72011-11-21 01:17:27 +01002080 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2081 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002082 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002083 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002084 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002085 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002086 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002087 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002088 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002089 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002090 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002091 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002092 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002093 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002094 );
Eric Smith0facd772010-02-24 15:42:29 +00002095 } else {
2096 result = PyUnicode_FromFormat(
2097 "can't translate characters in position %zd-%zd: %U",
2098 uself->start,
2099 uself->end-1,
2100 reason_str
2101 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002102 }
Eric Smith0facd772010-02-24 15:42:29 +00002103done:
2104 Py_XDECREF(reason_str);
2105 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106}
2107
2108static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002109 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002110 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002111 sizeof(PyUnicodeErrorObject), 0,
2112 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2113 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2114 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002115 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002116 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2117 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002118 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002119};
2120PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2121
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002122/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002123PyObject *
2124PyUnicodeTranslateError_Create(
2125 const Py_UNICODE *object, Py_ssize_t length,
2126 Py_ssize_t start, Py_ssize_t end, const char *reason)
2127{
2128 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002129 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002130}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002131
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002132PyObject *
2133_PyUnicodeTranslateError_Create(
2134 PyObject *object,
2135 Py_ssize_t start, Py_ssize_t end, const char *reason)
2136{
Victor Stinner69598d42014-04-04 20:59:44 +02002137 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002138 object, start, end, reason);
2139}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002140
2141/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002142 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002143 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002144SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002145 "Assertion failed.");
2146
2147
2148/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002149 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002150 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002151SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002152 "Base class for arithmetic errors.");
2153
2154
2155/*
2156 * FloatingPointError extends ArithmeticError
2157 */
2158SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2159 "Floating point operation failed.");
2160
2161
2162/*
2163 * OverflowError extends ArithmeticError
2164 */
2165SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2166 "Result too large to be represented.");
2167
2168
2169/*
2170 * ZeroDivisionError extends ArithmeticError
2171 */
2172SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2173 "Second argument to a division or modulo operation was zero.");
2174
2175
2176/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002177 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002178 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002179SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002180 "Internal error in the Python interpreter.\n"
2181 "\n"
2182 "Please report this to the Python maintainer, along with the traceback,\n"
2183 "the Python version, and the hardware/OS platform and version.");
2184
2185
2186/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002187 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002189SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002190 "Weak ref proxy used after referent went away.");
2191
2192
2193/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002194 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002196
2197#define MEMERRORS_SAVE 16
2198static PyBaseExceptionObject *memerrors_freelist = NULL;
2199static int memerrors_numfree = 0;
2200
2201static PyObject *
2202MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2203{
2204 PyBaseExceptionObject *self;
2205
2206 if (type != (PyTypeObject *) PyExc_MemoryError)
2207 return BaseException_new(type, args, kwds);
2208 if (memerrors_freelist == NULL)
2209 return BaseException_new(type, args, kwds);
2210 /* Fetch object from freelist and revive it */
2211 self = memerrors_freelist;
2212 self->args = PyTuple_New(0);
2213 /* This shouldn't happen since the empty tuple is persistent */
2214 if (self->args == NULL)
2215 return NULL;
2216 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2217 memerrors_numfree--;
2218 self->dict = NULL;
2219 _Py_NewReference((PyObject *)self);
2220 _PyObject_GC_TRACK(self);
2221 return (PyObject *)self;
2222}
2223
2224static void
2225MemoryError_dealloc(PyBaseExceptionObject *self)
2226{
2227 _PyObject_GC_UNTRACK(self);
2228 BaseException_clear(self);
2229 if (memerrors_numfree >= MEMERRORS_SAVE)
2230 Py_TYPE(self)->tp_free((PyObject *)self);
2231 else {
2232 self->dict = (PyObject *) memerrors_freelist;
2233 memerrors_freelist = self;
2234 memerrors_numfree++;
2235 }
2236}
2237
2238static void
2239preallocate_memerrors(void)
2240{
2241 /* We create enough MemoryErrors and then decref them, which will fill
2242 up the freelist. */
2243 int i;
2244 PyObject *errors[MEMERRORS_SAVE];
2245 for (i = 0; i < MEMERRORS_SAVE; i++) {
2246 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2247 NULL, NULL);
2248 if (!errors[i])
2249 Py_FatalError("Could not preallocate MemoryError object");
2250 }
2251 for (i = 0; i < MEMERRORS_SAVE; i++) {
2252 Py_DECREF(errors[i]);
2253 }
2254}
2255
2256static void
2257free_preallocated_memerrors(void)
2258{
2259 while (memerrors_freelist != NULL) {
2260 PyObject *self = (PyObject *) memerrors_freelist;
2261 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2262 Py_TYPE(self)->tp_free((PyObject *)self);
2263 }
2264}
2265
2266
2267static PyTypeObject _PyExc_MemoryError = {
2268 PyVarObject_HEAD_INIT(NULL, 0)
2269 "MemoryError",
2270 sizeof(PyBaseExceptionObject),
2271 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2272 0, 0, 0, 0, 0, 0, 0,
2273 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2274 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2275 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2276 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2277 (initproc)BaseException_init, 0, MemoryError_new
2278};
2279PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2280
Thomas Wouters477c8d52006-05-27 19:21:47 +00002281
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002282/*
2283 * BufferError extends Exception
2284 */
2285SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2286
Thomas Wouters477c8d52006-05-27 19:21:47 +00002287
2288/* Warning category docstrings */
2289
2290/*
2291 * Warning extends Exception
2292 */
2293SimpleExtendsException(PyExc_Exception, Warning,
2294 "Base class for warning categories.");
2295
2296
2297/*
2298 * UserWarning extends Warning
2299 */
2300SimpleExtendsException(PyExc_Warning, UserWarning,
2301 "Base class for warnings generated by user code.");
2302
2303
2304/*
2305 * DeprecationWarning extends Warning
2306 */
2307SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2308 "Base class for warnings about deprecated features.");
2309
2310
2311/*
2312 * PendingDeprecationWarning extends Warning
2313 */
2314SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2315 "Base class for warnings about features which will be deprecated\n"
2316 "in the future.");
2317
2318
2319/*
2320 * SyntaxWarning extends Warning
2321 */
2322SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2323 "Base class for warnings about dubious syntax.");
2324
2325
2326/*
2327 * RuntimeWarning extends Warning
2328 */
2329SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2330 "Base class for warnings about dubious runtime behavior.");
2331
2332
2333/*
2334 * FutureWarning extends Warning
2335 */
2336SimpleExtendsException(PyExc_Warning, FutureWarning,
2337 "Base class for warnings about constructs that will change semantically\n"
2338 "in the future.");
2339
2340
2341/*
2342 * ImportWarning extends Warning
2343 */
2344SimpleExtendsException(PyExc_Warning, ImportWarning,
2345 "Base class for warnings about probable mistakes in module imports");
2346
2347
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002348/*
2349 * UnicodeWarning extends Warning
2350 */
2351SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2352 "Base class for warnings about Unicode related problems, mostly\n"
2353 "related to conversion problems.");
2354
Georg Brandl08be72d2010-10-24 15:11:22 +00002355
Guido van Rossum98297ee2007-11-06 21:34:58 +00002356/*
2357 * BytesWarning extends Warning
2358 */
2359SimpleExtendsException(PyExc_Warning, BytesWarning,
2360 "Base class for warnings about bytes and buffer related problems, mostly\n"
2361 "related to conversion from str or comparing to str.");
2362
2363
Georg Brandl08be72d2010-10-24 15:11:22 +00002364/*
2365 * ResourceWarning extends Warning
2366 */
2367SimpleExtendsException(PyExc_Warning, ResourceWarning,
2368 "Base class for warnings about resource usage.");
2369
2370
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002371
Yury Selivanovf488fb42015-07-03 01:04:23 -04002372/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002373 Meant to be used when normalizing the exception for exceeding the recursion
2374 depth will cause its own infinite recursion.
2375*/
2376PyObject *PyExc_RecursionErrorInst = NULL;
2377
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002378#define PRE_INIT(TYPE) \
2379 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2380 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2381 Py_FatalError("exceptions bootstrapping error."); \
2382 Py_INCREF(PyExc_ ## TYPE); \
2383 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002385#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002386 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2387 Py_FatalError("Module dictionary insertion problem.");
2388
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002389#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002390 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002391 PyExc_ ## NAME = PyExc_ ## TYPE; \
2392 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2393 Py_FatalError("Module dictionary insertion problem.");
2394
2395#define ADD_ERRNO(TYPE, CODE) { \
2396 PyObject *_code = PyLong_FromLong(CODE); \
2397 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2398 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2399 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002400 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002401 }
2402
2403#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002404#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002405/* The following constants were added to errno.h in VS2010 but have
2406 preferred WSA equivalents. */
2407#undef EADDRINUSE
2408#undef EADDRNOTAVAIL
2409#undef EAFNOSUPPORT
2410#undef EALREADY
2411#undef ECONNABORTED
2412#undef ECONNREFUSED
2413#undef ECONNRESET
2414#undef EDESTADDRREQ
2415#undef EHOSTUNREACH
2416#undef EINPROGRESS
2417#undef EISCONN
2418#undef ELOOP
2419#undef EMSGSIZE
2420#undef ENETDOWN
2421#undef ENETRESET
2422#undef ENETUNREACH
2423#undef ENOBUFS
2424#undef ENOPROTOOPT
2425#undef ENOTCONN
2426#undef ENOTSOCK
2427#undef EOPNOTSUPP
2428#undef EPROTONOSUPPORT
2429#undef EPROTOTYPE
2430#undef ETIMEDOUT
2431#undef EWOULDBLOCK
2432
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002433#if defined(WSAEALREADY) && !defined(EALREADY)
2434#define EALREADY WSAEALREADY
2435#endif
2436#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2437#define ECONNABORTED WSAECONNABORTED
2438#endif
2439#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2440#define ECONNREFUSED WSAECONNREFUSED
2441#endif
2442#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2443#define ECONNRESET WSAECONNRESET
2444#endif
2445#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2446#define EINPROGRESS WSAEINPROGRESS
2447#endif
2448#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2449#define ESHUTDOWN WSAESHUTDOWN
2450#endif
2451#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2452#define ETIMEDOUT WSAETIMEDOUT
2453#endif
2454#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2455#define EWOULDBLOCK WSAEWOULDBLOCK
2456#endif
2457#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002458
Martin v. Löwis1a214512008-06-11 05:26:20 +00002459void
Brett Cannonfd074152012-04-14 14:10:13 -04002460_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461{
Brett Cannonfd074152012-04-14 14:10:13 -04002462 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002463
2464 PRE_INIT(BaseException)
2465 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002466 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002467 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002468 PRE_INIT(StopIteration)
2469 PRE_INIT(GeneratorExit)
2470 PRE_INIT(SystemExit)
2471 PRE_INIT(KeyboardInterrupt)
2472 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002473 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002474 PRE_INIT(EOFError)
2475 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002476 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002477 PRE_INIT(NotImplementedError)
2478 PRE_INIT(NameError)
2479 PRE_INIT(UnboundLocalError)
2480 PRE_INIT(AttributeError)
2481 PRE_INIT(SyntaxError)
2482 PRE_INIT(IndentationError)
2483 PRE_INIT(TabError)
2484 PRE_INIT(LookupError)
2485 PRE_INIT(IndexError)
2486 PRE_INIT(KeyError)
2487 PRE_INIT(ValueError)
2488 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002489 PRE_INIT(UnicodeEncodeError)
2490 PRE_INIT(UnicodeDecodeError)
2491 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492 PRE_INIT(AssertionError)
2493 PRE_INIT(ArithmeticError)
2494 PRE_INIT(FloatingPointError)
2495 PRE_INIT(OverflowError)
2496 PRE_INIT(ZeroDivisionError)
2497 PRE_INIT(SystemError)
2498 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002499 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002501 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002502 PRE_INIT(Warning)
2503 PRE_INIT(UserWarning)
2504 PRE_INIT(DeprecationWarning)
2505 PRE_INIT(PendingDeprecationWarning)
2506 PRE_INIT(SyntaxWarning)
2507 PRE_INIT(RuntimeWarning)
2508 PRE_INIT(FutureWarning)
2509 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002510 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002511 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002512 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002514 /* OSError subclasses */
2515 PRE_INIT(ConnectionError);
2516
2517 PRE_INIT(BlockingIOError);
2518 PRE_INIT(BrokenPipeError);
2519 PRE_INIT(ChildProcessError);
2520 PRE_INIT(ConnectionAbortedError);
2521 PRE_INIT(ConnectionRefusedError);
2522 PRE_INIT(ConnectionResetError);
2523 PRE_INIT(FileExistsError);
2524 PRE_INIT(FileNotFoundError);
2525 PRE_INIT(IsADirectoryError);
2526 PRE_INIT(NotADirectoryError);
2527 PRE_INIT(InterruptedError);
2528 PRE_INIT(PermissionError);
2529 PRE_INIT(ProcessLookupError);
2530 PRE_INIT(TimeoutError);
2531
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 bdict = PyModule_GetDict(bltinmod);
2533 if (bdict == NULL)
2534 Py_FatalError("exceptions bootstrapping error.");
2535
2536 POST_INIT(BaseException)
2537 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002539 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540 POST_INIT(StopIteration)
2541 POST_INIT(GeneratorExit)
2542 POST_INIT(SystemExit)
2543 POST_INIT(KeyboardInterrupt)
2544 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002545 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002546 INIT_ALIAS(EnvironmentError, OSError)
2547 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002548#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002549 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002550#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002551 POST_INIT(EOFError)
2552 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002553 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002554 POST_INIT(NotImplementedError)
2555 POST_INIT(NameError)
2556 POST_INIT(UnboundLocalError)
2557 POST_INIT(AttributeError)
2558 POST_INIT(SyntaxError)
2559 POST_INIT(IndentationError)
2560 POST_INIT(TabError)
2561 POST_INIT(LookupError)
2562 POST_INIT(IndexError)
2563 POST_INIT(KeyError)
2564 POST_INIT(ValueError)
2565 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002566 POST_INIT(UnicodeEncodeError)
2567 POST_INIT(UnicodeDecodeError)
2568 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002569 POST_INIT(AssertionError)
2570 POST_INIT(ArithmeticError)
2571 POST_INIT(FloatingPointError)
2572 POST_INIT(OverflowError)
2573 POST_INIT(ZeroDivisionError)
2574 POST_INIT(SystemError)
2575 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002576 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002577 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002578 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579 POST_INIT(Warning)
2580 POST_INIT(UserWarning)
2581 POST_INIT(DeprecationWarning)
2582 POST_INIT(PendingDeprecationWarning)
2583 POST_INIT(SyntaxWarning)
2584 POST_INIT(RuntimeWarning)
2585 POST_INIT(FutureWarning)
2586 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002587 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002588 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002589 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590
Antoine Pitrouac456a12012-01-18 21:35:21 +01002591 if (!errnomap) {
2592 errnomap = PyDict_New();
2593 if (!errnomap)
2594 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2595 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002596
2597 /* OSError subclasses */
2598 POST_INIT(ConnectionError);
2599
2600 POST_INIT(BlockingIOError);
2601 ADD_ERRNO(BlockingIOError, EAGAIN);
2602 ADD_ERRNO(BlockingIOError, EALREADY);
2603 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2604 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2605 POST_INIT(BrokenPipeError);
2606 ADD_ERRNO(BrokenPipeError, EPIPE);
2607 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2608 POST_INIT(ChildProcessError);
2609 ADD_ERRNO(ChildProcessError, ECHILD);
2610 POST_INIT(ConnectionAbortedError);
2611 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2612 POST_INIT(ConnectionRefusedError);
2613 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2614 POST_INIT(ConnectionResetError);
2615 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2616 POST_INIT(FileExistsError);
2617 ADD_ERRNO(FileExistsError, EEXIST);
2618 POST_INIT(FileNotFoundError);
2619 ADD_ERRNO(FileNotFoundError, ENOENT);
2620 POST_INIT(IsADirectoryError);
2621 ADD_ERRNO(IsADirectoryError, EISDIR);
2622 POST_INIT(NotADirectoryError);
2623 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2624 POST_INIT(InterruptedError);
2625 ADD_ERRNO(InterruptedError, EINTR);
2626 POST_INIT(PermissionError);
2627 ADD_ERRNO(PermissionError, EACCES);
2628 ADD_ERRNO(PermissionError, EPERM);
2629 POST_INIT(ProcessLookupError);
2630 ADD_ERRNO(ProcessLookupError, ESRCH);
2631 POST_INIT(TimeoutError);
2632 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2633
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002634 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002635
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002636 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002637 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002638 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002639 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002640 "recursion errors");
2641 else {
2642 PyBaseExceptionObject *err_inst =
2643 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2644 PyObject *args_tuple;
2645 PyObject *exc_message;
2646 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2647 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002648 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002649 "pre-allocation");
2650 args_tuple = PyTuple_Pack(1, exc_message);
2651 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002652 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002653 "pre-allocation");
2654 Py_DECREF(exc_message);
2655 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002656 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002657 Py_DECREF(args_tuple);
2658 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002659 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002660}
2661
2662void
2663_PyExc_Fini(void)
2664{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002665 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002666 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002667 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002668}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002669
2670/* Helper to do the equivalent of "raise X from Y" in C, but always using
2671 * the current exception rather than passing one in.
2672 *
2673 * We currently limit this to *only* exceptions that use the BaseException
2674 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2675 * those correctly without losing data and without losing backwards
2676 * compatibility.
2677 *
2678 * We also aim to rule out *all* exceptions that might be storing additional
2679 * state, whether by having a size difference relative to BaseException,
2680 * additional arguments passed in during construction or by having a
2681 * non-empty instance dict.
2682 *
2683 * We need to be very careful with what we wrap, since changing types to
2684 * a broader exception type would be backwards incompatible for
2685 * existing codecs, and with different init or new method implementations
2686 * may either not support instantiation with PyErr_Format or lose
2687 * information when instantiated that way.
2688 *
2689 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2690 * fact that exceptions are expected to support pickling. If more builtin
2691 * exceptions (e.g. AttributeError) start to be converted to rich
2692 * exceptions with additional attributes, that's probably a better approach
2693 * to pursue over adding special cases for particular stateful subclasses.
2694 *
2695 * Returns a borrowed reference to the new exception (if any), NULL if the
2696 * existing exception was left in place.
2697 */
2698PyObject *
2699_PyErr_TrySetFromCause(const char *format, ...)
2700{
2701 PyObject* msg_prefix;
2702 PyObject *exc, *val, *tb;
2703 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002704 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002705 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002706 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002707 PyObject *new_exc, *new_val, *new_tb;
2708 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002709 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002710
Nick Coghlan8b097b42013-11-13 23:49:21 +10002711 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002712 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002713 /* Ensure type info indicates no extra state is stored at the C level
2714 * and that the type can be reinstantiated using PyErr_Format
2715 */
2716 caught_type_size = caught_type->tp_basicsize;
2717 base_exc_size = _PyExc_BaseException.tp_basicsize;
2718 same_basic_size = (
2719 caught_type_size == base_exc_size ||
2720 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002721 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002722 )
2723 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002724 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002725 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002726 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002727 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002728 /* We can't be sure we can wrap this safely, since it may contain
2729 * more state than just the exception type. Accordingly, we just
2730 * leave it alone.
2731 */
2732 PyErr_Restore(exc, val, tb);
2733 return NULL;
2734 }
2735
2736 /* Check the args are empty or contain a single string */
2737 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002738 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002739 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002740 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002741 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002742 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002743 /* More than 1 arg, or the one arg we do have isn't a string
2744 */
2745 PyErr_Restore(exc, val, tb);
2746 return NULL;
2747 }
2748
2749 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002750 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002751 if (dictptr != NULL && *dictptr != NULL &&
2752 PyObject_Length(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002753 /* While we could potentially copy a non-empty instance dictionary
2754 * to the replacement exception, for now we take the more
2755 * conservative path of leaving exceptions with attributes set
2756 * alone.
2757 */
2758 PyErr_Restore(exc, val, tb);
2759 return NULL;
2760 }
2761
2762 /* For exceptions that we can wrap safely, we chain the original
2763 * exception to a new one of the exact same type with an
2764 * error message that mentions the additional details and the
2765 * original exception.
2766 *
2767 * It would be nice to wrap OSError and various other exception
2768 * types as well, but that's quite a bit trickier due to the extra
2769 * state potentially stored on OSError instances.
2770 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002771 /* Ensure the traceback is set correctly on the existing exception */
2772 if (tb != NULL) {
2773 PyException_SetTraceback(val, tb);
2774 Py_DECREF(tb);
2775 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002776
Christian Heimes507eabd2013-11-14 01:39:35 +01002777#ifdef HAVE_STDARG_PROTOTYPES
2778 va_start(vargs, format);
2779#else
2780 va_start(vargs);
2781#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002782 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002783 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002784 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002785 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002786 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002787 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002788 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002789
2790 PyErr_Format(exc, "%U (%s: %S)",
2791 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002792 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002793 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002794 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2795 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2796 PyException_SetCause(new_val, val);
2797 PyErr_Restore(new_exc, new_val, new_tb);
2798 return new_val;
2799}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002800
2801
2802/* To help with migration from Python 2, SyntaxError.__init__ applies some
2803 * heuristics to try to report a more meaningful exception when print and
2804 * exec are used like statements.
2805 *
2806 * The heuristics are currently expected to detect the following cases:
2807 * - top level statement
2808 * - statement in a nested suite
2809 * - trailing section of a one line complex statement
2810 *
2811 * They're currently known not to trigger:
2812 * - after a semi-colon
2813 *
2814 * The error message can be a bit odd in cases where the "arguments" are
2815 * completely illegal syntactically, but that isn't worth the hassle of
2816 * fixing.
2817 *
2818 * We also can't do anything about cases that are legal Python 3 syntax
2819 * but mean something entirely different from what they did in Python 2
2820 * (omitting the arguments entirely, printing items preceded by a unary plus
2821 * or minus, using the stream redirection syntax).
2822 */
2823
2824static int
2825_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2826{
2827 /* Return values:
2828 * -1: an error occurred
2829 * 0: nothing happened
2830 * 1: the check triggered & the error message was changed
2831 */
2832 static PyObject *print_prefix = NULL;
2833 static PyObject *exec_prefix = NULL;
2834 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2835 int kind = PyUnicode_KIND(self->text);
2836 void *data = PyUnicode_DATA(self->text);
2837
2838 /* Ignore leading whitespace */
2839 while (start < text_len) {
2840 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2841 if (!Py_UNICODE_ISSPACE(ch))
2842 break;
2843 start++;
2844 }
2845 /* Checking against an empty or whitespace-only part of the string */
2846 if (start == text_len) {
2847 return 0;
2848 }
2849
2850 /* Check for legacy print statements */
2851 if (print_prefix == NULL) {
2852 print_prefix = PyUnicode_InternFromString("print ");
2853 if (print_prefix == NULL) {
2854 return -1;
2855 }
2856 }
2857 if (PyUnicode_Tailmatch(self->text, print_prefix,
2858 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002859 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002860 PyUnicode_FromString("Missing parentheses in call to 'print'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002861 return 1;
2862 }
2863
2864 /* Check for legacy exec statements */
2865 if (exec_prefix == NULL) {
2866 exec_prefix = PyUnicode_InternFromString("exec ");
2867 if (exec_prefix == NULL) {
2868 return -1;
2869 }
2870 }
2871 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2872 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002873 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002874 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002875 return 1;
2876 }
2877 /* Fall back to the default error message */
2878 return 0;
2879}
2880
2881static int
2882_report_missing_parentheses(PySyntaxErrorObject *self)
2883{
2884 Py_UCS4 left_paren = 40;
2885 Py_ssize_t left_paren_index;
2886 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2887 int legacy_check_result = 0;
2888
2889 /* Skip entirely if there is an opening parenthesis */
2890 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2891 0, text_len, 1);
2892 if (left_paren_index < -1) {
2893 return -1;
2894 }
2895 if (left_paren_index != -1) {
2896 /* Use default error message for any line with an opening paren */
2897 return 0;
2898 }
2899 /* Handle the simple statement case */
2900 legacy_check_result = _check_for_legacy_statements(self, 0);
2901 if (legacy_check_result < 0) {
2902 return -1;
2903
2904 }
2905 if (legacy_check_result == 0) {
2906 /* Handle the one-line complex statement case */
2907 Py_UCS4 colon = 58;
2908 Py_ssize_t colon_index;
2909 colon_index = PyUnicode_FindChar(self->text, colon,
2910 0, text_len, 1);
2911 if (colon_index < -1) {
2912 return -1;
2913 }
2914 if (colon_index >= 0 && colon_index < text_len) {
2915 /* Check again, starting from just after the colon */
2916 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2917 return -1;
2918 }
2919 }
2920 }
2921 return 0;
2922}