blob: f63f06a145bcb151944e8e0dccc9d8b89f1c2ab2 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020019
20/* The dict map from errno codes to OSError subclasses */
21static PyObject *errnomap = NULL;
22
23
Thomas Wouters477c8d52006-05-27 19:21:47 +000024/* NOTE: If the exception class hierarchy changes, don't forget to update
25 * Lib/test/exception_hierarchy.txt
26 */
27
Thomas Wouters477c8d52006-05-27 19:21:47 +000028/*
29 * BaseException
30 */
31static PyObject *
32BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
33{
34 PyBaseExceptionObject *self;
35
36 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 if (!self)
38 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000039 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000040 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000041 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070042 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000043
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010044 if (args) {
45 self->args = args;
46 Py_INCREF(args);
47 return (PyObject *)self;
48 }
49
Thomas Wouters477c8d52006-05-27 19:21:47 +000050 self->args = PyTuple_New(0);
51 if (!self->args) {
52 Py_DECREF(self);
53 return NULL;
54 }
55
Thomas Wouters477c8d52006-05-27 19:21:47 +000056 return (PyObject *)self;
57}
58
59static int
60BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
61{
Christian Heimes90aa7642007-12-19 02:45:37 +000062 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000063 return -1;
64
Serhiy Storchaka576f1322016-01-05 21:27:54 +020065 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030066 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068 return 0;
69}
70
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000071static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000072BaseException_clear(PyBaseExceptionObject *self)
73{
74 Py_CLEAR(self->dict);
75 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000076 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000077 Py_CLEAR(self->cause);
78 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000079 return 0;
80}
81
82static void
83BaseException_dealloc(PyBaseExceptionObject *self)
84{
Thomas Wouters89f507f2006-12-13 04:49:30 +000085 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000087 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088}
89
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000090static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000091BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
92{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000095 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000096 Py_VISIT(self->cause);
97 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000098 return 0;
99}
100
101static PyObject *
102BaseException_str(PyBaseExceptionObject *self)
103{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000104 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000106 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112}
113
114static PyObject *
115BaseException_repr(PyBaseExceptionObject *self)
116{
Serhiy Storchakac6792272013-10-19 21:03:34 +0300117 const char *name;
118 const char *dot;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119
Serhiy Storchakac6792272013-10-19 21:03:34 +0300120 name = Py_TYPE(self)->tp_name;
121 dot = (const char *) strrchr(name, '.');
Thomas Wouters477c8d52006-05-27 19:21:47 +0000122 if (dot != NULL) name = dot+1;
123
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000124 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125}
126
127/* Pickling support */
128static PyObject *
129BaseException_reduce(PyBaseExceptionObject *self)
130{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135}
136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137/*
138 * Needed for backward compatibility, since exceptions used to store
139 * all their attributes in the __dict__. Code is taken from cPickle's
140 * load_build function.
141 */
142static PyObject *
143BaseException_setstate(PyObject *self, PyObject *state)
144{
145 PyObject *d_key, *d_value;
146 Py_ssize_t i = 0;
147
148 if (state != Py_None) {
149 if (!PyDict_Check(state)) {
150 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
151 return NULL;
152 }
153 while (PyDict_Next(state, &i, &d_key, &d_value)) {
154 if (PyObject_SetAttr(self, d_key, d_value) < 0)
155 return NULL;
156 }
157 }
158 Py_RETURN_NONE;
159}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000160
Collin Winter828f04a2007-08-31 00:04:24 +0000161static PyObject *
162BaseException_with_traceback(PyObject *self, PyObject *tb) {
163 if (PyException_SetTraceback(self, tb))
164 return NULL;
165
166 Py_INCREF(self);
167 return self;
168}
169
Georg Brandl76941002008-05-05 21:38:47 +0000170PyDoc_STRVAR(with_traceback_doc,
171"Exception.with_traceback(tb) --\n\
172 set self.__traceback__ to tb and return self.");
173
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174
175static PyMethodDef BaseException_methods[] = {
176 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000178 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
179 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 {NULL, NULL, 0, NULL},
181};
182
Thomas Wouters477c8d52006-05-27 19:21:47 +0000183static PyObject *
184BaseException_get_args(PyBaseExceptionObject *self)
185{
186 if (self->args == NULL) {
187 Py_INCREF(Py_None);
188 return Py_None;
189 }
190 Py_INCREF(self->args);
191 return self->args;
192}
193
194static int
195BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
196{
197 PyObject *seq;
198 if (val == NULL) {
199 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
200 return -1;
201 }
202 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500203 if (!seq)
204 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300205 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000206 return 0;
207}
208
Collin Winter828f04a2007-08-31 00:04:24 +0000209static PyObject *
210BaseException_get_tb(PyBaseExceptionObject *self)
211{
212 if (self->traceback == NULL) {
213 Py_INCREF(Py_None);
214 return Py_None;
215 }
216 Py_INCREF(self->traceback);
217 return self->traceback;
218}
219
220static int
221BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
222{
223 if (tb == NULL) {
224 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
225 return -1;
226 }
227 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
228 PyErr_SetString(PyExc_TypeError,
229 "__traceback__ must be a traceback or None");
230 return -1;
231 }
232
Serhiy Storchaka37665722016-08-20 21:22:03 +0300233 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300234 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000235 return 0;
236}
237
Georg Brandlab6f2f62009-03-31 04:16:10 +0000238static PyObject *
239BaseException_get_context(PyObject *self) {
240 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500241 if (res)
242 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000243 Py_RETURN_NONE;
244}
245
246static int
247BaseException_set_context(PyObject *self, PyObject *arg) {
248 if (arg == NULL) {
249 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
250 return -1;
251 } else if (arg == Py_None) {
252 arg = NULL;
253 } else if (!PyExceptionInstance_Check(arg)) {
254 PyErr_SetString(PyExc_TypeError, "exception context must be None "
255 "or derive from BaseException");
256 return -1;
257 } else {
258 /* PyException_SetContext steals this reference */
259 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000261 PyException_SetContext(self, arg);
262 return 0;
263}
264
265static PyObject *
266BaseException_get_cause(PyObject *self) {
267 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500268 if (res)
269 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700270 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000271}
272
273static int
274BaseException_set_cause(PyObject *self, PyObject *arg) {
275 if (arg == NULL) {
276 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
277 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700278 } else if (arg == Py_None) {
279 arg = NULL;
280 } else if (!PyExceptionInstance_Check(arg)) {
281 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
282 "or derive from BaseException");
283 return -1;
284 } else {
285 /* PyException_SetCause steals this reference */
286 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700288 PyException_SetCause(self, arg);
289 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000290}
291
Guido van Rossum360e4b82007-05-14 22:51:27 +0000292
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500294 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000296 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000297 {"__context__", (getter)BaseException_get_context,
298 (setter)BaseException_set_context, PyDoc_STR("exception context")},
299 {"__cause__", (getter)BaseException_get_cause,
300 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000301 {NULL},
302};
303
304
Collin Winter828f04a2007-08-31 00:04:24 +0000305PyObject *
306PyException_GetTraceback(PyObject *self) {
307 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
308 Py_XINCREF(base_self->traceback);
309 return base_self->traceback;
310}
311
312
313int
314PyException_SetTraceback(PyObject *self, PyObject *tb) {
315 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
316}
317
318PyObject *
319PyException_GetCause(PyObject *self) {
320 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
321 Py_XINCREF(cause);
322 return cause;
323}
324
325/* Steals a reference to cause */
326void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200327PyException_SetCause(PyObject *self, PyObject *cause)
328{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700329 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300330 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000331}
332
333PyObject *
334PyException_GetContext(PyObject *self) {
335 PyObject *context = ((PyBaseExceptionObject *)self)->context;
336 Py_XINCREF(context);
337 return context;
338}
339
340/* Steals a reference to context */
341void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200342PyException_SetContext(PyObject *self, PyObject *context)
343{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300344 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000345}
346
347
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700348static struct PyMemberDef BaseException_members[] = {
349 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200350 offsetof(PyBaseExceptionObject, suppress_context)},
351 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700352};
353
354
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000356 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000357 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
359 0, /*tp_itemsize*/
360 (destructor)BaseException_dealloc, /*tp_dealloc*/
361 0, /*tp_print*/
362 0, /*tp_getattr*/
363 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000364 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000365 (reprfunc)BaseException_repr, /*tp_repr*/
366 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000367 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000368 0, /*tp_as_mapping*/
369 0, /*tp_hash */
370 0, /*tp_call*/
371 (reprfunc)BaseException_str, /*tp_str*/
372 PyObject_GenericGetAttr, /*tp_getattro*/
373 PyObject_GenericSetAttr, /*tp_setattro*/
374 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000377 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
378 (traverseproc)BaseException_traverse, /* tp_traverse */
379 (inquiry)BaseException_clear, /* tp_clear */
380 0, /* tp_richcompare */
381 0, /* tp_weaklistoffset */
382 0, /* tp_iter */
383 0, /* tp_iternext */
384 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700385 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000386 BaseException_getset, /* tp_getset */
387 0, /* tp_base */
388 0, /* tp_dict */
389 0, /* tp_descr_get */
390 0, /* tp_descr_set */
391 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
392 (initproc)BaseException_init, /* tp_init */
393 0, /* tp_alloc */
394 BaseException_new, /* tp_new */
395};
396/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
397from the previous implmentation and also allowing Python objects to be used
398in the API */
399PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
400
401/* note these macros omit the last semicolon so the macro invocation may
402 * include it and not look strange.
403 */
404#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
405static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000406 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000407 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000408 sizeof(PyBaseExceptionObject), \
409 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
410 0, 0, 0, 0, 0, 0, 0, \
411 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
412 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
413 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
414 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
415 (initproc)BaseException_init, 0, BaseException_new,\
416}; \
417PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
418
419#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
420static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000421 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000422 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000424 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425 0, 0, 0, 0, 0, \
426 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000427 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
428 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200430 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431}; \
432PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
433
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200434#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
435 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
436 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000438 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000439 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000440 sizeof(Py ## EXCSTORE ## Object), 0, \
441 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
442 (reprfunc)EXCSTR, 0, 0, 0, \
443 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
444 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
445 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200446 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200448 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000449}; \
450PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
451
452
453/*
454 * Exception extends BaseException
455 */
456SimpleExtendsException(PyExc_BaseException, Exception,
457 "Common base class for all non-exit exceptions.");
458
459
460/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 "Inappropriate argument type.");
465
466
467/*
Yury Selivanov75445082015-05-11 22:57:16 -0400468 * StopAsyncIteration extends Exception
469 */
470SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
471 "Signal the end from iterator.__anext__().");
472
473
474/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000475 * StopIteration extends Exception
476 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000477
478static PyMemberDef StopIteration_members[] = {
479 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
480 PyDoc_STR("generator return value")},
481 {NULL} /* Sentinel */
482};
483
484static int
485StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
486{
487 Py_ssize_t size = PyTuple_GET_SIZE(args);
488 PyObject *value;
489
490 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
491 return -1;
492 Py_CLEAR(self->value);
493 if (size > 0)
494 value = PyTuple_GET_ITEM(args, 0);
495 else
496 value = Py_None;
497 Py_INCREF(value);
498 self->value = value;
499 return 0;
500}
501
502static int
503StopIteration_clear(PyStopIterationObject *self)
504{
505 Py_CLEAR(self->value);
506 return BaseException_clear((PyBaseExceptionObject *)self);
507}
508
509static void
510StopIteration_dealloc(PyStopIterationObject *self)
511{
512 _PyObject_GC_UNTRACK(self);
513 StopIteration_clear(self);
514 Py_TYPE(self)->tp_free((PyObject *)self);
515}
516
517static int
518StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
519{
520 Py_VISIT(self->value);
521 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
522}
523
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000524ComplexExtendsException(
525 PyExc_Exception, /* base */
526 StopIteration, /* name */
527 StopIteration, /* prefix for *_init, etc */
528 0, /* new */
529 0, /* methods */
530 StopIteration_members, /* members */
531 0, /* getset */
532 0, /* str */
533 "Signal the end from iterator.__next__()."
534);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000535
536
537/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000538 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000540SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541 "Request that a generator exit.");
542
543
544/*
545 * SystemExit extends BaseException
546 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000547
548static int
549SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
550{
551 Py_ssize_t size = PyTuple_GET_SIZE(args);
552
553 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
554 return -1;
555
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000556 if (size == 0)
557 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200558 if (size == 1) {
559 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300560 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200561 }
562 else { /* size > 1 */
563 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300564 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200565 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000566 return 0;
567}
568
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000569static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000570SystemExit_clear(PySystemExitObject *self)
571{
572 Py_CLEAR(self->code);
573 return BaseException_clear((PyBaseExceptionObject *)self);
574}
575
576static void
577SystemExit_dealloc(PySystemExitObject *self)
578{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000581 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582}
583
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000584static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000585SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
586{
587 Py_VISIT(self->code);
588 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
589}
590
591static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
593 PyDoc_STR("exception code")},
594 {NULL} /* Sentinel */
595};
596
597ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200598 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000599 "Request to exit from the interpreter.");
600
601/*
602 * KeyboardInterrupt extends BaseException
603 */
604SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
605 "Program interrupted by user.");
606
607
608/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000610 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000611
Brett Cannon79ec55e2012-04-12 20:24:54 -0400612static int
613ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
614{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300615 static char *kwlist[] = {"name", "path", 0};
616 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400617 PyObject *msg = NULL;
618 PyObject *name = NULL;
619 PyObject *path = NULL;
620
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300621 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400622 return -1;
623
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300624 empty_tuple = PyTuple_New(0);
625 if (!empty_tuple)
626 return -1;
627 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
628 &name, &path)) {
629 Py_DECREF(empty_tuple);
630 return -1;
631 }
632 Py_DECREF(empty_tuple);
633
634 if (name) {
635 Py_INCREF(name);
636 Py_XSETREF(self->name, name);
637 }
638 if (path) {
639 Py_INCREF(path);
640 Py_XSETREF(self->path, path);
641 }
642 if (PyTuple_GET_SIZE(args) == 1) {
643 msg = PyTuple_GET_ITEM(args, 0);
644 Py_INCREF(msg);
645 Py_XSETREF(self->msg, msg);
646 }
Brett Cannon79ec55e2012-04-12 20:24:54 -0400647
648 return 0;
649}
650
651static int
652ImportError_clear(PyImportErrorObject *self)
653{
654 Py_CLEAR(self->msg);
655 Py_CLEAR(self->name);
656 Py_CLEAR(self->path);
657 return BaseException_clear((PyBaseExceptionObject *)self);
658}
659
660static void
661ImportError_dealloc(PyImportErrorObject *self)
662{
663 _PyObject_GC_UNTRACK(self);
664 ImportError_clear(self);
665 Py_TYPE(self)->tp_free((PyObject *)self);
666}
667
668static int
669ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
670{
671 Py_VISIT(self->msg);
672 Py_VISIT(self->name);
673 Py_VISIT(self->path);
674 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
675}
676
677static PyObject *
678ImportError_str(PyImportErrorObject *self)
679{
Brett Cannon07c6e712012-08-24 13:05:09 -0400680 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400681 Py_INCREF(self->msg);
682 return self->msg;
683 }
684 else {
685 return BaseException_str((PyBaseExceptionObject *)self);
686 }
687}
688
689static PyMemberDef ImportError_members[] = {
690 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
691 PyDoc_STR("exception message")},
692 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
693 PyDoc_STR("module name")},
694 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
695 PyDoc_STR("module path")},
696 {NULL} /* Sentinel */
697};
698
699static PyMethodDef ImportError_methods[] = {
700 {NULL}
701};
702
703ComplexExtendsException(PyExc_Exception, ImportError,
704 ImportError, 0 /* new */,
705 ImportError_methods, ImportError_members,
706 0 /* getset */, ImportError_str,
707 "Import can't find module, or can't find name in "
708 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000709
710/*
Eric Snowc9432652016-09-07 15:42:32 -0700711 * ModuleNotFoundError extends ImportError
712 */
713
714MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
715 "Module not found.");
716
717/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200718 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000719 */
720
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200721#ifdef MS_WINDOWS
722#include "errmap.h"
723#endif
724
Thomas Wouters477c8d52006-05-27 19:21:47 +0000725/* Where a function has a single filename, such as open() or some
726 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
727 * called, giving a third argument which is the filename. But, so
728 * that old code using in-place unpacking doesn't break, e.g.:
729 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200730 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000731 *
732 * we hack args so that it only contains two items. This also
733 * means we need our own __str__() which prints out the filename
734 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800735 *
736 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800737 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
738 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000739 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200740
Antoine Pitroue0e27352011-12-15 14:31:28 +0100741/* This function doesn't cleanup on error, the caller should */
742static int
743oserror_parse_args(PyObject **p_args,
744 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800745 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200746#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100747 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200748#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100749 )
750{
751 Py_ssize_t nargs;
752 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800753#ifndef MS_WINDOWS
754 /*
755 * ignored on non-Windows platforms,
756 * but parsed so OSError has a consistent signature
757 */
758 PyObject *_winerror = NULL;
759 PyObject **winerror = &_winerror;
760#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000761
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200762 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000763
Larry Hastingsb0827312014-02-09 22:05:19 -0800764 if (nargs >= 2 && nargs <= 5) {
765 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
766 myerrno, strerror,
767 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100768 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800769#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100770 if (*winerror && PyLong_Check(*winerror)) {
771 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200772 PyObject *newargs;
773 Py_ssize_t i;
774
Antoine Pitroue0e27352011-12-15 14:31:28 +0100775 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200776 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100777 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200778 /* Set errno to the corresponding POSIX errno (overriding
779 first argument). Windows Socket error codes (>= 10000)
780 have the same value as their POSIX counterparts.
781 */
782 if (winerrcode < 10000)
783 errcode = winerror_to_errno(winerrcode);
784 else
785 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100786 *myerrno = PyLong_FromLong(errcode);
787 if (!*myerrno)
788 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200789 newargs = PyTuple_New(nargs);
790 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100791 return -1;
792 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200793 for (i = 1; i < nargs; i++) {
794 PyObject *val = PyTuple_GET_ITEM(args, i);
795 Py_INCREF(val);
796 PyTuple_SET_ITEM(newargs, i, val);
797 }
798 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100799 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200800 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800801#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200802 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000803
Antoine Pitroue0e27352011-12-15 14:31:28 +0100804 return 0;
805}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000806
Antoine Pitroue0e27352011-12-15 14:31:28 +0100807static int
808oserror_init(PyOSErrorObject *self, PyObject **p_args,
809 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800810 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100811#ifdef MS_WINDOWS
812 , PyObject *winerror
813#endif
814 )
815{
816 PyObject *args = *p_args;
817 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000818
819 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 PyNumber_Check(filename)) {
823 /* BlockingIOError's 3rd argument can be the number of
824 * characters written.
825 */
826 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
827 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100828 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200829 }
830 else {
831 Py_INCREF(filename);
832 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000833
Larry Hastingsb0827312014-02-09 22:05:19 -0800834 if (filename2 && filename2 != Py_None) {
835 Py_INCREF(filename2);
836 self->filename2 = filename2;
837 }
838
839 if (nargs >= 2 && nargs <= 5) {
840 /* filename, filename2, and winerror are removed from the args tuple
841 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100842 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200843 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100844 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200846 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100847 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200848 }
849 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000850 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200851 Py_XINCREF(myerrno);
852 self->myerrno = myerrno;
853
854 Py_XINCREF(strerror);
855 self->strerror = strerror;
856
857#ifdef MS_WINDOWS
858 Py_XINCREF(winerror);
859 self->winerror = winerror;
860#endif
861
Antoine Pitroue0e27352011-12-15 14:31:28 +0100862 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300863 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100864 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100865
866 return 0;
867}
868
869static PyObject *
870OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
871static int
872OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
873
874static int
875oserror_use_init(PyTypeObject *type)
876{
Martin Panter7462b6492015-11-02 03:37:02 +0000877 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100878 extraneous argument to __new__ to be ignored. The only reasonable
879 solution, given __new__ takes a variable number of arguments,
880 is to defer arg parsing and initialization to __init__.
881
Martin Pantere26da7c2016-06-02 10:07:09 +0000882 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100883 with the right arguments.
884
885 (see http://bugs.python.org/issue12555#msg148829 )
886 */
887 if (type->tp_init != (initproc) OSError_init &&
888 type->tp_new == (newfunc) OSError_new) {
889 assert((PyObject *) type != PyExc_OSError);
890 return 1;
891 }
892 return 0;
893}
894
895static PyObject *
896OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
897{
898 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800899 PyObject *myerrno = NULL, *strerror = NULL;
900 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100901#ifdef MS_WINDOWS
902 PyObject *winerror = NULL;
903#endif
904
Victor Stinner46ef3192013-11-14 22:31:41 +0100905 Py_INCREF(args);
906
Antoine Pitroue0e27352011-12-15 14:31:28 +0100907 if (!oserror_use_init(type)) {
908 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100909 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100910
Larry Hastingsb0827312014-02-09 22:05:19 -0800911 if (oserror_parse_args(&args, &myerrno, &strerror,
912 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100913#ifdef MS_WINDOWS
914 , &winerror
915#endif
916 ))
917 goto error;
918
919 if (myerrno && PyLong_Check(myerrno) &&
920 errnomap && (PyObject *) type == PyExc_OSError) {
921 PyObject *newtype;
922 newtype = PyDict_GetItem(errnomap, myerrno);
923 if (newtype) {
924 assert(PyType_Check(newtype));
925 type = (PyTypeObject *) newtype;
926 }
927 else if (PyErr_Occurred())
928 goto error;
929 }
930 }
931
932 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
933 if (!self)
934 goto error;
935
936 self->dict = NULL;
937 self->traceback = self->cause = self->context = NULL;
938 self->written = -1;
939
940 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800941 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100942#ifdef MS_WINDOWS
943 , winerror
944#endif
945 ))
946 goto error;
947 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200948 else {
949 self->args = PyTuple_New(0);
950 if (self->args == NULL)
951 goto error;
952 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100953
Victor Stinner46ef3192013-11-14 22:31:41 +0100954 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200955 return (PyObject *) self;
956
957error:
958 Py_XDECREF(args);
959 Py_XDECREF(self);
960 return NULL;
961}
962
963static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100964OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200965{
Larry Hastingsb0827312014-02-09 22:05:19 -0800966 PyObject *myerrno = NULL, *strerror = NULL;
967 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100968#ifdef MS_WINDOWS
969 PyObject *winerror = NULL;
970#endif
971
972 if (!oserror_use_init(Py_TYPE(self)))
973 /* Everything already done in OSError_new */
974 return 0;
975
976 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
977 return -1;
978
979 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -0800980 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100981#ifdef MS_WINDOWS
982 , &winerror
983#endif
984 ))
985 goto error;
986
Larry Hastingsb0827312014-02-09 22:05:19 -0800987 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100988#ifdef MS_WINDOWS
989 , winerror
990#endif
991 ))
992 goto error;
993
Thomas Wouters477c8d52006-05-27 19:21:47 +0000994 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100995
996error:
Serhiy Storchaka37665722016-08-20 21:22:03 +0300997 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100998 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000999}
1000
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001001static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001002OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001003{
1004 Py_CLEAR(self->myerrno);
1005 Py_CLEAR(self->strerror);
1006 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001007 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001008#ifdef MS_WINDOWS
1009 Py_CLEAR(self->winerror);
1010#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001011 return BaseException_clear((PyBaseExceptionObject *)self);
1012}
1013
1014static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001015OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001017 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001019 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001020}
1021
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001022static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001023OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001024 void *arg)
1025{
1026 Py_VISIT(self->myerrno);
1027 Py_VISIT(self->strerror);
1028 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001029 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001030#ifdef MS_WINDOWS
1031 Py_VISIT(self->winerror);
1032#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001033 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1034}
1035
1036static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001037OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001038{
Larry Hastingsb0827312014-02-09 22:05:19 -08001039#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001040#ifdef MS_WINDOWS
1041 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001042 if (self->winerror && self->filename) {
1043 if (self->filename2) {
1044 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1045 OR_NONE(self->winerror),
1046 OR_NONE(self->strerror),
1047 self->filename,
1048 self->filename2);
1049 } else {
1050 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1051 OR_NONE(self->winerror),
1052 OR_NONE(self->strerror),
1053 self->filename);
1054 }
1055 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001057 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001058 self->winerror ? self->winerror: Py_None,
1059 self->strerror ? self->strerror: Py_None);
1060#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001061 if (self->filename) {
1062 if (self->filename2) {
1063 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1064 OR_NONE(self->myerrno),
1065 OR_NONE(self->strerror),
1066 self->filename,
1067 self->filename2);
1068 } else {
1069 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1070 OR_NONE(self->myerrno),
1071 OR_NONE(self->strerror),
1072 self->filename);
1073 }
1074 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001075 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001076 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001077 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079}
1080
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001082OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001083{
1084 PyObject *args = self->args;
1085 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001086
Thomas Wouters477c8d52006-05-27 19:21:47 +00001087 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001088 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001089 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001090 Py_ssize_t size = self->filename2 ? 5 : 3;
1091 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001092 if (!args)
1093 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001094
1095 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001096 Py_INCREF(tmp);
1097 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001098
1099 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001100 Py_INCREF(tmp);
1101 PyTuple_SET_ITEM(args, 1, tmp);
1102
1103 Py_INCREF(self->filename);
1104 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001105
1106 if (self->filename2) {
1107 /*
1108 * This tuple is essentially used as OSError(*args).
1109 * So, to recreate filename2, we need to pass in
1110 * winerror as well.
1111 */
1112 Py_INCREF(Py_None);
1113 PyTuple_SET_ITEM(args, 3, Py_None);
1114
1115 /* filename2 */
1116 Py_INCREF(self->filename2);
1117 PyTuple_SET_ITEM(args, 4, self->filename2);
1118 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001119 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001121
1122 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001123 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001124 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001125 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001126 Py_DECREF(args);
1127 return res;
1128}
1129
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130static PyObject *
1131OSError_written_get(PyOSErrorObject *self, void *context)
1132{
1133 if (self->written == -1) {
1134 PyErr_SetString(PyExc_AttributeError, "characters_written");
1135 return NULL;
1136 }
1137 return PyLong_FromSsize_t(self->written);
1138}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001139
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001140static int
1141OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1142{
1143 Py_ssize_t n;
1144 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1145 if (n == -1 && PyErr_Occurred())
1146 return -1;
1147 self->written = n;
1148 return 0;
1149}
1150
1151static PyMemberDef OSError_members[] = {
1152 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1153 PyDoc_STR("POSIX exception code")},
1154 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1155 PyDoc_STR("exception strerror")},
1156 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1157 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001158 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1159 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001160#ifdef MS_WINDOWS
1161 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1162 PyDoc_STR("Win32 exception code")},
1163#endif
1164 {NULL} /* Sentinel */
1165};
1166
1167static PyMethodDef OSError_methods[] = {
1168 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001169 {NULL}
1170};
1171
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001172static PyGetSetDef OSError_getset[] = {
1173 {"characters_written", (getter) OSError_written_get,
1174 (setter) OSError_written_set, NULL},
1175 {NULL}
1176};
1177
1178
1179ComplexExtendsException(PyExc_Exception, OSError,
1180 OSError, OSError_new,
1181 OSError_methods, OSError_members, OSError_getset,
1182 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183 "Base class for I/O related errors.");
1184
1185
1186/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001187 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001188 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001189MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1190 "I/O operation would block.");
1191MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1192 "Connection error.");
1193MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1194 "Child process error.");
1195MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1196 "Broken pipe.");
1197MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1198 "Connection aborted.");
1199MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1200 "Connection refused.");
1201MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1202 "Connection reset.");
1203MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1204 "File already exists.");
1205MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1206 "File not found.");
1207MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1208 "Operation doesn't work on directories.");
1209MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1210 "Operation only works on directories.");
1211MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1212 "Interrupted by signal.");
1213MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1214 "Not enough permissions.");
1215MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1216 "Process not found.");
1217MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1218 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001219
1220/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001221 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001223SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001224 "Read beyond end of file.");
1225
1226
1227/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001228 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001229 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001230SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001231 "Unspecified run-time error.");
1232
Yury Selivanovf488fb42015-07-03 01:04:23 -04001233/*
1234 * RecursionError extends RuntimeError
1235 */
1236SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1237 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001238
1239/*
1240 * NotImplementedError extends RuntimeError
1241 */
1242SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1243 "Method or function hasn't been implemented yet.");
1244
1245/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001246 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001247 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001248SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001249 "Name not found globally.");
1250
1251/*
1252 * UnboundLocalError extends NameError
1253 */
1254SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1255 "Local name referenced but not bound to a value.");
1256
1257/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001258 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001260SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001261 "Attribute not found.");
1262
1263
1264/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001265 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001266 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001268/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001269static int _report_missing_parentheses(PySyntaxErrorObject *self);
1270
Thomas Wouters477c8d52006-05-27 19:21:47 +00001271static int
1272SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1273{
1274 PyObject *info = NULL;
1275 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1276
1277 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1278 return -1;
1279
1280 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001281 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001282 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001283 }
1284 if (lenargs == 2) {
1285 info = PyTuple_GET_ITEM(args, 1);
1286 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001287 if (!info)
1288 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001290 if (PyTuple_GET_SIZE(info) != 4) {
1291 /* not a very good error message, but it's what Python 2.4 gives */
1292 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1293 Py_DECREF(info);
1294 return -1;
1295 }
1296
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001297 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001298 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001299
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001300 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001301 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001302
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001303 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001304 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001305
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001306 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001307 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001308
1309 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001310
1311 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1312 if (self->text && PyUnicode_Check(self->text)) {
1313 if (_report_missing_parentheses(self) < 0) {
1314 return -1;
1315 }
1316 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001317 }
1318 return 0;
1319}
1320
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001321static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001322SyntaxError_clear(PySyntaxErrorObject *self)
1323{
1324 Py_CLEAR(self->msg);
1325 Py_CLEAR(self->filename);
1326 Py_CLEAR(self->lineno);
1327 Py_CLEAR(self->offset);
1328 Py_CLEAR(self->text);
1329 Py_CLEAR(self->print_file_and_line);
1330 return BaseException_clear((PyBaseExceptionObject *)self);
1331}
1332
1333static void
1334SyntaxError_dealloc(PySyntaxErrorObject *self)
1335{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001336 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001338 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339}
1340
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001341static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001342SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1343{
1344 Py_VISIT(self->msg);
1345 Py_VISIT(self->filename);
1346 Py_VISIT(self->lineno);
1347 Py_VISIT(self->offset);
1348 Py_VISIT(self->text);
1349 Py_VISIT(self->print_file_and_line);
1350 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1351}
1352
1353/* This is called "my_basename" instead of just "basename" to avoid name
1354 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1355 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001356static PyObject*
1357my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001358{
Victor Stinner6237daf2010-04-28 17:26:19 +00001359 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001360 int kind;
1361 void *data;
1362
1363 if (PyUnicode_READY(name))
1364 return NULL;
1365 kind = PyUnicode_KIND(name);
1366 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001367 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001368 offset = 0;
1369 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001370 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001371 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001372 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001373 if (offset != 0)
1374 return PyUnicode_Substring(name, offset, size);
1375 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001376 Py_INCREF(name);
1377 return name;
1378 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379}
1380
1381
1382static PyObject *
1383SyntaxError_str(PySyntaxErrorObject *self)
1384{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001385 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001386 PyObject *filename;
1387 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001388 /* Below, we always ignore overflow errors, just printing -1.
1389 Still, we cannot allow an OverflowError to be raised, so
1390 we need to call PyLong_AsLongAndOverflow. */
1391 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001392
1393 /* XXX -- do all the additional formatting with filename and
1394 lineno here */
1395
Neal Norwitzed2b7392007-08-26 04:51:10 +00001396 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001397 filename = my_basename(self->filename);
1398 if (filename == NULL)
1399 return NULL;
1400 } else {
1401 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001402 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001403 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001404
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001405 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001406 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001408 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001409 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001410 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001411 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001413 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001414 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001415 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001416 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001417 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001418 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001419 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001420 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001421 Py_XDECREF(filename);
1422 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001423}
1424
1425static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001426 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1427 PyDoc_STR("exception msg")},
1428 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1429 PyDoc_STR("exception filename")},
1430 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1431 PyDoc_STR("exception lineno")},
1432 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1433 PyDoc_STR("exception offset")},
1434 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1435 PyDoc_STR("exception text")},
1436 {"print_file_and_line", T_OBJECT,
1437 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1438 PyDoc_STR("exception print_file_and_line")},
1439 {NULL} /* Sentinel */
1440};
1441
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001442ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001443 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001444 SyntaxError_str, "Invalid syntax.");
1445
1446
1447/*
1448 * IndentationError extends SyntaxError
1449 */
1450MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1451 "Improper indentation.");
1452
1453
1454/*
1455 * TabError extends IndentationError
1456 */
1457MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1458 "Improper mixture of spaces and tabs.");
1459
1460
1461/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001462 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001463 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001464SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001465 "Base class for lookup errors.");
1466
1467
1468/*
1469 * IndexError extends LookupError
1470 */
1471SimpleExtendsException(PyExc_LookupError, IndexError,
1472 "Sequence index out of range.");
1473
1474
1475/*
1476 * KeyError extends LookupError
1477 */
1478static PyObject *
1479KeyError_str(PyBaseExceptionObject *self)
1480{
1481 /* If args is a tuple of exactly one item, apply repr to args[0].
1482 This is done so that e.g. the exception raised by {}[''] prints
1483 KeyError: ''
1484 rather than the confusing
1485 KeyError
1486 alone. The downside is that if KeyError is raised with an explanatory
1487 string, that string will be displayed in quotes. Too bad.
1488 If args is anything else, use the default BaseException__str__().
1489 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001490 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001491 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001492 }
1493 return BaseException_str(self);
1494}
1495
1496ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001497 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001498
1499
1500/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001501 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001502 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001503SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001504 "Inappropriate argument value (of correct type).");
1505
1506/*
1507 * UnicodeError extends ValueError
1508 */
1509
1510SimpleExtendsException(PyExc_ValueError, UnicodeError,
1511 "Unicode related error.");
1512
Thomas Wouters477c8d52006-05-27 19:21:47 +00001513static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001514get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001515{
1516 if (!attr) {
1517 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1518 return NULL;
1519 }
1520
Christian Heimes72b710a2008-05-26 13:28:38 +00001521 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001522 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1523 return NULL;
1524 }
1525 Py_INCREF(attr);
1526 return attr;
1527}
1528
1529static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001530get_unicode(PyObject *attr, const char *name)
1531{
1532 if (!attr) {
1533 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1534 return NULL;
1535 }
1536
1537 if (!PyUnicode_Check(attr)) {
1538 PyErr_Format(PyExc_TypeError,
1539 "%.200s attribute must be unicode", name);
1540 return NULL;
1541 }
1542 Py_INCREF(attr);
1543 return attr;
1544}
1545
Walter Dörwaldd2034312007-05-18 16:29:38 +00001546static int
1547set_unicodefromstring(PyObject **attr, const char *value)
1548{
1549 PyObject *obj = PyUnicode_FromString(value);
1550 if (!obj)
1551 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001552 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001553 return 0;
1554}
1555
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556PyObject *
1557PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1558{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001559 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001560}
1561
1562PyObject *
1563PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1564{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001565 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001566}
1567
1568PyObject *
1569PyUnicodeEncodeError_GetObject(PyObject *exc)
1570{
1571 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1572}
1573
1574PyObject *
1575PyUnicodeDecodeError_GetObject(PyObject *exc)
1576{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001577 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001578}
1579
1580PyObject *
1581PyUnicodeTranslateError_GetObject(PyObject *exc)
1582{
1583 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1584}
1585
1586int
1587PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1588{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001589 Py_ssize_t size;
1590 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1591 "object");
1592 if (!obj)
1593 return -1;
1594 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001595 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001596 if (*start<0)
1597 *start = 0; /*XXX check for values <0*/
1598 if (*start>=size)
1599 *start = size-1;
1600 Py_DECREF(obj);
1601 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001602}
1603
1604
1605int
1606PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1607{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001608 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001609 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001610 if (!obj)
1611 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001612 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001613 *start = ((PyUnicodeErrorObject *)exc)->start;
1614 if (*start<0)
1615 *start = 0;
1616 if (*start>=size)
1617 *start = size-1;
1618 Py_DECREF(obj);
1619 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001620}
1621
1622
1623int
1624PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1625{
1626 return PyUnicodeEncodeError_GetStart(exc, start);
1627}
1628
1629
1630int
1631PyUnicodeEncodeError_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
1639PyUnicodeDecodeError_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
1647PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1648{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001649 ((PyUnicodeErrorObject *)exc)->start = start;
1650 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001651}
1652
1653
1654int
1655PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1656{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001657 Py_ssize_t size;
1658 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1659 "object");
1660 if (!obj)
1661 return -1;
1662 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001663 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001664 if (*end<1)
1665 *end = 1;
1666 if (*end>size)
1667 *end = size;
1668 Py_DECREF(obj);
1669 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001670}
1671
1672
1673int
1674PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1675{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001676 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001677 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001678 if (!obj)
1679 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001680 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001681 *end = ((PyUnicodeErrorObject *)exc)->end;
1682 if (*end<1)
1683 *end = 1;
1684 if (*end>size)
1685 *end = size;
1686 Py_DECREF(obj);
1687 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001688}
1689
1690
1691int
1692PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1693{
1694 return PyUnicodeEncodeError_GetEnd(exc, start);
1695}
1696
1697
1698int
1699PyUnicodeEncodeError_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
1707PyUnicodeDecodeError_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
1713
1714int
1715PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1716{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001717 ((PyUnicodeErrorObject *)exc)->end = end;
1718 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719}
1720
1721PyObject *
1722PyUnicodeEncodeError_GetReason(PyObject *exc)
1723{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001724 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001725}
1726
1727
1728PyObject *
1729PyUnicodeDecodeError_GetReason(PyObject *exc)
1730{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001731 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001732}
1733
1734
1735PyObject *
1736PyUnicodeTranslateError_GetReason(PyObject *exc)
1737{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001738 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001739}
1740
1741
1742int
1743PyUnicodeEncodeError_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
1751PyUnicodeDecodeError_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
1758int
1759PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1760{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001761 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1762 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763}
1764
1765
Thomas Wouters477c8d52006-05-27 19:21:47 +00001766static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001767UnicodeError_clear(PyUnicodeErrorObject *self)
1768{
1769 Py_CLEAR(self->encoding);
1770 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001771 Py_CLEAR(self->reason);
1772 return BaseException_clear((PyBaseExceptionObject *)self);
1773}
1774
1775static void
1776UnicodeError_dealloc(PyUnicodeErrorObject *self)
1777{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001778 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001780 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001781}
1782
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001783static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001784UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1785{
1786 Py_VISIT(self->encoding);
1787 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788 Py_VISIT(self->reason);
1789 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1790}
1791
1792static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001793 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1794 PyDoc_STR("exception encoding")},
1795 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1796 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001797 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001798 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001799 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800 PyDoc_STR("exception end")},
1801 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1802 PyDoc_STR("exception reason")},
1803 {NULL} /* Sentinel */
1804};
1805
1806
1807/*
1808 * UnicodeEncodeError extends UnicodeError
1809 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810
1811static int
1812UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1813{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001814 PyUnicodeErrorObject *err;
1815
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1817 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001818
1819 err = (PyUnicodeErrorObject *)self;
1820
1821 Py_CLEAR(err->encoding);
1822 Py_CLEAR(err->object);
1823 Py_CLEAR(err->reason);
1824
1825 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1826 &PyUnicode_Type, &err->encoding,
1827 &PyUnicode_Type, &err->object,
1828 &err->start,
1829 &err->end,
1830 &PyUnicode_Type, &err->reason)) {
1831 err->encoding = err->object = err->reason = NULL;
1832 return -1;
1833 }
1834
Martin v. Löwisb09af032011-11-04 11:16:41 +01001835 if (PyUnicode_READY(err->object) < -1) {
1836 err->encoding = NULL;
1837 return -1;
1838 }
1839
Guido van Rossum98297ee2007-11-06 21:34:58 +00001840 Py_INCREF(err->encoding);
1841 Py_INCREF(err->object);
1842 Py_INCREF(err->reason);
1843
1844 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845}
1846
1847static PyObject *
1848UnicodeEncodeError_str(PyObject *self)
1849{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001850 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001851 PyObject *result = NULL;
1852 PyObject *reason_str = NULL;
1853 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001855 if (!uself->object)
1856 /* Not properly initialized. */
1857 return PyUnicode_FromString("");
1858
Eric Smith0facd772010-02-24 15:42:29 +00001859 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001860 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001861 reason_str = PyObject_Str(uself->reason);
1862 if (reason_str == NULL)
1863 goto done;
1864 encoding_str = PyObject_Str(uself->encoding);
1865 if (encoding_str == NULL)
1866 goto done;
1867
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001868 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1869 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001870 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001871 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001872 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001873 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001874 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001875 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001876 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001877 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001878 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001879 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001880 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001881 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001882 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001883 }
Eric Smith0facd772010-02-24 15:42:29 +00001884 else {
1885 result = PyUnicode_FromFormat(
1886 "'%U' codec can't encode characters in position %zd-%zd: %U",
1887 encoding_str,
1888 uself->start,
1889 uself->end-1,
1890 reason_str);
1891 }
1892done:
1893 Py_XDECREF(reason_str);
1894 Py_XDECREF(encoding_str);
1895 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001896}
1897
1898static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001899 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001900 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001901 sizeof(PyUnicodeErrorObject), 0,
1902 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1903 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1904 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001905 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1906 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001907 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001908 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001909};
1910PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1911
1912PyObject *
1913PyUnicodeEncodeError_Create(
1914 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1915 Py_ssize_t start, Py_ssize_t end, const char *reason)
1916{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001917 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001918 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919}
1920
1921
1922/*
1923 * UnicodeDecodeError extends UnicodeError
1924 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001925
1926static int
1927UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1928{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001929 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001930
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1932 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001933
1934 ude = (PyUnicodeErrorObject *)self;
1935
1936 Py_CLEAR(ude->encoding);
1937 Py_CLEAR(ude->object);
1938 Py_CLEAR(ude->reason);
1939
1940 if (!PyArg_ParseTuple(args, "O!OnnO!",
1941 &PyUnicode_Type, &ude->encoding,
1942 &ude->object,
1943 &ude->start,
1944 &ude->end,
1945 &PyUnicode_Type, &ude->reason)) {
1946 ude->encoding = ude->object = ude->reason = NULL;
1947 return -1;
1948 }
1949
Guido van Rossum98297ee2007-11-06 21:34:58 +00001950 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001951 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001952 Py_INCREF(ude->reason);
1953
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001954 if (!PyBytes_Check(ude->object)) {
1955 Py_buffer view;
1956 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1957 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001958 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001959 PyBuffer_Release(&view);
1960 if (!ude->object)
1961 goto error;
1962 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001963 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001964
1965error:
1966 Py_CLEAR(ude->encoding);
1967 Py_CLEAR(ude->object);
1968 Py_CLEAR(ude->reason);
1969 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970}
1971
1972static PyObject *
1973UnicodeDecodeError_str(PyObject *self)
1974{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001975 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001976 PyObject *result = NULL;
1977 PyObject *reason_str = NULL;
1978 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001979
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001980 if (!uself->object)
1981 /* Not properly initialized. */
1982 return PyUnicode_FromString("");
1983
Eric Smith0facd772010-02-24 15:42:29 +00001984 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001985 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001986 reason_str = PyObject_Str(uself->reason);
1987 if (reason_str == NULL)
1988 goto done;
1989 encoding_str = PyObject_Str(uself->encoding);
1990 if (encoding_str == NULL)
1991 goto done;
1992
1993 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001994 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001995 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001996 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001997 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001998 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001999 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002000 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002001 }
Eric Smith0facd772010-02-24 15:42:29 +00002002 else {
2003 result = PyUnicode_FromFormat(
2004 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2005 encoding_str,
2006 uself->start,
2007 uself->end-1,
2008 reason_str
2009 );
2010 }
2011done:
2012 Py_XDECREF(reason_str);
2013 Py_XDECREF(encoding_str);
2014 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002015}
2016
2017static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002018 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002019 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002020 sizeof(PyUnicodeErrorObject), 0,
2021 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2022 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2023 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002024 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2025 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002026 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002027 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028};
2029PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2030
2031PyObject *
2032PyUnicodeDecodeError_Create(
2033 const char *encoding, const char *object, Py_ssize_t length,
2034 Py_ssize_t start, Py_ssize_t end, const char *reason)
2035{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002036 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002037 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002038}
2039
2040
2041/*
2042 * UnicodeTranslateError extends UnicodeError
2043 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002044
2045static int
2046UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2047 PyObject *kwds)
2048{
2049 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2050 return -1;
2051
2052 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002053 Py_CLEAR(self->reason);
2054
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002055 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002056 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002057 &self->start,
2058 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00002059 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002060 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002061 return -1;
2062 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002063
Thomas Wouters477c8d52006-05-27 19:21:47 +00002064 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002065 Py_INCREF(self->reason);
2066
2067 return 0;
2068}
2069
2070
2071static PyObject *
2072UnicodeTranslateError_str(PyObject *self)
2073{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002074 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002075 PyObject *result = NULL;
2076 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002077
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002078 if (!uself->object)
2079 /* Not properly initialized. */
2080 return PyUnicode_FromString("");
2081
Eric Smith0facd772010-02-24 15:42:29 +00002082 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002083 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002084 reason_str = PyObject_Str(uself->reason);
2085 if (reason_str == NULL)
2086 goto done;
2087
Victor Stinner53b33e72011-11-21 01:17:27 +01002088 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2089 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002090 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002091 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002092 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002093 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002094 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002095 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002096 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002097 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002098 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002099 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002100 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002101 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002102 );
Eric Smith0facd772010-02-24 15:42:29 +00002103 } else {
2104 result = PyUnicode_FromFormat(
2105 "can't translate characters in position %zd-%zd: %U",
2106 uself->start,
2107 uself->end-1,
2108 reason_str
2109 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002110 }
Eric Smith0facd772010-02-24 15:42:29 +00002111done:
2112 Py_XDECREF(reason_str);
2113 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002114}
2115
2116static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002117 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002118 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002119 sizeof(PyUnicodeErrorObject), 0,
2120 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2121 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2122 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002123 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002124 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2125 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002126 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002127};
2128PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2129
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002130/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002131PyObject *
2132PyUnicodeTranslateError_Create(
2133 const Py_UNICODE *object, Py_ssize_t length,
2134 Py_ssize_t start, Py_ssize_t end, const char *reason)
2135{
2136 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002137 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002138}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002139
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002140PyObject *
2141_PyUnicodeTranslateError_Create(
2142 PyObject *object,
2143 Py_ssize_t start, Py_ssize_t end, const char *reason)
2144{
Victor Stinner69598d42014-04-04 20:59:44 +02002145 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002146 object, start, end, reason);
2147}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002148
2149/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002150 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002151 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002152SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002153 "Assertion failed.");
2154
2155
2156/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002157 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002158 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002159SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002160 "Base class for arithmetic errors.");
2161
2162
2163/*
2164 * FloatingPointError extends ArithmeticError
2165 */
2166SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2167 "Floating point operation failed.");
2168
2169
2170/*
2171 * OverflowError extends ArithmeticError
2172 */
2173SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2174 "Result too large to be represented.");
2175
2176
2177/*
2178 * ZeroDivisionError extends ArithmeticError
2179 */
2180SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2181 "Second argument to a division or modulo operation was zero.");
2182
2183
2184/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002185 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002186 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002187SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188 "Internal error in the Python interpreter.\n"
2189 "\n"
2190 "Please report this to the Python maintainer, along with the traceback,\n"
2191 "the Python version, and the hardware/OS platform and version.");
2192
2193
2194/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002195 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002197SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198 "Weak ref proxy used after referent went away.");
2199
2200
2201/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002202 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002203 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002204
2205#define MEMERRORS_SAVE 16
2206static PyBaseExceptionObject *memerrors_freelist = NULL;
2207static int memerrors_numfree = 0;
2208
2209static PyObject *
2210MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2211{
2212 PyBaseExceptionObject *self;
2213
2214 if (type != (PyTypeObject *) PyExc_MemoryError)
2215 return BaseException_new(type, args, kwds);
2216 if (memerrors_freelist == NULL)
2217 return BaseException_new(type, args, kwds);
2218 /* Fetch object from freelist and revive it */
2219 self = memerrors_freelist;
2220 self->args = PyTuple_New(0);
2221 /* This shouldn't happen since the empty tuple is persistent */
2222 if (self->args == NULL)
2223 return NULL;
2224 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2225 memerrors_numfree--;
2226 self->dict = NULL;
2227 _Py_NewReference((PyObject *)self);
2228 _PyObject_GC_TRACK(self);
2229 return (PyObject *)self;
2230}
2231
2232static void
2233MemoryError_dealloc(PyBaseExceptionObject *self)
2234{
2235 _PyObject_GC_UNTRACK(self);
2236 BaseException_clear(self);
2237 if (memerrors_numfree >= MEMERRORS_SAVE)
2238 Py_TYPE(self)->tp_free((PyObject *)self);
2239 else {
2240 self->dict = (PyObject *) memerrors_freelist;
2241 memerrors_freelist = self;
2242 memerrors_numfree++;
2243 }
2244}
2245
2246static void
2247preallocate_memerrors(void)
2248{
2249 /* We create enough MemoryErrors and then decref them, which will fill
2250 up the freelist. */
2251 int i;
2252 PyObject *errors[MEMERRORS_SAVE];
2253 for (i = 0; i < MEMERRORS_SAVE; i++) {
2254 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2255 NULL, NULL);
2256 if (!errors[i])
2257 Py_FatalError("Could not preallocate MemoryError object");
2258 }
2259 for (i = 0; i < MEMERRORS_SAVE; i++) {
2260 Py_DECREF(errors[i]);
2261 }
2262}
2263
2264static void
2265free_preallocated_memerrors(void)
2266{
2267 while (memerrors_freelist != NULL) {
2268 PyObject *self = (PyObject *) memerrors_freelist;
2269 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2270 Py_TYPE(self)->tp_free((PyObject *)self);
2271 }
2272}
2273
2274
2275static PyTypeObject _PyExc_MemoryError = {
2276 PyVarObject_HEAD_INIT(NULL, 0)
2277 "MemoryError",
2278 sizeof(PyBaseExceptionObject),
2279 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2280 0, 0, 0, 0, 0, 0, 0,
2281 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2282 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2283 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2284 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2285 (initproc)BaseException_init, 0, MemoryError_new
2286};
2287PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2288
Thomas Wouters477c8d52006-05-27 19:21:47 +00002289
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002290/*
2291 * BufferError extends Exception
2292 */
2293SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2294
Thomas Wouters477c8d52006-05-27 19:21:47 +00002295
2296/* Warning category docstrings */
2297
2298/*
2299 * Warning extends Exception
2300 */
2301SimpleExtendsException(PyExc_Exception, Warning,
2302 "Base class for warning categories.");
2303
2304
2305/*
2306 * UserWarning extends Warning
2307 */
2308SimpleExtendsException(PyExc_Warning, UserWarning,
2309 "Base class for warnings generated by user code.");
2310
2311
2312/*
2313 * DeprecationWarning extends Warning
2314 */
2315SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2316 "Base class for warnings about deprecated features.");
2317
2318
2319/*
2320 * PendingDeprecationWarning extends Warning
2321 */
2322SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2323 "Base class for warnings about features which will be deprecated\n"
2324 "in the future.");
2325
2326
2327/*
2328 * SyntaxWarning extends Warning
2329 */
2330SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2331 "Base class for warnings about dubious syntax.");
2332
2333
2334/*
2335 * RuntimeWarning extends Warning
2336 */
2337SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2338 "Base class for warnings about dubious runtime behavior.");
2339
2340
2341/*
2342 * FutureWarning extends Warning
2343 */
2344SimpleExtendsException(PyExc_Warning, FutureWarning,
2345 "Base class for warnings about constructs that will change semantically\n"
2346 "in the future.");
2347
2348
2349/*
2350 * ImportWarning extends Warning
2351 */
2352SimpleExtendsException(PyExc_Warning, ImportWarning,
2353 "Base class for warnings about probable mistakes in module imports");
2354
2355
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002356/*
2357 * UnicodeWarning extends Warning
2358 */
2359SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2360 "Base class for warnings about Unicode related problems, mostly\n"
2361 "related to conversion problems.");
2362
Georg Brandl08be72d2010-10-24 15:11:22 +00002363
Guido van Rossum98297ee2007-11-06 21:34:58 +00002364/*
2365 * BytesWarning extends Warning
2366 */
2367SimpleExtendsException(PyExc_Warning, BytesWarning,
2368 "Base class for warnings about bytes and buffer related problems, mostly\n"
2369 "related to conversion from str or comparing to str.");
2370
2371
Georg Brandl08be72d2010-10-24 15:11:22 +00002372/*
2373 * ResourceWarning extends Warning
2374 */
2375SimpleExtendsException(PyExc_Warning, ResourceWarning,
2376 "Base class for warnings about resource usage.");
2377
2378
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002379
Yury Selivanovf488fb42015-07-03 01:04:23 -04002380/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002381 Meant to be used when normalizing the exception for exceeding the recursion
2382 depth will cause its own infinite recursion.
2383*/
2384PyObject *PyExc_RecursionErrorInst = NULL;
2385
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002386#define PRE_INIT(TYPE) \
2387 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2388 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2389 Py_FatalError("exceptions bootstrapping error."); \
2390 Py_INCREF(PyExc_ ## TYPE); \
2391 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002392
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002393#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002394 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2395 Py_FatalError("Module dictionary insertion problem.");
2396
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002397#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002398 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002399 PyExc_ ## NAME = PyExc_ ## TYPE; \
2400 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2401 Py_FatalError("Module dictionary insertion problem.");
2402
2403#define ADD_ERRNO(TYPE, CODE) { \
2404 PyObject *_code = PyLong_FromLong(CODE); \
2405 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2406 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2407 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002408 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002409 }
2410
2411#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002412#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002413/* The following constants were added to errno.h in VS2010 but have
2414 preferred WSA equivalents. */
2415#undef EADDRINUSE
2416#undef EADDRNOTAVAIL
2417#undef EAFNOSUPPORT
2418#undef EALREADY
2419#undef ECONNABORTED
2420#undef ECONNREFUSED
2421#undef ECONNRESET
2422#undef EDESTADDRREQ
2423#undef EHOSTUNREACH
2424#undef EINPROGRESS
2425#undef EISCONN
2426#undef ELOOP
2427#undef EMSGSIZE
2428#undef ENETDOWN
2429#undef ENETRESET
2430#undef ENETUNREACH
2431#undef ENOBUFS
2432#undef ENOPROTOOPT
2433#undef ENOTCONN
2434#undef ENOTSOCK
2435#undef EOPNOTSUPP
2436#undef EPROTONOSUPPORT
2437#undef EPROTOTYPE
2438#undef ETIMEDOUT
2439#undef EWOULDBLOCK
2440
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002441#if defined(WSAEALREADY) && !defined(EALREADY)
2442#define EALREADY WSAEALREADY
2443#endif
2444#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2445#define ECONNABORTED WSAECONNABORTED
2446#endif
2447#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2448#define ECONNREFUSED WSAECONNREFUSED
2449#endif
2450#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2451#define ECONNRESET WSAECONNRESET
2452#endif
2453#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2454#define EINPROGRESS WSAEINPROGRESS
2455#endif
2456#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2457#define ESHUTDOWN WSAESHUTDOWN
2458#endif
2459#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2460#define ETIMEDOUT WSAETIMEDOUT
2461#endif
2462#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2463#define EWOULDBLOCK WSAEWOULDBLOCK
2464#endif
2465#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002466
Martin v. Löwis1a214512008-06-11 05:26:20 +00002467void
Brett Cannonfd074152012-04-14 14:10:13 -04002468_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002469{
Brett Cannonfd074152012-04-14 14:10:13 -04002470 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002471
2472 PRE_INIT(BaseException)
2473 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002474 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002475 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002476 PRE_INIT(StopIteration)
2477 PRE_INIT(GeneratorExit)
2478 PRE_INIT(SystemExit)
2479 PRE_INIT(KeyboardInterrupt)
2480 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002481 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002482 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002483 PRE_INIT(EOFError)
2484 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002485 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002486 PRE_INIT(NotImplementedError)
2487 PRE_INIT(NameError)
2488 PRE_INIT(UnboundLocalError)
2489 PRE_INIT(AttributeError)
2490 PRE_INIT(SyntaxError)
2491 PRE_INIT(IndentationError)
2492 PRE_INIT(TabError)
2493 PRE_INIT(LookupError)
2494 PRE_INIT(IndexError)
2495 PRE_INIT(KeyError)
2496 PRE_INIT(ValueError)
2497 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002498 PRE_INIT(UnicodeEncodeError)
2499 PRE_INIT(UnicodeDecodeError)
2500 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002501 PRE_INIT(AssertionError)
2502 PRE_INIT(ArithmeticError)
2503 PRE_INIT(FloatingPointError)
2504 PRE_INIT(OverflowError)
2505 PRE_INIT(ZeroDivisionError)
2506 PRE_INIT(SystemError)
2507 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002508 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002509 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002510 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002511 PRE_INIT(Warning)
2512 PRE_INIT(UserWarning)
2513 PRE_INIT(DeprecationWarning)
2514 PRE_INIT(PendingDeprecationWarning)
2515 PRE_INIT(SyntaxWarning)
2516 PRE_INIT(RuntimeWarning)
2517 PRE_INIT(FutureWarning)
2518 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002519 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002520 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002521 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002522
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002523 /* OSError subclasses */
2524 PRE_INIT(ConnectionError);
2525
2526 PRE_INIT(BlockingIOError);
2527 PRE_INIT(BrokenPipeError);
2528 PRE_INIT(ChildProcessError);
2529 PRE_INIT(ConnectionAbortedError);
2530 PRE_INIT(ConnectionRefusedError);
2531 PRE_INIT(ConnectionResetError);
2532 PRE_INIT(FileExistsError);
2533 PRE_INIT(FileNotFoundError);
2534 PRE_INIT(IsADirectoryError);
2535 PRE_INIT(NotADirectoryError);
2536 PRE_INIT(InterruptedError);
2537 PRE_INIT(PermissionError);
2538 PRE_INIT(ProcessLookupError);
2539 PRE_INIT(TimeoutError);
2540
Thomas Wouters477c8d52006-05-27 19:21:47 +00002541 bdict = PyModule_GetDict(bltinmod);
2542 if (bdict == NULL)
2543 Py_FatalError("exceptions bootstrapping error.");
2544
2545 POST_INIT(BaseException)
2546 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002547 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002548 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002549 POST_INIT(StopIteration)
2550 POST_INIT(GeneratorExit)
2551 POST_INIT(SystemExit)
2552 POST_INIT(KeyboardInterrupt)
2553 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002554 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002555 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002556 INIT_ALIAS(EnvironmentError, OSError)
2557 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002558#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002559 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002561 POST_INIT(EOFError)
2562 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002563 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002564 POST_INIT(NotImplementedError)
2565 POST_INIT(NameError)
2566 POST_INIT(UnboundLocalError)
2567 POST_INIT(AttributeError)
2568 POST_INIT(SyntaxError)
2569 POST_INIT(IndentationError)
2570 POST_INIT(TabError)
2571 POST_INIT(LookupError)
2572 POST_INIT(IndexError)
2573 POST_INIT(KeyError)
2574 POST_INIT(ValueError)
2575 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002576 POST_INIT(UnicodeEncodeError)
2577 POST_INIT(UnicodeDecodeError)
2578 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579 POST_INIT(AssertionError)
2580 POST_INIT(ArithmeticError)
2581 POST_INIT(FloatingPointError)
2582 POST_INIT(OverflowError)
2583 POST_INIT(ZeroDivisionError)
2584 POST_INIT(SystemError)
2585 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002586 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002588 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002589 POST_INIT(Warning)
2590 POST_INIT(UserWarning)
2591 POST_INIT(DeprecationWarning)
2592 POST_INIT(PendingDeprecationWarning)
2593 POST_INIT(SyntaxWarning)
2594 POST_INIT(RuntimeWarning)
2595 POST_INIT(FutureWarning)
2596 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002597 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002598 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002599 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002600
Antoine Pitrouac456a12012-01-18 21:35:21 +01002601 if (!errnomap) {
2602 errnomap = PyDict_New();
2603 if (!errnomap)
2604 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2605 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002606
2607 /* OSError subclasses */
2608 POST_INIT(ConnectionError);
2609
2610 POST_INIT(BlockingIOError);
2611 ADD_ERRNO(BlockingIOError, EAGAIN);
2612 ADD_ERRNO(BlockingIOError, EALREADY);
2613 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2614 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2615 POST_INIT(BrokenPipeError);
2616 ADD_ERRNO(BrokenPipeError, EPIPE);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002617#ifdef ESHUTDOWN
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002618 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002619#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002620 POST_INIT(ChildProcessError);
2621 ADD_ERRNO(ChildProcessError, ECHILD);
2622 POST_INIT(ConnectionAbortedError);
2623 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2624 POST_INIT(ConnectionRefusedError);
2625 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2626 POST_INIT(ConnectionResetError);
2627 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2628 POST_INIT(FileExistsError);
2629 ADD_ERRNO(FileExistsError, EEXIST);
2630 POST_INIT(FileNotFoundError);
2631 ADD_ERRNO(FileNotFoundError, ENOENT);
2632 POST_INIT(IsADirectoryError);
2633 ADD_ERRNO(IsADirectoryError, EISDIR);
2634 POST_INIT(NotADirectoryError);
2635 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2636 POST_INIT(InterruptedError);
2637 ADD_ERRNO(InterruptedError, EINTR);
2638 POST_INIT(PermissionError);
2639 ADD_ERRNO(PermissionError, EACCES);
2640 ADD_ERRNO(PermissionError, EPERM);
2641 POST_INIT(ProcessLookupError);
2642 ADD_ERRNO(ProcessLookupError, ESRCH);
2643 POST_INIT(TimeoutError);
2644 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2645
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002646 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002647
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002648 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002649 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002650 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002651 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002652 "recursion errors");
2653 else {
2654 PyBaseExceptionObject *err_inst =
2655 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2656 PyObject *args_tuple;
2657 PyObject *exc_message;
2658 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2659 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002660 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002661 "pre-allocation");
2662 args_tuple = PyTuple_Pack(1, exc_message);
2663 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002664 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002665 "pre-allocation");
2666 Py_DECREF(exc_message);
2667 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002668 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002669 Py_DECREF(args_tuple);
2670 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002671 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002672}
2673
2674void
2675_PyExc_Fini(void)
2676{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002677 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002678 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002679 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002680}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002681
2682/* Helper to do the equivalent of "raise X from Y" in C, but always using
2683 * the current exception rather than passing one in.
2684 *
2685 * We currently limit this to *only* exceptions that use the BaseException
2686 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2687 * those correctly without losing data and without losing backwards
2688 * compatibility.
2689 *
2690 * We also aim to rule out *all* exceptions that might be storing additional
2691 * state, whether by having a size difference relative to BaseException,
2692 * additional arguments passed in during construction or by having a
2693 * non-empty instance dict.
2694 *
2695 * We need to be very careful with what we wrap, since changing types to
2696 * a broader exception type would be backwards incompatible for
2697 * existing codecs, and with different init or new method implementations
2698 * may either not support instantiation with PyErr_Format or lose
2699 * information when instantiated that way.
2700 *
2701 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2702 * fact that exceptions are expected to support pickling. If more builtin
2703 * exceptions (e.g. AttributeError) start to be converted to rich
2704 * exceptions with additional attributes, that's probably a better approach
2705 * to pursue over adding special cases for particular stateful subclasses.
2706 *
2707 * Returns a borrowed reference to the new exception (if any), NULL if the
2708 * existing exception was left in place.
2709 */
2710PyObject *
2711_PyErr_TrySetFromCause(const char *format, ...)
2712{
2713 PyObject* msg_prefix;
2714 PyObject *exc, *val, *tb;
2715 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002716 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002717 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002718 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002719 PyObject *new_exc, *new_val, *new_tb;
2720 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002721 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002722
Nick Coghlan8b097b42013-11-13 23:49:21 +10002723 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002724 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002725 /* Ensure type info indicates no extra state is stored at the C level
2726 * and that the type can be reinstantiated using PyErr_Format
2727 */
2728 caught_type_size = caught_type->tp_basicsize;
2729 base_exc_size = _PyExc_BaseException.tp_basicsize;
2730 same_basic_size = (
2731 caught_type_size == base_exc_size ||
2732 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002733 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002734 )
2735 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002736 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002737 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002738 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002739 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002740 /* We can't be sure we can wrap this safely, since it may contain
2741 * more state than just the exception type. Accordingly, we just
2742 * leave it alone.
2743 */
2744 PyErr_Restore(exc, val, tb);
2745 return NULL;
2746 }
2747
2748 /* Check the args are empty or contain a single string */
2749 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002750 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002751 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002752 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002753 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002754 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002755 /* More than 1 arg, or the one arg we do have isn't a string
2756 */
2757 PyErr_Restore(exc, val, tb);
2758 return NULL;
2759 }
2760
2761 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002762 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002763 if (dictptr != NULL && *dictptr != NULL &&
2764 PyObject_Length(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002765 /* While we could potentially copy a non-empty instance dictionary
2766 * to the replacement exception, for now we take the more
2767 * conservative path of leaving exceptions with attributes set
2768 * alone.
2769 */
2770 PyErr_Restore(exc, val, tb);
2771 return NULL;
2772 }
2773
2774 /* For exceptions that we can wrap safely, we chain the original
2775 * exception to a new one of the exact same type with an
2776 * error message that mentions the additional details and the
2777 * original exception.
2778 *
2779 * It would be nice to wrap OSError and various other exception
2780 * types as well, but that's quite a bit trickier due to the extra
2781 * state potentially stored on OSError instances.
2782 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002783 /* Ensure the traceback is set correctly on the existing exception */
2784 if (tb != NULL) {
2785 PyException_SetTraceback(val, tb);
2786 Py_DECREF(tb);
2787 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002788
Christian Heimes507eabd2013-11-14 01:39:35 +01002789#ifdef HAVE_STDARG_PROTOTYPES
2790 va_start(vargs, format);
2791#else
2792 va_start(vargs);
2793#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002794 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002795 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002796 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002797 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002798 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002799 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002800 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002801
2802 PyErr_Format(exc, "%U (%s: %S)",
2803 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002804 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002805 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002806 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2807 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2808 PyException_SetCause(new_val, val);
2809 PyErr_Restore(new_exc, new_val, new_tb);
2810 return new_val;
2811}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002812
2813
2814/* To help with migration from Python 2, SyntaxError.__init__ applies some
2815 * heuristics to try to report a more meaningful exception when print and
2816 * exec are used like statements.
2817 *
2818 * The heuristics are currently expected to detect the following cases:
2819 * - top level statement
2820 * - statement in a nested suite
2821 * - trailing section of a one line complex statement
2822 *
2823 * They're currently known not to trigger:
2824 * - after a semi-colon
2825 *
2826 * The error message can be a bit odd in cases where the "arguments" are
2827 * completely illegal syntactically, but that isn't worth the hassle of
2828 * fixing.
2829 *
2830 * We also can't do anything about cases that are legal Python 3 syntax
2831 * but mean something entirely different from what they did in Python 2
2832 * (omitting the arguments entirely, printing items preceded by a unary plus
2833 * or minus, using the stream redirection syntax).
2834 */
2835
2836static int
2837_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2838{
2839 /* Return values:
2840 * -1: an error occurred
2841 * 0: nothing happened
2842 * 1: the check triggered & the error message was changed
2843 */
2844 static PyObject *print_prefix = NULL;
2845 static PyObject *exec_prefix = NULL;
2846 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2847 int kind = PyUnicode_KIND(self->text);
2848 void *data = PyUnicode_DATA(self->text);
2849
2850 /* Ignore leading whitespace */
2851 while (start < text_len) {
2852 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2853 if (!Py_UNICODE_ISSPACE(ch))
2854 break;
2855 start++;
2856 }
2857 /* Checking against an empty or whitespace-only part of the string */
2858 if (start == text_len) {
2859 return 0;
2860 }
2861
2862 /* Check for legacy print statements */
2863 if (print_prefix == NULL) {
2864 print_prefix = PyUnicode_InternFromString("print ");
2865 if (print_prefix == NULL) {
2866 return -1;
2867 }
2868 }
2869 if (PyUnicode_Tailmatch(self->text, print_prefix,
2870 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002871 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002872 PyUnicode_FromString("Missing parentheses in call to 'print'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002873 return 1;
2874 }
2875
2876 /* Check for legacy exec statements */
2877 if (exec_prefix == NULL) {
2878 exec_prefix = PyUnicode_InternFromString("exec ");
2879 if (exec_prefix == NULL) {
2880 return -1;
2881 }
2882 }
2883 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2884 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002885 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002886 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002887 return 1;
2888 }
2889 /* Fall back to the default error message */
2890 return 0;
2891}
2892
2893static int
2894_report_missing_parentheses(PySyntaxErrorObject *self)
2895{
2896 Py_UCS4 left_paren = 40;
2897 Py_ssize_t left_paren_index;
2898 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2899 int legacy_check_result = 0;
2900
2901 /* Skip entirely if there is an opening parenthesis */
2902 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2903 0, text_len, 1);
2904 if (left_paren_index < -1) {
2905 return -1;
2906 }
2907 if (left_paren_index != -1) {
2908 /* Use default error message for any line with an opening paren */
2909 return 0;
2910 }
2911 /* Handle the simple statement case */
2912 legacy_check_result = _check_for_legacy_statements(self, 0);
2913 if (legacy_check_result < 0) {
2914 return -1;
2915
2916 }
2917 if (legacy_check_result == 0) {
2918 /* Handle the one-line complex statement case */
2919 Py_UCS4 colon = 58;
2920 Py_ssize_t colon_index;
2921 colon_index = PyUnicode_FindChar(self->text, colon,
2922 0, text_len, 1);
2923 if (colon_index < -1) {
2924 return -1;
2925 }
2926 if (colon_index >= 0 && colon_index < text_len) {
2927 /* Check again, starting from just after the colon */
2928 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2929 return -1;
2930 }
2931 }
2932 }
2933 return 0;
2934}