blob: 03bdf79de324638c4a14827da11c91dc5d729737 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#include "internal/mem.h"
10#include "internal/pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000011#include "structmember.h"
12#include "osdefs.h"
13
Thomas Wouters477c8d52006-05-27 19:21:47 +000014
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020015/* Compatibility aliases */
16PyObject *PyExc_EnvironmentError = NULL;
17PyObject *PyExc_IOError = NULL;
18#ifdef MS_WINDOWS
19PyObject *PyExc_WindowsError = NULL;
20#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020021
22/* The dict map from errno codes to OSError subclasses */
23static PyObject *errnomap = NULL;
24
25
Thomas Wouters477c8d52006-05-27 19:21:47 +000026/* NOTE: If the exception class hierarchy changes, don't forget to update
27 * Lib/test/exception_hierarchy.txt
28 */
29
Thomas Wouters477c8d52006-05-27 19:21:47 +000030/*
31 * BaseException
32 */
33static PyObject *
34BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
35{
36 PyBaseExceptionObject *self;
37
38 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000039 if (!self)
40 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000041 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000042 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000043 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070044 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000045
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010046 if (args) {
47 self->args = args;
48 Py_INCREF(args);
49 return (PyObject *)self;
50 }
51
Thomas Wouters477c8d52006-05-27 19:21:47 +000052 self->args = PyTuple_New(0);
53 if (!self->args) {
54 Py_DECREF(self);
55 return NULL;
56 }
57
Thomas Wouters477c8d52006-05-27 19:21:47 +000058 return (PyObject *)self;
59}
60
61static int
62BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
63{
Christian Heimes90aa7642007-12-19 02:45:37 +000064 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000065 return -1;
66
Serhiy Storchaka576f1322016-01-05 21:27:54 +020067 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030068 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000069
Thomas Wouters477c8d52006-05-27 19:21:47 +000070 return 0;
71}
72
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000073static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000074BaseException_clear(PyBaseExceptionObject *self)
75{
76 Py_CLEAR(self->dict);
77 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000078 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000079 Py_CLEAR(self->cause);
80 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000081 return 0;
82}
83
84static void
85BaseException_dealloc(PyBaseExceptionObject *self)
86{
Thomas Wouters89f507f2006-12-13 04:49:30 +000087 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000089 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000090}
91
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000092static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000093BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
94{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000095 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000097 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000098 Py_VISIT(self->cause);
99 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000100 return 0;
101}
102
103static PyObject *
104BaseException_str(PyBaseExceptionObject *self)
105{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000108 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000112 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000113 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114}
115
116static PyObject *
117BaseException_repr(PyBaseExceptionObject *self)
118{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300119 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200120 if (PyTuple_GET_SIZE(self->args) == 1)
121 return PyUnicode_FromFormat("%s(%R)", name,
122 PyTuple_GET_ITEM(self->args, 0));
123 else
124 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 *
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800184BaseException_get_args(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000185{
186 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000188 }
189 Py_INCREF(self->args);
190 return self->args;
191}
192
193static int
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800194BaseException_set_args(PyBaseExceptionObject *self, PyObject *val, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000195{
196 PyObject *seq;
197 if (val == NULL) {
198 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
199 return -1;
200 }
201 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500202 if (!seq)
203 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300204 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800209BaseException_get_tb(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000210{
211 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200212 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000213 }
214 Py_INCREF(self->traceback);
215 return self->traceback;
216}
217
218static int
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000220{
221 if (tb == NULL) {
222 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
223 return -1;
224 }
225 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
226 PyErr_SetString(PyExc_TypeError,
227 "__traceback__ must be a traceback or None");
228 return -1;
229 }
230
Serhiy Storchaka37665722016-08-20 21:22:03 +0300231 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300232 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000233 return 0;
234}
235
Georg Brandlab6f2f62009-03-31 04:16:10 +0000236static PyObject *
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800237BaseException_get_context(PyObject *self, void *Py_UNUSED(ignored))
238{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000239 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500240 if (res)
241 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000242 Py_RETURN_NONE;
243}
244
245static int
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800246BaseException_set_context(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
247{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000248 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 *
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800266BaseException_get_cause(PyObject *self, void *Py_UNUSED(ignored))
267{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000268 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500269 if (res)
270 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700271 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000272}
273
274static int
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800275BaseException_set_cause(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
276{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000277 if (arg == NULL) {
278 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
279 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700280 } else if (arg == Py_None) {
281 arg = NULL;
282 } else if (!PyExceptionInstance_Check(arg)) {
283 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
284 "or derive from BaseException");
285 return -1;
286 } else {
287 /* PyException_SetCause steals this reference */
288 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700290 PyException_SetCause(self, arg);
291 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000292}
293
Guido van Rossum360e4b82007-05-14 22:51:27 +0000294
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500296 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000297 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000298 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800299 {"__context__", BaseException_get_context,
300 BaseException_set_context, PyDoc_STR("exception context")},
301 {"__cause__", BaseException_get_cause,
302 BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000303 {NULL},
304};
305
306
Collin Winter828f04a2007-08-31 00:04:24 +0000307PyObject *
308PyException_GetTraceback(PyObject *self) {
309 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
310 Py_XINCREF(base_self->traceback);
311 return base_self->traceback;
312}
313
314
315int
316PyException_SetTraceback(PyObject *self, PyObject *tb) {
Miss Islington (bot)5ceb7012018-11-27 09:58:07 -0800317 return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL);
Collin Winter828f04a2007-08-31 00:04:24 +0000318}
319
320PyObject *
321PyException_GetCause(PyObject *self) {
322 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
323 Py_XINCREF(cause);
324 return cause;
325}
326
327/* Steals a reference to cause */
328void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200329PyException_SetCause(PyObject *self, PyObject *cause)
330{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700331 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300332 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000333}
334
335PyObject *
336PyException_GetContext(PyObject *self) {
337 PyObject *context = ((PyBaseExceptionObject *)self)->context;
338 Py_XINCREF(context);
339 return context;
340}
341
342/* Steals a reference to context */
343void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200344PyException_SetContext(PyObject *self, PyObject *context)
345{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300346 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000347}
348
349
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700350static struct PyMemberDef BaseException_members[] = {
351 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200352 offsetof(PyBaseExceptionObject, suppress_context)},
353 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700354};
355
356
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000358 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000359 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
361 0, /*tp_itemsize*/
362 (destructor)BaseException_dealloc, /*tp_dealloc*/
363 0, /*tp_print*/
364 0, /*tp_getattr*/
365 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000366 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000367 (reprfunc)BaseException_repr, /*tp_repr*/
368 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000369 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370 0, /*tp_as_mapping*/
371 0, /*tp_hash */
372 0, /*tp_call*/
373 (reprfunc)BaseException_str, /*tp_str*/
374 PyObject_GenericGetAttr, /*tp_getattro*/
375 PyObject_GenericSetAttr, /*tp_setattro*/
376 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000377 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
380 (traverseproc)BaseException_traverse, /* tp_traverse */
381 (inquiry)BaseException_clear, /* tp_clear */
382 0, /* tp_richcompare */
383 0, /* tp_weaklistoffset */
384 0, /* tp_iter */
385 0, /* tp_iternext */
386 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700387 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 BaseException_getset, /* tp_getset */
389 0, /* tp_base */
390 0, /* tp_dict */
391 0, /* tp_descr_get */
392 0, /* tp_descr_set */
393 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
394 (initproc)BaseException_init, /* tp_init */
395 0, /* tp_alloc */
396 BaseException_new, /* tp_new */
397};
398/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
399from the previous implmentation and also allowing Python objects to be used
400in the API */
401PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
402
403/* note these macros omit the last semicolon so the macro invocation may
404 * include it and not look strange.
405 */
406#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
407static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000408 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000409 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000410 sizeof(PyBaseExceptionObject), \
411 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
412 0, 0, 0, 0, 0, 0, 0, \
413 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
414 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
415 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
416 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
417 (initproc)BaseException_init, 0, BaseException_new,\
418}; \
419PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
420
421#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
422static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000423 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000424 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000426 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000427 0, 0, 0, 0, 0, \
428 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000429 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
430 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200432 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000433}; \
434PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
435
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200436#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
437 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
438 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000439static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000440 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000441 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442 sizeof(Py ## EXCSTORE ## Object), 0, \
443 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
444 (reprfunc)EXCSTR, 0, 0, 0, \
445 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
446 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
447 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200448 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000449 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200450 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000451}; \
452PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
453
454
455/*
456 * Exception extends BaseException
457 */
458SimpleExtendsException(PyExc_BaseException, Exception,
459 "Common base class for all non-exit exceptions.");
460
461
462/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000465SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 "Inappropriate argument type.");
467
468
469/*
Yury Selivanov75445082015-05-11 22:57:16 -0400470 * StopAsyncIteration extends Exception
471 */
472SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
473 "Signal the end from iterator.__anext__().");
474
475
476/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000477 * StopIteration extends Exception
478 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000479
480static PyMemberDef StopIteration_members[] = {
481 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
482 PyDoc_STR("generator return value")},
483 {NULL} /* Sentinel */
484};
485
486static int
487StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
488{
489 Py_ssize_t size = PyTuple_GET_SIZE(args);
490 PyObject *value;
491
492 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
493 return -1;
494 Py_CLEAR(self->value);
495 if (size > 0)
496 value = PyTuple_GET_ITEM(args, 0);
497 else
498 value = Py_None;
499 Py_INCREF(value);
500 self->value = value;
501 return 0;
502}
503
504static int
505StopIteration_clear(PyStopIterationObject *self)
506{
507 Py_CLEAR(self->value);
508 return BaseException_clear((PyBaseExceptionObject *)self);
509}
510
511static void
512StopIteration_dealloc(PyStopIterationObject *self)
513{
514 _PyObject_GC_UNTRACK(self);
515 StopIteration_clear(self);
516 Py_TYPE(self)->tp_free((PyObject *)self);
517}
518
519static int
520StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
521{
522 Py_VISIT(self->value);
523 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
524}
525
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000526ComplexExtendsException(
527 PyExc_Exception, /* base */
528 StopIteration, /* name */
529 StopIteration, /* prefix for *_init, etc */
530 0, /* new */
531 0, /* methods */
532 StopIteration_members, /* members */
533 0, /* getset */
534 0, /* str */
535 "Signal the end from iterator.__next__()."
536);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537
538
539/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000540 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000542SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000543 "Request that a generator exit.");
544
545
546/*
547 * SystemExit extends BaseException
548 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000549
550static int
551SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
552{
553 Py_ssize_t size = PyTuple_GET_SIZE(args);
554
555 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
556 return -1;
557
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000558 if (size == 0)
559 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200560 if (size == 1) {
561 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300562 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200563 }
564 else { /* size > 1 */
565 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300566 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200567 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568 return 0;
569}
570
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000571static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000572SystemExit_clear(PySystemExitObject *self)
573{
574 Py_CLEAR(self->code);
575 return BaseException_clear((PyBaseExceptionObject *)self);
576}
577
578static void
579SystemExit_dealloc(PySystemExitObject *self)
580{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000581 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000583 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000584}
585
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000586static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000587SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
588{
589 Py_VISIT(self->code);
590 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
591}
592
593static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000594 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
595 PyDoc_STR("exception code")},
596 {NULL} /* Sentinel */
597};
598
599ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200600 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000601 "Request to exit from the interpreter.");
602
603/*
604 * KeyboardInterrupt extends BaseException
605 */
606SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
607 "Program interrupted by user.");
608
609
610/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000611 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000612 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000613
Brett Cannon79ec55e2012-04-12 20:24:54 -0400614static int
615ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
616{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300617 static char *kwlist[] = {"name", "path", 0};
618 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400619 PyObject *msg = NULL;
620 PyObject *name = NULL;
621 PyObject *path = NULL;
622
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300623 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400624 return -1;
625
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300626 empty_tuple = PyTuple_New(0);
627 if (!empty_tuple)
628 return -1;
629 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
630 &name, &path)) {
631 Py_DECREF(empty_tuple);
632 return -1;
633 }
634 Py_DECREF(empty_tuple);
635
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300636 Py_XINCREF(name);
637 Py_XSETREF(self->name, name);
638
639 Py_XINCREF(path);
640 Py_XSETREF(self->path, path);
641
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300642 if (PyTuple_GET_SIZE(args) == 1) {
643 msg = PyTuple_GET_ITEM(args, 0);
644 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300645 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300646 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400647
648 return 0;
649}
650
651static int
652ImportError_clear(PyImportErrorObject *self)
653{
654 Py_CLEAR(self->msg);
655 Py_CLEAR(self->name);
656 Py_CLEAR(self->path);
657 return BaseException_clear((PyBaseExceptionObject *)self);
658}
659
660static void
661ImportError_dealloc(PyImportErrorObject *self)
662{
663 _PyObject_GC_UNTRACK(self);
664 ImportError_clear(self);
665 Py_TYPE(self)->tp_free((PyObject *)self);
666}
667
668static int
669ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
670{
671 Py_VISIT(self->msg);
672 Py_VISIT(self->name);
673 Py_VISIT(self->path);
674 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
675}
676
677static PyObject *
678ImportError_str(PyImportErrorObject *self)
679{
Brett Cannon07c6e712012-08-24 13:05:09 -0400680 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400681 Py_INCREF(self->msg);
682 return self->msg;
683 }
684 else {
685 return BaseException_str((PyBaseExceptionObject *)self);
686 }
687}
688
Serhiy Storchakab7853962017-04-08 09:55:07 +0300689static PyObject *
690ImportError_getstate(PyImportErrorObject *self)
691{
692 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
693 if (self->name || self->path) {
694 _Py_IDENTIFIER(name);
695 _Py_IDENTIFIER(path);
696 dict = dict ? PyDict_Copy(dict) : PyDict_New();
697 if (dict == NULL)
698 return NULL;
699 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
700 Py_DECREF(dict);
701 return NULL;
702 }
703 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
704 Py_DECREF(dict);
705 return NULL;
706 }
707 return dict;
708 }
709 else if (dict) {
710 Py_INCREF(dict);
711 return dict;
712 }
713 else {
714 Py_RETURN_NONE;
715 }
716}
717
718/* Pickling support */
719static PyObject *
720ImportError_reduce(PyImportErrorObject *self)
721{
722 PyObject *res;
723 PyObject *args;
724 PyObject *state = ImportError_getstate(self);
725 if (state == NULL)
726 return NULL;
727 args = ((PyBaseExceptionObject *)self)->args;
728 if (state == Py_None)
729 res = PyTuple_Pack(2, Py_TYPE(self), args);
730 else
731 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
732 Py_DECREF(state);
733 return res;
734}
735
Brett Cannon79ec55e2012-04-12 20:24:54 -0400736static PyMemberDef ImportError_members[] = {
737 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
738 PyDoc_STR("exception message")},
739 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
740 PyDoc_STR("module name")},
741 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
742 PyDoc_STR("module path")},
743 {NULL} /* Sentinel */
744};
745
746static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300747 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400748 {NULL}
749};
750
751ComplexExtendsException(PyExc_Exception, ImportError,
752 ImportError, 0 /* new */,
753 ImportError_methods, ImportError_members,
754 0 /* getset */, ImportError_str,
755 "Import can't find module, or can't find name in "
756 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000757
758/*
Eric Snowc9432652016-09-07 15:42:32 -0700759 * ModuleNotFoundError extends ImportError
760 */
761
762MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
763 "Module not found.");
764
765/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200766 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000767 */
768
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200769#ifdef MS_WINDOWS
770#include "errmap.h"
771#endif
772
Thomas Wouters477c8d52006-05-27 19:21:47 +0000773/* Where a function has a single filename, such as open() or some
774 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
775 * called, giving a third argument which is the filename. But, so
776 * that old code using in-place unpacking doesn't break, e.g.:
777 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200778 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000779 *
780 * we hack args so that it only contains two items. This also
781 * means we need our own __str__() which prints out the filename
782 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800783 *
784 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800785 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
786 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000787 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200788
Antoine Pitroue0e27352011-12-15 14:31:28 +0100789/* This function doesn't cleanup on error, the caller should */
790static int
791oserror_parse_args(PyObject **p_args,
792 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800793 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200794#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100795 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200796#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100797 )
798{
799 Py_ssize_t nargs;
800 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800801#ifndef MS_WINDOWS
802 /*
803 * ignored on non-Windows platforms,
804 * but parsed so OSError has a consistent signature
805 */
806 PyObject *_winerror = NULL;
807 PyObject **winerror = &_winerror;
808#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200810 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000811
Larry Hastingsb0827312014-02-09 22:05:19 -0800812 if (nargs >= 2 && nargs <= 5) {
813 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
814 myerrno, strerror,
815 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100816 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800817#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100818 if (*winerror && PyLong_Check(*winerror)) {
819 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 PyObject *newargs;
821 Py_ssize_t i;
822
Antoine Pitroue0e27352011-12-15 14:31:28 +0100823 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200824 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100825 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200826 /* Set errno to the corresponding POSIX errno (overriding
827 first argument). Windows Socket error codes (>= 10000)
828 have the same value as their POSIX counterparts.
829 */
830 if (winerrcode < 10000)
831 errcode = winerror_to_errno(winerrcode);
832 else
833 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100834 *myerrno = PyLong_FromLong(errcode);
835 if (!*myerrno)
836 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200837 newargs = PyTuple_New(nargs);
838 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100839 return -1;
840 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200841 for (i = 1; i < nargs; i++) {
842 PyObject *val = PyTuple_GET_ITEM(args, i);
843 Py_INCREF(val);
844 PyTuple_SET_ITEM(newargs, i, val);
845 }
846 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100847 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200848 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800849#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200850 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000851
Antoine Pitroue0e27352011-12-15 14:31:28 +0100852 return 0;
853}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000854
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855static int
856oserror_init(PyOSErrorObject *self, PyObject **p_args,
857 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800858 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100859#ifdef MS_WINDOWS
860 , PyObject *winerror
861#endif
862 )
863{
864 PyObject *args = *p_args;
865 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000866
867 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200868 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100869 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200870 PyNumber_Check(filename)) {
871 /* BlockingIOError's 3rd argument can be the number of
872 * characters written.
873 */
874 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
875 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100876 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200877 }
878 else {
879 Py_INCREF(filename);
880 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881
Larry Hastingsb0827312014-02-09 22:05:19 -0800882 if (filename2 && filename2 != Py_None) {
883 Py_INCREF(filename2);
884 self->filename2 = filename2;
885 }
886
887 if (nargs >= 2 && nargs <= 5) {
888 /* filename, filename2, and winerror are removed from the args tuple
889 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100890 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100892 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000893
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200894 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100895 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200896 }
897 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000898 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200899 Py_XINCREF(myerrno);
900 self->myerrno = myerrno;
901
902 Py_XINCREF(strerror);
903 self->strerror = strerror;
904
905#ifdef MS_WINDOWS
906 Py_XINCREF(winerror);
907 self->winerror = winerror;
908#endif
909
Antoine Pitroue0e27352011-12-15 14:31:28 +0100910 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300911 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100912 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100913
914 return 0;
915}
916
917static PyObject *
918OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
919static int
920OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
921
922static int
923oserror_use_init(PyTypeObject *type)
924{
Martin Panter7462b6492015-11-02 03:37:02 +0000925 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100926 extraneous argument to __new__ to be ignored. The only reasonable
927 solution, given __new__ takes a variable number of arguments,
928 is to defer arg parsing and initialization to __init__.
929
Martin Pantere26da7c2016-06-02 10:07:09 +0000930 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100931 with the right arguments.
932
933 (see http://bugs.python.org/issue12555#msg148829 )
934 */
935 if (type->tp_init != (initproc) OSError_init &&
936 type->tp_new == (newfunc) OSError_new) {
937 assert((PyObject *) type != PyExc_OSError);
938 return 1;
939 }
940 return 0;
941}
942
943static PyObject *
944OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
945{
946 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800947 PyObject *myerrno = NULL, *strerror = NULL;
948 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100949#ifdef MS_WINDOWS
950 PyObject *winerror = NULL;
951#endif
952
Victor Stinner46ef3192013-11-14 22:31:41 +0100953 Py_INCREF(args);
954
Antoine Pitroue0e27352011-12-15 14:31:28 +0100955 if (!oserror_use_init(type)) {
956 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100957 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100958
Larry Hastingsb0827312014-02-09 22:05:19 -0800959 if (oserror_parse_args(&args, &myerrno, &strerror,
960 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100961#ifdef MS_WINDOWS
962 , &winerror
963#endif
964 ))
965 goto error;
966
967 if (myerrno && PyLong_Check(myerrno) &&
968 errnomap && (PyObject *) type == PyExc_OSError) {
969 PyObject *newtype;
970 newtype = PyDict_GetItem(errnomap, myerrno);
971 if (newtype) {
972 assert(PyType_Check(newtype));
973 type = (PyTypeObject *) newtype;
974 }
975 else if (PyErr_Occurred())
976 goto error;
977 }
978 }
979
980 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
981 if (!self)
982 goto error;
983
984 self->dict = NULL;
985 self->traceback = self->cause = self->context = NULL;
986 self->written = -1;
987
988 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800989 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100990#ifdef MS_WINDOWS
991 , winerror
992#endif
993 ))
994 goto error;
995 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200996 else {
997 self->args = PyTuple_New(0);
998 if (self->args == NULL)
999 goto error;
1000 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001001
Victor Stinner46ef3192013-11-14 22:31:41 +01001002 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001003 return (PyObject *) self;
1004
1005error:
1006 Py_XDECREF(args);
1007 Py_XDECREF(self);
1008 return NULL;
1009}
1010
1011static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001012OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001013{
Larry Hastingsb0827312014-02-09 22:05:19 -08001014 PyObject *myerrno = NULL, *strerror = NULL;
1015 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001016#ifdef MS_WINDOWS
1017 PyObject *winerror = NULL;
1018#endif
1019
1020 if (!oserror_use_init(Py_TYPE(self)))
1021 /* Everything already done in OSError_new */
1022 return 0;
1023
1024 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1025 return -1;
1026
1027 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001028 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001029#ifdef MS_WINDOWS
1030 , &winerror
1031#endif
1032 ))
1033 goto error;
1034
Larry Hastingsb0827312014-02-09 22:05:19 -08001035 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001036#ifdef MS_WINDOWS
1037 , winerror
1038#endif
1039 ))
1040 goto error;
1041
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001043
1044error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001045 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001046 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001047}
1048
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001049static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001050OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051{
1052 Py_CLEAR(self->myerrno);
1053 Py_CLEAR(self->strerror);
1054 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001055 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056#ifdef MS_WINDOWS
1057 Py_CLEAR(self->winerror);
1058#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001059 return BaseException_clear((PyBaseExceptionObject *)self);
1060}
1061
1062static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001063OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001066 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001067 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068}
1069
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001070static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072 void *arg)
1073{
1074 Py_VISIT(self->myerrno);
1075 Py_VISIT(self->strerror);
1076 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001077 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078#ifdef MS_WINDOWS
1079 Py_VISIT(self->winerror);
1080#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1082}
1083
1084static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001085OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086{
Larry Hastingsb0827312014-02-09 22:05:19 -08001087#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001088#ifdef MS_WINDOWS
1089 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001090 if (self->winerror && self->filename) {
1091 if (self->filename2) {
1092 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1093 OR_NONE(self->winerror),
1094 OR_NONE(self->strerror),
1095 self->filename,
1096 self->filename2);
1097 } else {
1098 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1099 OR_NONE(self->winerror),
1100 OR_NONE(self->strerror),
1101 self->filename);
1102 }
1103 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001105 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001106 self->winerror ? self->winerror: Py_None,
1107 self->strerror ? self->strerror: Py_None);
1108#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001109 if (self->filename) {
1110 if (self->filename2) {
1111 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1112 OR_NONE(self->myerrno),
1113 OR_NONE(self->strerror),
1114 self->filename,
1115 self->filename2);
1116 } else {
1117 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1118 OR_NONE(self->myerrno),
1119 OR_NONE(self->strerror),
1120 self->filename);
1121 }
1122 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001123 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001124 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001125 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001126 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127}
1128
Thomas Wouters477c8d52006-05-27 19:21:47 +00001129static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131{
1132 PyObject *args = self->args;
1133 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001136 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001137 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001138 Py_ssize_t size = self->filename2 ? 5 : 3;
1139 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001140 if (!args)
1141 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001142
1143 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 Py_INCREF(tmp);
1145 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001146
1147 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148 Py_INCREF(tmp);
1149 PyTuple_SET_ITEM(args, 1, tmp);
1150
1151 Py_INCREF(self->filename);
1152 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001153
1154 if (self->filename2) {
1155 /*
1156 * This tuple is essentially used as OSError(*args).
1157 * So, to recreate filename2, we need to pass in
1158 * winerror as well.
1159 */
1160 Py_INCREF(Py_None);
1161 PyTuple_SET_ITEM(args, 3, Py_None);
1162
1163 /* filename2 */
1164 Py_INCREF(self->filename2);
1165 PyTuple_SET_ITEM(args, 4, self->filename2);
1166 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001167 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001168 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001169
1170 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001171 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001172 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001173 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001174 Py_DECREF(args);
1175 return res;
1176}
1177
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001178static PyObject *
1179OSError_written_get(PyOSErrorObject *self, void *context)
1180{
1181 if (self->written == -1) {
1182 PyErr_SetString(PyExc_AttributeError, "characters_written");
1183 return NULL;
1184 }
1185 return PyLong_FromSsize_t(self->written);
1186}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001187
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001188static int
1189OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1190{
1191 Py_ssize_t n;
1192 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1193 if (n == -1 && PyErr_Occurred())
1194 return -1;
1195 self->written = n;
1196 return 0;
1197}
1198
1199static PyMemberDef OSError_members[] = {
1200 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1201 PyDoc_STR("POSIX exception code")},
1202 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1203 PyDoc_STR("exception strerror")},
1204 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1205 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001206 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1207 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001208#ifdef MS_WINDOWS
1209 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1210 PyDoc_STR("Win32 exception code")},
1211#endif
1212 {NULL} /* Sentinel */
1213};
1214
1215static PyMethodDef OSError_methods[] = {
1216 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001217 {NULL}
1218};
1219
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001220static PyGetSetDef OSError_getset[] = {
1221 {"characters_written", (getter) OSError_written_get,
1222 (setter) OSError_written_set, NULL},
1223 {NULL}
1224};
1225
1226
1227ComplexExtendsException(PyExc_Exception, OSError,
1228 OSError, OSError_new,
1229 OSError_methods, OSError_members, OSError_getset,
1230 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001231 "Base class for I/O related errors.");
1232
1233
1234/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001235 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001237MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1238 "I/O operation would block.");
1239MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1240 "Connection error.");
1241MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1242 "Child process error.");
1243MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1244 "Broken pipe.");
1245MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1246 "Connection aborted.");
1247MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1248 "Connection refused.");
1249MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1250 "Connection reset.");
1251MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1252 "File already exists.");
1253MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1254 "File not found.");
1255MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1256 "Operation doesn't work on directories.");
1257MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1258 "Operation only works on directories.");
1259MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1260 "Interrupted by signal.");
1261MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1262 "Not enough permissions.");
1263MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1264 "Process not found.");
1265MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1266 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267
1268/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001269 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001271SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001272 "Read beyond end of file.");
1273
1274
1275/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001276 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001277 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001278SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001279 "Unspecified run-time error.");
1280
Yury Selivanovf488fb42015-07-03 01:04:23 -04001281/*
1282 * RecursionError extends RuntimeError
1283 */
1284SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1285 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001286
1287/*
1288 * NotImplementedError extends RuntimeError
1289 */
1290SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1291 "Method or function hasn't been implemented yet.");
1292
1293/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001294 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001296SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001297 "Name not found globally.");
1298
1299/*
1300 * UnboundLocalError extends NameError
1301 */
1302SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1303 "Local name referenced but not bound to a value.");
1304
1305/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001306 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001307 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001308SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001309 "Attribute not found.");
1310
1311
1312/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001313 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001316/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001317static int _report_missing_parentheses(PySyntaxErrorObject *self);
1318
Thomas Wouters477c8d52006-05-27 19:21:47 +00001319static int
1320SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1321{
1322 PyObject *info = NULL;
1323 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1324
1325 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1326 return -1;
1327
1328 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001329 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001330 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001331 }
1332 if (lenargs == 2) {
1333 info = PyTuple_GET_ITEM(args, 1);
1334 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001335 if (!info)
1336 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001338 if (PyTuple_GET_SIZE(info) != 4) {
1339 /* not a very good error message, but it's what Python 2.4 gives */
1340 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1341 Py_DECREF(info);
1342 return -1;
1343 }
1344
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001345 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001346 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001348 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001349 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001350
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001351 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001352 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001354 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001355 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001356
1357 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001358
Martijn Pieters772d8092017-08-22 21:16:23 +01001359 /*
1360 * Issue #21669: Custom error for 'print' & 'exec' as statements
1361 *
1362 * Only applies to SyntaxError instances, not to subclasses such
1363 * as TabError or IndentationError (see issue #31161)
1364 */
1365 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1366 self->text && PyUnicode_Check(self->text) &&
1367 _report_missing_parentheses(self) < 0) {
1368 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001369 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370 }
1371 return 0;
1372}
1373
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001374static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001375SyntaxError_clear(PySyntaxErrorObject *self)
1376{
1377 Py_CLEAR(self->msg);
1378 Py_CLEAR(self->filename);
1379 Py_CLEAR(self->lineno);
1380 Py_CLEAR(self->offset);
1381 Py_CLEAR(self->text);
1382 Py_CLEAR(self->print_file_and_line);
1383 return BaseException_clear((PyBaseExceptionObject *)self);
1384}
1385
1386static void
1387SyntaxError_dealloc(PySyntaxErrorObject *self)
1388{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001389 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001390 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001391 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001392}
1393
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001394static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001395SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1396{
1397 Py_VISIT(self->msg);
1398 Py_VISIT(self->filename);
1399 Py_VISIT(self->lineno);
1400 Py_VISIT(self->offset);
1401 Py_VISIT(self->text);
1402 Py_VISIT(self->print_file_and_line);
1403 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1404}
1405
1406/* This is called "my_basename" instead of just "basename" to avoid name
1407 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1408 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001409static PyObject*
1410my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001411{
Victor Stinner6237daf2010-04-28 17:26:19 +00001412 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001413 int kind;
1414 void *data;
1415
1416 if (PyUnicode_READY(name))
1417 return NULL;
1418 kind = PyUnicode_KIND(name);
1419 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001420 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001421 offset = 0;
1422 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001423 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001424 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001425 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001426 if (offset != 0)
1427 return PyUnicode_Substring(name, offset, size);
1428 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001429 Py_INCREF(name);
1430 return name;
1431 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001432}
1433
1434
1435static PyObject *
1436SyntaxError_str(PySyntaxErrorObject *self)
1437{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001438 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001439 PyObject *filename;
1440 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001441 /* Below, we always ignore overflow errors, just printing -1.
1442 Still, we cannot allow an OverflowError to be raised, so
1443 we need to call PyLong_AsLongAndOverflow. */
1444 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001445
1446 /* XXX -- do all the additional formatting with filename and
1447 lineno here */
1448
Neal Norwitzed2b7392007-08-26 04:51:10 +00001449 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001450 filename = my_basename(self->filename);
1451 if (filename == NULL)
1452 return NULL;
1453 } else {
1454 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001455 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001456 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001457
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001458 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001459 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001460
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001461 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001462 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001463 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001464 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001466 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001467 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001468 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001469 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001470 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001471 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001472 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001473 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001474 Py_XDECREF(filename);
1475 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001476}
1477
1478static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001479 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1480 PyDoc_STR("exception msg")},
1481 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1482 PyDoc_STR("exception filename")},
1483 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1484 PyDoc_STR("exception lineno")},
1485 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1486 PyDoc_STR("exception offset")},
1487 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1488 PyDoc_STR("exception text")},
1489 {"print_file_and_line", T_OBJECT,
1490 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1491 PyDoc_STR("exception print_file_and_line")},
1492 {NULL} /* Sentinel */
1493};
1494
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001495ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001496 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001497 SyntaxError_str, "Invalid syntax.");
1498
1499
1500/*
1501 * IndentationError extends SyntaxError
1502 */
1503MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1504 "Improper indentation.");
1505
1506
1507/*
1508 * TabError extends IndentationError
1509 */
1510MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1511 "Improper mixture of spaces and tabs.");
1512
1513
1514/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001515 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001516 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001517SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001518 "Base class for lookup errors.");
1519
1520
1521/*
1522 * IndexError extends LookupError
1523 */
1524SimpleExtendsException(PyExc_LookupError, IndexError,
1525 "Sequence index out of range.");
1526
1527
1528/*
1529 * KeyError extends LookupError
1530 */
1531static PyObject *
1532KeyError_str(PyBaseExceptionObject *self)
1533{
1534 /* If args is a tuple of exactly one item, apply repr to args[0].
1535 This is done so that e.g. the exception raised by {}[''] prints
1536 KeyError: ''
1537 rather than the confusing
1538 KeyError
1539 alone. The downside is that if KeyError is raised with an explanatory
1540 string, that string will be displayed in quotes. Too bad.
1541 If args is anything else, use the default BaseException__str__().
1542 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001543 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001544 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001545 }
1546 return BaseException_str(self);
1547}
1548
1549ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001550 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001551
1552
1553/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001554 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001555 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001556SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001557 "Inappropriate argument value (of correct type).");
1558
1559/*
1560 * UnicodeError extends ValueError
1561 */
1562
1563SimpleExtendsException(PyExc_ValueError, UnicodeError,
1564 "Unicode related error.");
1565
Thomas Wouters477c8d52006-05-27 19:21:47 +00001566static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001567get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001568{
1569 if (!attr) {
1570 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1571 return NULL;
1572 }
1573
Christian Heimes72b710a2008-05-26 13:28:38 +00001574 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001575 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1576 return NULL;
1577 }
1578 Py_INCREF(attr);
1579 return attr;
1580}
1581
1582static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001583get_unicode(PyObject *attr, const char *name)
1584{
1585 if (!attr) {
1586 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1587 return NULL;
1588 }
1589
1590 if (!PyUnicode_Check(attr)) {
1591 PyErr_Format(PyExc_TypeError,
1592 "%.200s attribute must be unicode", name);
1593 return NULL;
1594 }
1595 Py_INCREF(attr);
1596 return attr;
1597}
1598
Walter Dörwaldd2034312007-05-18 16:29:38 +00001599static int
1600set_unicodefromstring(PyObject **attr, const char *value)
1601{
1602 PyObject *obj = PyUnicode_FromString(value);
1603 if (!obj)
1604 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001605 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001606 return 0;
1607}
1608
Thomas Wouters477c8d52006-05-27 19:21:47 +00001609PyObject *
1610PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1611{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001612 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001613}
1614
1615PyObject *
1616PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1617{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001618 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001619}
1620
1621PyObject *
1622PyUnicodeEncodeError_GetObject(PyObject *exc)
1623{
1624 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1625}
1626
1627PyObject *
1628PyUnicodeDecodeError_GetObject(PyObject *exc)
1629{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001630 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001631}
1632
1633PyObject *
1634PyUnicodeTranslateError_GetObject(PyObject *exc)
1635{
1636 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1637}
1638
1639int
1640PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1641{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001642 Py_ssize_t size;
1643 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1644 "object");
1645 if (!obj)
1646 return -1;
1647 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001648 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001649 if (*start<0)
1650 *start = 0; /*XXX check for values <0*/
1651 if (*start>=size)
1652 *start = size-1;
1653 Py_DECREF(obj);
1654 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655}
1656
1657
1658int
1659PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1660{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001661 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001662 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001663 if (!obj)
1664 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001665 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001666 *start = ((PyUnicodeErrorObject *)exc)->start;
1667 if (*start<0)
1668 *start = 0;
1669 if (*start>=size)
1670 *start = size-1;
1671 Py_DECREF(obj);
1672 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001673}
1674
1675
1676int
1677PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1678{
1679 return PyUnicodeEncodeError_GetStart(exc, start);
1680}
1681
1682
1683int
1684PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1685{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001686 ((PyUnicodeErrorObject *)exc)->start = start;
1687 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001688}
1689
1690
1691int
1692PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1693{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001694 ((PyUnicodeErrorObject *)exc)->start = start;
1695 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001696}
1697
1698
1699int
1700PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1701{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001702 ((PyUnicodeErrorObject *)exc)->start = start;
1703 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704}
1705
1706
1707int
1708PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1709{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001710 Py_ssize_t size;
1711 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1712 "object");
1713 if (!obj)
1714 return -1;
1715 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001716 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001717 if (*end<1)
1718 *end = 1;
1719 if (*end>size)
1720 *end = size;
1721 Py_DECREF(obj);
1722 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723}
1724
1725
1726int
1727PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1728{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001729 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001730 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001731 if (!obj)
1732 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001733 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001734 *end = ((PyUnicodeErrorObject *)exc)->end;
1735 if (*end<1)
1736 *end = 1;
1737 if (*end>size)
1738 *end = size;
1739 Py_DECREF(obj);
1740 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001741}
1742
1743
1744int
1745PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1746{
1747 return PyUnicodeEncodeError_GetEnd(exc, start);
1748}
1749
1750
1751int
1752PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1753{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001754 ((PyUnicodeErrorObject *)exc)->end = end;
1755 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001756}
1757
1758
1759int
1760PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1761{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001762 ((PyUnicodeErrorObject *)exc)->end = end;
1763 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001764}
1765
1766
1767int
1768PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1769{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001770 ((PyUnicodeErrorObject *)exc)->end = end;
1771 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772}
1773
1774PyObject *
1775PyUnicodeEncodeError_GetReason(PyObject *exc)
1776{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001777 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001778}
1779
1780
1781PyObject *
1782PyUnicodeDecodeError_GetReason(PyObject *exc)
1783{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001784 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001785}
1786
1787
1788PyObject *
1789PyUnicodeTranslateError_GetReason(PyObject *exc)
1790{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001791 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001792}
1793
1794
1795int
1796PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1797{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001798 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1799 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800}
1801
1802
1803int
1804PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1805{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001806 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1807 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808}
1809
1810
1811int
1812PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1813{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001814 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1815 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816}
1817
1818
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820UnicodeError_clear(PyUnicodeErrorObject *self)
1821{
1822 Py_CLEAR(self->encoding);
1823 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824 Py_CLEAR(self->reason);
1825 return BaseException_clear((PyBaseExceptionObject *)self);
1826}
1827
1828static void
1829UnicodeError_dealloc(PyUnicodeErrorObject *self)
1830{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001831 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001833 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001834}
1835
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001836static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1838{
1839 Py_VISIT(self->encoding);
1840 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001841 Py_VISIT(self->reason);
1842 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1843}
1844
1845static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1847 PyDoc_STR("exception encoding")},
1848 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1849 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001850 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001852 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853 PyDoc_STR("exception end")},
1854 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1855 PyDoc_STR("exception reason")},
1856 {NULL} /* Sentinel */
1857};
1858
1859
1860/*
1861 * UnicodeEncodeError extends UnicodeError
1862 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001863
1864static int
1865UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1866{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001867 PyUnicodeErrorObject *err;
1868
Thomas Wouters477c8d52006-05-27 19:21:47 +00001869 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1870 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001871
1872 err = (PyUnicodeErrorObject *)self;
1873
1874 Py_CLEAR(err->encoding);
1875 Py_CLEAR(err->object);
1876 Py_CLEAR(err->reason);
1877
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001878 if (!PyArg_ParseTuple(args, "UUnnU",
1879 &err->encoding, &err->object,
1880 &err->start, &err->end, &err->reason)) {
1881 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001882 return -1;
1883 }
1884
Guido van Rossum98297ee2007-11-06 21:34:58 +00001885 Py_INCREF(err->encoding);
1886 Py_INCREF(err->object);
1887 Py_INCREF(err->reason);
1888
1889 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001890}
1891
1892static PyObject *
1893UnicodeEncodeError_str(PyObject *self)
1894{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001895 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001896 PyObject *result = NULL;
1897 PyObject *reason_str = NULL;
1898 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001900 if (!uself->object)
1901 /* Not properly initialized. */
1902 return PyUnicode_FromString("");
1903
Eric Smith0facd772010-02-24 15:42:29 +00001904 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001905 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001906 reason_str = PyObject_Str(uself->reason);
1907 if (reason_str == NULL)
1908 goto done;
1909 encoding_str = PyObject_Str(uself->encoding);
1910 if (encoding_str == NULL)
1911 goto done;
1912
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001913 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1914 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001915 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001916 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001917 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001918 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001919 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001920 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001921 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001922 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001923 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001924 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001925 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001926 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001927 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001928 }
Eric Smith0facd772010-02-24 15:42:29 +00001929 else {
1930 result = PyUnicode_FromFormat(
1931 "'%U' codec can't encode characters in position %zd-%zd: %U",
1932 encoding_str,
1933 uself->start,
1934 uself->end-1,
1935 reason_str);
1936 }
1937done:
1938 Py_XDECREF(reason_str);
1939 Py_XDECREF(encoding_str);
1940 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001941}
1942
1943static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001944 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001945 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001946 sizeof(PyUnicodeErrorObject), 0,
1947 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1948 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1949 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001950 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1951 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001952 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001953 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001954};
1955PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1956
1957PyObject *
1958PyUnicodeEncodeError_Create(
1959 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1960 Py_ssize_t start, Py_ssize_t end, const char *reason)
1961{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001962 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001963 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001964}
1965
1966
1967/*
1968 * UnicodeDecodeError extends UnicodeError
1969 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970
1971static int
1972UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1973{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001974 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001975
Thomas Wouters477c8d52006-05-27 19:21:47 +00001976 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1977 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001978
1979 ude = (PyUnicodeErrorObject *)self;
1980
1981 Py_CLEAR(ude->encoding);
1982 Py_CLEAR(ude->object);
1983 Py_CLEAR(ude->reason);
1984
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001985 if (!PyArg_ParseTuple(args, "UOnnU",
1986 &ude->encoding, &ude->object,
1987 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001988 ude->encoding = ude->object = ude->reason = NULL;
1989 return -1;
1990 }
1991
Guido van Rossum98297ee2007-11-06 21:34:58 +00001992 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001993 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001994 Py_INCREF(ude->reason);
1995
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001996 if (!PyBytes_Check(ude->object)) {
1997 Py_buffer view;
1998 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1999 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002000 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002001 PyBuffer_Release(&view);
2002 if (!ude->object)
2003 goto error;
2004 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002005 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002006
2007error:
2008 Py_CLEAR(ude->encoding);
2009 Py_CLEAR(ude->object);
2010 Py_CLEAR(ude->reason);
2011 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002012}
2013
2014static PyObject *
2015UnicodeDecodeError_str(PyObject *self)
2016{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002017 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002018 PyObject *result = NULL;
2019 PyObject *reason_str = NULL;
2020 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002021
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002022 if (!uself->object)
2023 /* Not properly initialized. */
2024 return PyUnicode_FromString("");
2025
Eric Smith0facd772010-02-24 15:42:29 +00002026 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002027 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002028 reason_str = PyObject_Str(uself->reason);
2029 if (reason_str == NULL)
2030 goto done;
2031 encoding_str = PyObject_Str(uself->encoding);
2032 if (encoding_str == NULL)
2033 goto done;
2034
2035 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002036 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002037 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002038 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002039 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002040 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002041 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002042 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002043 }
Eric Smith0facd772010-02-24 15:42:29 +00002044 else {
2045 result = PyUnicode_FromFormat(
2046 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2047 encoding_str,
2048 uself->start,
2049 uself->end-1,
2050 reason_str
2051 );
2052 }
2053done:
2054 Py_XDECREF(reason_str);
2055 Py_XDECREF(encoding_str);
2056 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002057}
2058
2059static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002060 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002061 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002062 sizeof(PyUnicodeErrorObject), 0,
2063 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2064 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2065 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002066 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2067 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002069 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002070};
2071PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2072
2073PyObject *
2074PyUnicodeDecodeError_Create(
2075 const char *encoding, const char *object, Py_ssize_t length,
2076 Py_ssize_t start, Py_ssize_t end, const char *reason)
2077{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002078 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002079 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002080}
2081
2082
2083/*
2084 * UnicodeTranslateError extends UnicodeError
2085 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002086
2087static int
2088UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2089 PyObject *kwds)
2090{
2091 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2092 return -1;
2093
2094 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002095 Py_CLEAR(self->reason);
2096
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002097 if (!PyArg_ParseTuple(args, "UnnU",
2098 &self->object,
2099 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002100 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101 return -1;
2102 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002103
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002105 Py_INCREF(self->reason);
2106
2107 return 0;
2108}
2109
2110
2111static PyObject *
2112UnicodeTranslateError_str(PyObject *self)
2113{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002114 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002115 PyObject *result = NULL;
2116 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002117
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002118 if (!uself->object)
2119 /* Not properly initialized. */
2120 return PyUnicode_FromString("");
2121
Eric Smith0facd772010-02-24 15:42:29 +00002122 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002123 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002124 reason_str = PyObject_Str(uself->reason);
2125 if (reason_str == NULL)
2126 goto done;
2127
Victor Stinner53b33e72011-11-21 01:17:27 +01002128 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2129 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002130 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002131 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002132 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002133 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002134 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002135 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002136 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002137 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002138 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002139 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002140 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002141 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002142 );
Eric Smith0facd772010-02-24 15:42:29 +00002143 } else {
2144 result = PyUnicode_FromFormat(
2145 "can't translate characters in position %zd-%zd: %U",
2146 uself->start,
2147 uself->end-1,
2148 reason_str
2149 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002150 }
Eric Smith0facd772010-02-24 15:42:29 +00002151done:
2152 Py_XDECREF(reason_str);
2153 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002154}
2155
2156static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002157 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002158 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002159 sizeof(PyUnicodeErrorObject), 0,
2160 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2161 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2162 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002164 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2165 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002166 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002167};
2168PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2169
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002170/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171PyObject *
2172PyUnicodeTranslateError_Create(
2173 const Py_UNICODE *object, Py_ssize_t length,
2174 Py_ssize_t start, Py_ssize_t end, const char *reason)
2175{
2176 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002177 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002178}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002179
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002180PyObject *
2181_PyUnicodeTranslateError_Create(
2182 PyObject *object,
2183 Py_ssize_t start, Py_ssize_t end, const char *reason)
2184{
Victor Stinner69598d42014-04-04 20:59:44 +02002185 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002186 object, start, end, reason);
2187}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188
2189/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002190 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002191 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002192SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002193 "Assertion failed.");
2194
2195
2196/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002197 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002199SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002200 "Base class for arithmetic errors.");
2201
2202
2203/*
2204 * FloatingPointError extends ArithmeticError
2205 */
2206SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2207 "Floating point operation failed.");
2208
2209
2210/*
2211 * OverflowError extends ArithmeticError
2212 */
2213SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2214 "Result too large to be represented.");
2215
2216
2217/*
2218 * ZeroDivisionError extends ArithmeticError
2219 */
2220SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2221 "Second argument to a division or modulo operation was zero.");
2222
2223
2224/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002225 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002226 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002227SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002228 "Internal error in the Python interpreter.\n"
2229 "\n"
2230 "Please report this to the Python maintainer, along with the traceback,\n"
2231 "the Python version, and the hardware/OS platform and version.");
2232
2233
2234/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002235 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002236 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002237SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002238 "Weak ref proxy used after referent went away.");
2239
2240
2241/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002242 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002243 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002244
2245#define MEMERRORS_SAVE 16
2246static PyBaseExceptionObject *memerrors_freelist = NULL;
2247static int memerrors_numfree = 0;
2248
2249static PyObject *
2250MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2251{
2252 PyBaseExceptionObject *self;
2253
2254 if (type != (PyTypeObject *) PyExc_MemoryError)
2255 return BaseException_new(type, args, kwds);
2256 if (memerrors_freelist == NULL)
2257 return BaseException_new(type, args, kwds);
2258 /* Fetch object from freelist and revive it */
2259 self = memerrors_freelist;
2260 self->args = PyTuple_New(0);
2261 /* This shouldn't happen since the empty tuple is persistent */
2262 if (self->args == NULL)
2263 return NULL;
2264 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2265 memerrors_numfree--;
2266 self->dict = NULL;
2267 _Py_NewReference((PyObject *)self);
2268 _PyObject_GC_TRACK(self);
2269 return (PyObject *)self;
2270}
2271
2272static void
2273MemoryError_dealloc(PyBaseExceptionObject *self)
2274{
2275 _PyObject_GC_UNTRACK(self);
2276 BaseException_clear(self);
2277 if (memerrors_numfree >= MEMERRORS_SAVE)
2278 Py_TYPE(self)->tp_free((PyObject *)self);
2279 else {
2280 self->dict = (PyObject *) memerrors_freelist;
2281 memerrors_freelist = self;
2282 memerrors_numfree++;
2283 }
2284}
2285
2286static void
2287preallocate_memerrors(void)
2288{
2289 /* We create enough MemoryErrors and then decref them, which will fill
2290 up the freelist. */
2291 int i;
2292 PyObject *errors[MEMERRORS_SAVE];
2293 for (i = 0; i < MEMERRORS_SAVE; i++) {
2294 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2295 NULL, NULL);
2296 if (!errors[i])
2297 Py_FatalError("Could not preallocate MemoryError object");
2298 }
2299 for (i = 0; i < MEMERRORS_SAVE; i++) {
2300 Py_DECREF(errors[i]);
2301 }
2302}
2303
2304static void
2305free_preallocated_memerrors(void)
2306{
2307 while (memerrors_freelist != NULL) {
2308 PyObject *self = (PyObject *) memerrors_freelist;
2309 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2310 Py_TYPE(self)->tp_free((PyObject *)self);
2311 }
2312}
2313
2314
2315static PyTypeObject _PyExc_MemoryError = {
2316 PyVarObject_HEAD_INIT(NULL, 0)
2317 "MemoryError",
2318 sizeof(PyBaseExceptionObject),
2319 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2320 0, 0, 0, 0, 0, 0, 0,
2321 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2322 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2323 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2324 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2325 (initproc)BaseException_init, 0, MemoryError_new
2326};
2327PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2328
Thomas Wouters477c8d52006-05-27 19:21:47 +00002329
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002330/*
2331 * BufferError extends Exception
2332 */
2333SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2334
Thomas Wouters477c8d52006-05-27 19:21:47 +00002335
2336/* Warning category docstrings */
2337
2338/*
2339 * Warning extends Exception
2340 */
2341SimpleExtendsException(PyExc_Exception, Warning,
2342 "Base class for warning categories.");
2343
2344
2345/*
2346 * UserWarning extends Warning
2347 */
2348SimpleExtendsException(PyExc_Warning, UserWarning,
2349 "Base class for warnings generated by user code.");
2350
2351
2352/*
2353 * DeprecationWarning extends Warning
2354 */
2355SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2356 "Base class for warnings about deprecated features.");
2357
2358
2359/*
2360 * PendingDeprecationWarning extends Warning
2361 */
2362SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2363 "Base class for warnings about features which will be deprecated\n"
2364 "in the future.");
2365
2366
2367/*
2368 * SyntaxWarning extends Warning
2369 */
2370SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2371 "Base class for warnings about dubious syntax.");
2372
2373
2374/*
2375 * RuntimeWarning extends Warning
2376 */
2377SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2378 "Base class for warnings about dubious runtime behavior.");
2379
2380
2381/*
2382 * FutureWarning extends Warning
2383 */
2384SimpleExtendsException(PyExc_Warning, FutureWarning,
2385 "Base class for warnings about constructs that will change semantically\n"
2386 "in the future.");
2387
2388
2389/*
2390 * ImportWarning extends Warning
2391 */
2392SimpleExtendsException(PyExc_Warning, ImportWarning,
2393 "Base class for warnings about probable mistakes in module imports");
2394
2395
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002396/*
2397 * UnicodeWarning extends Warning
2398 */
2399SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2400 "Base class for warnings about Unicode related problems, mostly\n"
2401 "related to conversion problems.");
2402
Georg Brandl08be72d2010-10-24 15:11:22 +00002403
Guido van Rossum98297ee2007-11-06 21:34:58 +00002404/*
2405 * BytesWarning extends Warning
2406 */
2407SimpleExtendsException(PyExc_Warning, BytesWarning,
2408 "Base class for warnings about bytes and buffer related problems, mostly\n"
2409 "related to conversion from str or comparing to str.");
2410
2411
Georg Brandl08be72d2010-10-24 15:11:22 +00002412/*
2413 * ResourceWarning extends Warning
2414 */
2415SimpleExtendsException(PyExc_Warning, ResourceWarning,
2416 "Base class for warnings about resource usage.");
2417
2418
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002419
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002420#define PRE_INIT(TYPE) \
2421 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2422 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2423 Py_FatalError("exceptions bootstrapping error."); \
2424 Py_INCREF(PyExc_ ## TYPE); \
2425 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002426
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002427#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002428 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2429 Py_FatalError("Module dictionary insertion problem.");
2430
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002431#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002432 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002433 PyExc_ ## NAME = PyExc_ ## TYPE; \
2434 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2435 Py_FatalError("Module dictionary insertion problem.");
2436
2437#define ADD_ERRNO(TYPE, CODE) { \
2438 PyObject *_code = PyLong_FromLong(CODE); \
2439 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2440 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2441 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002442 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002443 }
2444
2445#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002446#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002447/* The following constants were added to errno.h in VS2010 but have
2448 preferred WSA equivalents. */
2449#undef EADDRINUSE
2450#undef EADDRNOTAVAIL
2451#undef EAFNOSUPPORT
2452#undef EALREADY
2453#undef ECONNABORTED
2454#undef ECONNREFUSED
2455#undef ECONNRESET
2456#undef EDESTADDRREQ
2457#undef EHOSTUNREACH
2458#undef EINPROGRESS
2459#undef EISCONN
2460#undef ELOOP
2461#undef EMSGSIZE
2462#undef ENETDOWN
2463#undef ENETRESET
2464#undef ENETUNREACH
2465#undef ENOBUFS
2466#undef ENOPROTOOPT
2467#undef ENOTCONN
2468#undef ENOTSOCK
2469#undef EOPNOTSUPP
2470#undef EPROTONOSUPPORT
2471#undef EPROTOTYPE
2472#undef ETIMEDOUT
2473#undef EWOULDBLOCK
2474
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002475#if defined(WSAEALREADY) && !defined(EALREADY)
2476#define EALREADY WSAEALREADY
2477#endif
2478#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2479#define ECONNABORTED WSAECONNABORTED
2480#endif
2481#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2482#define ECONNREFUSED WSAECONNREFUSED
2483#endif
2484#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2485#define ECONNRESET WSAECONNRESET
2486#endif
2487#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2488#define EINPROGRESS WSAEINPROGRESS
2489#endif
2490#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2491#define ESHUTDOWN WSAESHUTDOWN
2492#endif
2493#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2494#define ETIMEDOUT WSAETIMEDOUT
2495#endif
2496#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2497#define EWOULDBLOCK WSAEWOULDBLOCK
2498#endif
2499#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002500
Martin v. Löwis1a214512008-06-11 05:26:20 +00002501void
Brett Cannonfd074152012-04-14 14:10:13 -04002502_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002503{
Brett Cannonfd074152012-04-14 14:10:13 -04002504 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505
2506 PRE_INIT(BaseException)
2507 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002508 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002509 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002510 PRE_INIT(StopIteration)
2511 PRE_INIT(GeneratorExit)
2512 PRE_INIT(SystemExit)
2513 PRE_INIT(KeyboardInterrupt)
2514 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002515 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002516 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002517 PRE_INIT(EOFError)
2518 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002519 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002520 PRE_INIT(NotImplementedError)
2521 PRE_INIT(NameError)
2522 PRE_INIT(UnboundLocalError)
2523 PRE_INIT(AttributeError)
2524 PRE_INIT(SyntaxError)
2525 PRE_INIT(IndentationError)
2526 PRE_INIT(TabError)
2527 PRE_INIT(LookupError)
2528 PRE_INIT(IndexError)
2529 PRE_INIT(KeyError)
2530 PRE_INIT(ValueError)
2531 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 PRE_INIT(UnicodeEncodeError)
2533 PRE_INIT(UnicodeDecodeError)
2534 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002535 PRE_INIT(AssertionError)
2536 PRE_INIT(ArithmeticError)
2537 PRE_INIT(FloatingPointError)
2538 PRE_INIT(OverflowError)
2539 PRE_INIT(ZeroDivisionError)
2540 PRE_INIT(SystemError)
2541 PRE_INIT(ReferenceError)
2542 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002543 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002544 PRE_INIT(Warning)
2545 PRE_INIT(UserWarning)
2546 PRE_INIT(DeprecationWarning)
2547 PRE_INIT(PendingDeprecationWarning)
2548 PRE_INIT(SyntaxWarning)
2549 PRE_INIT(RuntimeWarning)
2550 PRE_INIT(FutureWarning)
2551 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002552 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002553 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002554 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002555
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002556 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002557 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002558
Louie Luc4318542017-03-29 13:28:15 +08002559 PRE_INIT(BlockingIOError)
2560 PRE_INIT(BrokenPipeError)
2561 PRE_INIT(ChildProcessError)
2562 PRE_INIT(ConnectionAbortedError)
2563 PRE_INIT(ConnectionRefusedError)
2564 PRE_INIT(ConnectionResetError)
2565 PRE_INIT(FileExistsError)
2566 PRE_INIT(FileNotFoundError)
2567 PRE_INIT(IsADirectoryError)
2568 PRE_INIT(NotADirectoryError)
2569 PRE_INIT(InterruptedError)
2570 PRE_INIT(PermissionError)
2571 PRE_INIT(ProcessLookupError)
2572 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002573
Thomas Wouters477c8d52006-05-27 19:21:47 +00002574 bdict = PyModule_GetDict(bltinmod);
2575 if (bdict == NULL)
2576 Py_FatalError("exceptions bootstrapping error.");
2577
2578 POST_INIT(BaseException)
2579 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002580 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002581 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002582 POST_INIT(StopIteration)
2583 POST_INIT(GeneratorExit)
2584 POST_INIT(SystemExit)
2585 POST_INIT(KeyboardInterrupt)
2586 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002587 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002588 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002589 INIT_ALIAS(EnvironmentError, OSError)
2590 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002592 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002593#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594 POST_INIT(EOFError)
2595 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002596 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597 POST_INIT(NotImplementedError)
2598 POST_INIT(NameError)
2599 POST_INIT(UnboundLocalError)
2600 POST_INIT(AttributeError)
2601 POST_INIT(SyntaxError)
2602 POST_INIT(IndentationError)
2603 POST_INIT(TabError)
2604 POST_INIT(LookupError)
2605 POST_INIT(IndexError)
2606 POST_INIT(KeyError)
2607 POST_INIT(ValueError)
2608 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609 POST_INIT(UnicodeEncodeError)
2610 POST_INIT(UnicodeDecodeError)
2611 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612 POST_INIT(AssertionError)
2613 POST_INIT(ArithmeticError)
2614 POST_INIT(FloatingPointError)
2615 POST_INIT(OverflowError)
2616 POST_INIT(ZeroDivisionError)
2617 POST_INIT(SystemError)
2618 POST_INIT(ReferenceError)
2619 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002620 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002621 POST_INIT(Warning)
2622 POST_INIT(UserWarning)
2623 POST_INIT(DeprecationWarning)
2624 POST_INIT(PendingDeprecationWarning)
2625 POST_INIT(SyntaxWarning)
2626 POST_INIT(RuntimeWarning)
2627 POST_INIT(FutureWarning)
2628 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002629 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002630 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002631 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632
Antoine Pitrouac456a12012-01-18 21:35:21 +01002633 if (!errnomap) {
2634 errnomap = PyDict_New();
2635 if (!errnomap)
2636 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2637 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002638
2639 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002640 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002641
Louie Luc4318542017-03-29 13:28:15 +08002642 POST_INIT(BlockingIOError)
2643 ADD_ERRNO(BlockingIOError, EAGAIN)
2644 ADD_ERRNO(BlockingIOError, EALREADY)
2645 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2646 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2647 POST_INIT(BrokenPipeError)
2648 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002649#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002650 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002651#endif
Louie Luc4318542017-03-29 13:28:15 +08002652 POST_INIT(ChildProcessError)
2653 ADD_ERRNO(ChildProcessError, ECHILD)
2654 POST_INIT(ConnectionAbortedError)
2655 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2656 POST_INIT(ConnectionRefusedError)
2657 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2658 POST_INIT(ConnectionResetError)
2659 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2660 POST_INIT(FileExistsError)
2661 ADD_ERRNO(FileExistsError, EEXIST)
2662 POST_INIT(FileNotFoundError)
2663 ADD_ERRNO(FileNotFoundError, ENOENT)
2664 POST_INIT(IsADirectoryError)
2665 ADD_ERRNO(IsADirectoryError, EISDIR)
2666 POST_INIT(NotADirectoryError)
2667 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2668 POST_INIT(InterruptedError)
2669 ADD_ERRNO(InterruptedError, EINTR)
2670 POST_INIT(PermissionError)
2671 ADD_ERRNO(PermissionError, EACCES)
2672 ADD_ERRNO(PermissionError, EPERM)
2673 POST_INIT(ProcessLookupError)
2674 ADD_ERRNO(ProcessLookupError, ESRCH)
2675 POST_INIT(TimeoutError)
2676 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002677
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002678 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002679}
2680
2681void
2682_PyExc_Fini(void)
2683{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002684 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002685 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002686}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002687
2688/* Helper to do the equivalent of "raise X from Y" in C, but always using
2689 * the current exception rather than passing one in.
2690 *
2691 * We currently limit this to *only* exceptions that use the BaseException
2692 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2693 * those correctly without losing data and without losing backwards
2694 * compatibility.
2695 *
2696 * We also aim to rule out *all* exceptions that might be storing additional
2697 * state, whether by having a size difference relative to BaseException,
2698 * additional arguments passed in during construction or by having a
2699 * non-empty instance dict.
2700 *
2701 * We need to be very careful with what we wrap, since changing types to
2702 * a broader exception type would be backwards incompatible for
2703 * existing codecs, and with different init or new method implementations
2704 * may either not support instantiation with PyErr_Format or lose
2705 * information when instantiated that way.
2706 *
2707 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2708 * fact that exceptions are expected to support pickling. If more builtin
2709 * exceptions (e.g. AttributeError) start to be converted to rich
2710 * exceptions with additional attributes, that's probably a better approach
2711 * to pursue over adding special cases for particular stateful subclasses.
2712 *
2713 * Returns a borrowed reference to the new exception (if any), NULL if the
2714 * existing exception was left in place.
2715 */
2716PyObject *
2717_PyErr_TrySetFromCause(const char *format, ...)
2718{
2719 PyObject* msg_prefix;
2720 PyObject *exc, *val, *tb;
2721 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002722 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002723 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002724 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002725 PyObject *new_exc, *new_val, *new_tb;
2726 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002727 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002728
Nick Coghlan8b097b42013-11-13 23:49:21 +10002729 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002730 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002731 /* Ensure type info indicates no extra state is stored at the C level
2732 * and that the type can be reinstantiated using PyErr_Format
2733 */
2734 caught_type_size = caught_type->tp_basicsize;
2735 base_exc_size = _PyExc_BaseException.tp_basicsize;
2736 same_basic_size = (
2737 caught_type_size == base_exc_size ||
2738 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002739 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002740 )
2741 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002742 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002743 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002744 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002745 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002746 /* We can't be sure we can wrap this safely, since it may contain
2747 * more state than just the exception type. Accordingly, we just
2748 * leave it alone.
2749 */
2750 PyErr_Restore(exc, val, tb);
2751 return NULL;
2752 }
2753
2754 /* Check the args are empty or contain a single string */
2755 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002756 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002757 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002758 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002759 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002760 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002761 /* More than 1 arg, or the one arg we do have isn't a string
2762 */
2763 PyErr_Restore(exc, val, tb);
2764 return NULL;
2765 }
2766
2767 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002768 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002769 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002770 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002771 /* While we could potentially copy a non-empty instance dictionary
2772 * to the replacement exception, for now we take the more
2773 * conservative path of leaving exceptions with attributes set
2774 * alone.
2775 */
2776 PyErr_Restore(exc, val, tb);
2777 return NULL;
2778 }
2779
2780 /* For exceptions that we can wrap safely, we chain the original
2781 * exception to a new one of the exact same type with an
2782 * error message that mentions the additional details and the
2783 * original exception.
2784 *
2785 * It would be nice to wrap OSError and various other exception
2786 * types as well, but that's quite a bit trickier due to the extra
2787 * state potentially stored on OSError instances.
2788 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002789 /* Ensure the traceback is set correctly on the existing exception */
2790 if (tb != NULL) {
2791 PyException_SetTraceback(val, tb);
2792 Py_DECREF(tb);
2793 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002794
Christian Heimes507eabd2013-11-14 01:39:35 +01002795#ifdef HAVE_STDARG_PROTOTYPES
2796 va_start(vargs, format);
2797#else
2798 va_start(vargs);
2799#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002800 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002801 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002802 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002803 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002804 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002805 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002806 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002807
2808 PyErr_Format(exc, "%U (%s: %S)",
2809 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002810 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002811 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002812 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2813 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2814 PyException_SetCause(new_val, val);
2815 PyErr_Restore(new_exc, new_val, new_tb);
2816 return new_val;
2817}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002818
2819
2820/* To help with migration from Python 2, SyntaxError.__init__ applies some
2821 * heuristics to try to report a more meaningful exception when print and
2822 * exec are used like statements.
2823 *
2824 * The heuristics are currently expected to detect the following cases:
2825 * - top level statement
2826 * - statement in a nested suite
2827 * - trailing section of a one line complex statement
2828 *
2829 * They're currently known not to trigger:
2830 * - after a semi-colon
2831 *
2832 * The error message can be a bit odd in cases where the "arguments" are
2833 * completely illegal syntactically, but that isn't worth the hassle of
2834 * fixing.
2835 *
2836 * We also can't do anything about cases that are legal Python 3 syntax
2837 * but mean something entirely different from what they did in Python 2
2838 * (omitting the arguments entirely, printing items preceded by a unary plus
2839 * or minus, using the stream redirection syntax).
2840 */
2841
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302842
2843// Static helper for setting legacy print error message
2844static int
2845_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2846{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302847 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302848 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302849 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302850 Py_ssize_t start_pos = start + PRINT_OFFSET;
2851 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2852 Py_UCS4 semicolon = ';';
2853 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2854 start_pos, text_len, 1);
2855 if (end_pos < -1) {
2856 return -1;
2857 } else if (end_pos == -1) {
2858 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302859 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302860
2861 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302862 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302863 return -1;
2864 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302865
2866 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2867 if (strip_sep_obj == NULL) {
2868 Py_DECREF(data);
2869 return -1;
2870 }
2871
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302872 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302873 Py_DECREF(data);
2874 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302875 if (new_data == NULL) {
2876 return -1;
2877 }
2878 // gets the modified text_len after stripping `print `
2879 text_len = PyUnicode_GET_LENGTH(new_data);
2880 const char *maybe_end_arg = "";
2881 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2882 maybe_end_arg = " end=\" \"";
2883 }
2884 PyObject *error_msg = PyUnicode_FromFormat(
2885 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2886 new_data, maybe_end_arg
2887 );
2888 Py_DECREF(new_data);
2889 if (error_msg == NULL)
2890 return -1;
2891
2892 Py_XSETREF(self->msg, error_msg);
2893 return 1;
2894}
2895
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002896static int
2897_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2898{
2899 /* Return values:
2900 * -1: an error occurred
2901 * 0: nothing happened
2902 * 1: the check triggered & the error message was changed
2903 */
2904 static PyObject *print_prefix = NULL;
2905 static PyObject *exec_prefix = NULL;
2906 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2907 int kind = PyUnicode_KIND(self->text);
2908 void *data = PyUnicode_DATA(self->text);
2909
2910 /* Ignore leading whitespace */
2911 while (start < text_len) {
2912 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2913 if (!Py_UNICODE_ISSPACE(ch))
2914 break;
2915 start++;
2916 }
2917 /* Checking against an empty or whitespace-only part of the string */
2918 if (start == text_len) {
2919 return 0;
2920 }
2921
2922 /* Check for legacy print statements */
2923 if (print_prefix == NULL) {
2924 print_prefix = PyUnicode_InternFromString("print ");
2925 if (print_prefix == NULL) {
2926 return -1;
2927 }
2928 }
2929 if (PyUnicode_Tailmatch(self->text, print_prefix,
2930 start, text_len, -1)) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302931
2932 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002933 }
2934
2935 /* Check for legacy exec statements */
2936 if (exec_prefix == NULL) {
2937 exec_prefix = PyUnicode_InternFromString("exec ");
2938 if (exec_prefix == NULL) {
2939 return -1;
2940 }
2941 }
2942 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2943 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002944 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002945 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002946 return 1;
2947 }
2948 /* Fall back to the default error message */
2949 return 0;
2950}
2951
2952static int
2953_report_missing_parentheses(PySyntaxErrorObject *self)
2954{
2955 Py_UCS4 left_paren = 40;
2956 Py_ssize_t left_paren_index;
2957 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2958 int legacy_check_result = 0;
2959
2960 /* Skip entirely if there is an opening parenthesis */
2961 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2962 0, text_len, 1);
2963 if (left_paren_index < -1) {
2964 return -1;
2965 }
2966 if (left_paren_index != -1) {
2967 /* Use default error message for any line with an opening paren */
2968 return 0;
2969 }
2970 /* Handle the simple statement case */
2971 legacy_check_result = _check_for_legacy_statements(self, 0);
2972 if (legacy_check_result < 0) {
2973 return -1;
2974
2975 }
2976 if (legacy_check_result == 0) {
2977 /* Handle the one-line complex statement case */
2978 Py_UCS4 colon = 58;
2979 Py_ssize_t colon_index;
2980 colon_index = PyUnicode_FindChar(self->text, colon,
2981 0, text_len, 1);
2982 if (colon_index < -1) {
2983 return -1;
2984 }
2985 if (colon_index >= 0 && colon_index < text_len) {
2986 /* Check again, starting from just after the colon */
2987 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2988 return -1;
2989 }
2990 }
2991 }
2992 return 0;
2993}