blob: cecbf977a32781c2d5cb788331afedf56c30fd9e [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>
Victor Stinnerbcda8f12018-11-21 22:27:47 +01009#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010010#include "pycore_pymem.h"
11#include "pycore_pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000012#include "structmember.h"
13#include "osdefs.h"
14
Thomas Wouters477c8d52006-05-27 19:21:47 +000015
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020016/* Compatibility aliases */
17PyObject *PyExc_EnvironmentError = NULL;
18PyObject *PyExc_IOError = NULL;
19#ifdef MS_WINDOWS
20PyObject *PyExc_WindowsError = NULL;
21#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020022
23/* The dict map from errno codes to OSError subclasses */
24static PyObject *errnomap = NULL;
25
26
Thomas Wouters477c8d52006-05-27 19:21:47 +000027/* NOTE: If the exception class hierarchy changes, don't forget to update
28 * Lib/test/exception_hierarchy.txt
29 */
30
Thomas Wouters477c8d52006-05-27 19:21:47 +000031/*
32 * BaseException
33 */
34static PyObject *
35BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36{
37 PyBaseExceptionObject *self;
38
39 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000040 if (!self)
41 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000042 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000043 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000044 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070045 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000046
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010047 if (args) {
48 self->args = args;
49 Py_INCREF(args);
50 return (PyObject *)self;
51 }
52
Thomas Wouters477c8d52006-05-27 19:21:47 +000053 self->args = PyTuple_New(0);
54 if (!self->args) {
55 Py_DECREF(self);
56 return NULL;
57 }
58
Thomas Wouters477c8d52006-05-27 19:21:47 +000059 return (PyObject *)self;
60}
61
62static int
63BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
64{
Christian Heimes90aa7642007-12-19 02:45:37 +000065 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000066 return -1;
67
Serhiy Storchaka576f1322016-01-05 21:27:54 +020068 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030069 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000070
Thomas Wouters477c8d52006-05-27 19:21:47 +000071 return 0;
72}
73
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000074static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000075BaseException_clear(PyBaseExceptionObject *self)
76{
77 Py_CLEAR(self->dict);
78 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000079 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000080 Py_CLEAR(self->cause);
81 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000082 return 0;
83}
84
85static void
86BaseException_dealloc(PyBaseExceptionObject *self)
87{
Thomas Wouters89f507f2006-12-13 04:49:30 +000088 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000089 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000090 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000091}
92
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000094BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
95{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000096 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000097 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000098 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000099 Py_VISIT(self->cause);
100 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000101 return 0;
102}
103
104static PyObject *
105BaseException_str(PyBaseExceptionObject *self)
106{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000107 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000109 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000111 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000113 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115}
116
117static PyObject *
118BaseException_repr(PyBaseExceptionObject *self)
119{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300120 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200121 if (PyTuple_GET_SIZE(self->args) == 1)
122 return PyUnicode_FromFormat("%s(%R)", name,
123 PyTuple_GET_ITEM(self->args, 0));
124 else
125 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000126}
127
128/* Pickling support */
129static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530130BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000132 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000133 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000134 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000135 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136}
137
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000138/*
139 * Needed for backward compatibility, since exceptions used to store
140 * all their attributes in the __dict__. Code is taken from cPickle's
141 * load_build function.
142 */
143static PyObject *
144BaseException_setstate(PyObject *self, PyObject *state)
145{
146 PyObject *d_key, *d_value;
147 Py_ssize_t i = 0;
148
149 if (state != Py_None) {
150 if (!PyDict_Check(state)) {
151 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
152 return NULL;
153 }
154 while (PyDict_Next(state, &i, &d_key, &d_value)) {
155 if (PyObject_SetAttr(self, d_key, d_value) < 0)
156 return NULL;
157 }
158 }
159 Py_RETURN_NONE;
160}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000161
Collin Winter828f04a2007-08-31 00:04:24 +0000162static PyObject *
163BaseException_with_traceback(PyObject *self, PyObject *tb) {
164 if (PyException_SetTraceback(self, tb))
165 return NULL;
166
167 Py_INCREF(self);
168 return self;
169}
170
Georg Brandl76941002008-05-05 21:38:47 +0000171PyDoc_STRVAR(with_traceback_doc,
172"Exception.with_traceback(tb) --\n\
173 set self.__traceback__ to tb and return self.");
174
Thomas Wouters477c8d52006-05-27 19:21:47 +0000175
176static PyMethodDef BaseException_methods[] = {
177 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000178 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000179 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
180 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181 {NULL, NULL, 0, NULL},
182};
183
Thomas Wouters477c8d52006-05-27 19:21:47 +0000184static PyObject *
185BaseException_get_args(PyBaseExceptionObject *self)
186{
187 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200188 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000189 }
190 Py_INCREF(self->args);
191 return self->args;
192}
193
194static int
195BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
196{
197 PyObject *seq;
198 if (val == NULL) {
199 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
200 return -1;
201 }
202 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500203 if (!seq)
204 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300205 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000206 return 0;
207}
208
Collin Winter828f04a2007-08-31 00:04:24 +0000209static PyObject *
210BaseException_get_tb(PyBaseExceptionObject *self)
211{
212 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200213 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000214 }
215 Py_INCREF(self->traceback);
216 return self->traceback;
217}
218
219static int
220BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
221{
222 if (tb == NULL) {
223 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
224 return -1;
225 }
226 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
227 PyErr_SetString(PyExc_TypeError,
228 "__traceback__ must be a traceback or None");
229 return -1;
230 }
231
Serhiy Storchaka37665722016-08-20 21:22:03 +0300232 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300233 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000234 return 0;
235}
236
Georg Brandlab6f2f62009-03-31 04:16:10 +0000237static PyObject *
238BaseException_get_context(PyObject *self) {
239 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
246BaseException_set_context(PyObject *self, PyObject *arg) {
247 if (arg == NULL) {
248 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
249 return -1;
250 } else if (arg == Py_None) {
251 arg = NULL;
252 } else if (!PyExceptionInstance_Check(arg)) {
253 PyErr_SetString(PyExc_TypeError, "exception context must be None "
254 "or derive from BaseException");
255 return -1;
256 } else {
257 /* PyException_SetContext steals this reference */
258 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000260 PyException_SetContext(self, arg);
261 return 0;
262}
263
264static PyObject *
265BaseException_get_cause(PyObject *self) {
266 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500267 if (res)
268 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700269 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000270}
271
272static int
273BaseException_set_cause(PyObject *self, PyObject *arg) {
274 if (arg == NULL) {
275 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
276 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700277 } else if (arg == Py_None) {
278 arg = NULL;
279 } else if (!PyExceptionInstance_Check(arg)) {
280 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
281 "or derive from BaseException");
282 return -1;
283 } else {
284 /* PyException_SetCause steals this reference */
285 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700287 PyException_SetCause(self, arg);
288 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000289}
290
Guido van Rossum360e4b82007-05-14 22:51:27 +0000291
Thomas Wouters477c8d52006-05-27 19:21:47 +0000292static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500293 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000294 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000295 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000296 {"__context__", (getter)BaseException_get_context,
297 (setter)BaseException_set_context, PyDoc_STR("exception context")},
298 {"__cause__", (getter)BaseException_get_cause,
299 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000300 {NULL},
301};
302
303
Collin Winter828f04a2007-08-31 00:04:24 +0000304PyObject *
305PyException_GetTraceback(PyObject *self) {
306 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
307 Py_XINCREF(base_self->traceback);
308 return base_self->traceback;
309}
310
311
312int
313PyException_SetTraceback(PyObject *self, PyObject *tb) {
314 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
315}
316
317PyObject *
318PyException_GetCause(PyObject *self) {
319 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
320 Py_XINCREF(cause);
321 return cause;
322}
323
324/* Steals a reference to cause */
325void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200326PyException_SetCause(PyObject *self, PyObject *cause)
327{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700328 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300329 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000330}
331
332PyObject *
333PyException_GetContext(PyObject *self) {
334 PyObject *context = ((PyBaseExceptionObject *)self)->context;
335 Py_XINCREF(context);
336 return context;
337}
338
339/* Steals a reference to context */
340void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200341PyException_SetContext(PyObject *self, PyObject *context)
342{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300343 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000344}
345
Christian Tismerea62ce72018-06-09 20:32:25 +0200346#undef PyExceptionClass_Name
Christian Tismer83987132018-06-11 00:48:28 +0200347
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300348const char *
Christian Tismerea62ce72018-06-09 20:32:25 +0200349PyExceptionClass_Name(PyObject *ob)
350{
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300351 return ((PyTypeObject*)ob)->tp_name;
Christian Tismerea62ce72018-06-09 20:32:25 +0200352}
Collin Winter828f04a2007-08-31 00:04:24 +0000353
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700354static struct PyMemberDef BaseException_members[] = {
355 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200356 offsetof(PyBaseExceptionObject, suppress_context)},
357 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700358};
359
360
Thomas Wouters477c8d52006-05-27 19:21:47 +0000361static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000362 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000363 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000364 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
365 0, /*tp_itemsize*/
366 (destructor)BaseException_dealloc, /*tp_dealloc*/
367 0, /*tp_print*/
368 0, /*tp_getattr*/
369 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000370 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000371 (reprfunc)BaseException_repr, /*tp_repr*/
372 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000373 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000374 0, /*tp_as_mapping*/
375 0, /*tp_hash */
376 0, /*tp_call*/
377 (reprfunc)BaseException_str, /*tp_str*/
378 PyObject_GenericGetAttr, /*tp_getattro*/
379 PyObject_GenericSetAttr, /*tp_setattro*/
380 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000381 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000383 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
384 (traverseproc)BaseException_traverse, /* tp_traverse */
385 (inquiry)BaseException_clear, /* tp_clear */
386 0, /* tp_richcompare */
387 0, /* tp_weaklistoffset */
388 0, /* tp_iter */
389 0, /* tp_iternext */
390 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700391 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000392 BaseException_getset, /* tp_getset */
393 0, /* tp_base */
394 0, /* tp_dict */
395 0, /* tp_descr_get */
396 0, /* tp_descr_set */
397 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
398 (initproc)BaseException_init, /* tp_init */
399 0, /* tp_alloc */
400 BaseException_new, /* tp_new */
401};
402/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
403from the previous implmentation and also allowing Python objects to be used
404in the API */
405PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
406
407/* note these macros omit the last semicolon so the macro invocation may
408 * include it and not look strange.
409 */
410#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
411static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000412 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000413 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000414 sizeof(PyBaseExceptionObject), \
415 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
416 0, 0, 0, 0, 0, 0, 0, \
417 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
418 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
419 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
420 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
421 (initproc)BaseException_init, 0, BaseException_new,\
422}; \
423PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
424
425#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
426static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000427 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000428 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000430 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 0, 0, 0, 0, 0, \
432 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000433 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
434 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200436 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437}; \
438PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
439
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200440#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
441 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
442 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000443static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000444 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000445 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000446 sizeof(Py ## EXCSTORE ## Object), 0, \
447 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
448 (reprfunc)EXCSTR, 0, 0, 0, \
449 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
450 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
451 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200452 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000453 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200454 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000455}; \
456PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
457
458
459/*
460 * Exception extends BaseException
461 */
462SimpleExtendsException(PyExc_BaseException, Exception,
463 "Common base class for all non-exit exceptions.");
464
465
466/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000467 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000468 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000469SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 "Inappropriate argument type.");
471
472
473/*
Yury Selivanov75445082015-05-11 22:57:16 -0400474 * StopAsyncIteration extends Exception
475 */
476SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
477 "Signal the end from iterator.__anext__().");
478
479
480/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000481 * StopIteration extends Exception
482 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000483
484static PyMemberDef StopIteration_members[] = {
485 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
486 PyDoc_STR("generator return value")},
487 {NULL} /* Sentinel */
488};
489
490static int
491StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
492{
493 Py_ssize_t size = PyTuple_GET_SIZE(args);
494 PyObject *value;
495
496 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
497 return -1;
498 Py_CLEAR(self->value);
499 if (size > 0)
500 value = PyTuple_GET_ITEM(args, 0);
501 else
502 value = Py_None;
503 Py_INCREF(value);
504 self->value = value;
505 return 0;
506}
507
508static int
509StopIteration_clear(PyStopIterationObject *self)
510{
511 Py_CLEAR(self->value);
512 return BaseException_clear((PyBaseExceptionObject *)self);
513}
514
515static void
516StopIteration_dealloc(PyStopIterationObject *self)
517{
518 _PyObject_GC_UNTRACK(self);
519 StopIteration_clear(self);
520 Py_TYPE(self)->tp_free((PyObject *)self);
521}
522
523static int
524StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
525{
526 Py_VISIT(self->value);
527 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
528}
529
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000530ComplexExtendsException(
531 PyExc_Exception, /* base */
532 StopIteration, /* name */
533 StopIteration, /* prefix for *_init, etc */
534 0, /* new */
535 0, /* methods */
536 StopIteration_members, /* members */
537 0, /* getset */
538 0, /* str */
539 "Signal the end from iterator.__next__()."
540);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541
542
543/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000544 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000545 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000546SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000547 "Request that a generator exit.");
548
549
550/*
551 * SystemExit extends BaseException
552 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000553
554static int
555SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
556{
557 Py_ssize_t size = PyTuple_GET_SIZE(args);
558
559 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
560 return -1;
561
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000562 if (size == 0)
563 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200564 if (size == 1) {
565 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300566 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200567 }
568 else { /* size > 1 */
569 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300570 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200571 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000572 return 0;
573}
574
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000575static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000576SystemExit_clear(PySystemExitObject *self)
577{
578 Py_CLEAR(self->code);
579 return BaseException_clear((PyBaseExceptionObject *)self);
580}
581
582static void
583SystemExit_dealloc(PySystemExitObject *self)
584{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000586 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000587 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000588}
589
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000590static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000591SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
592{
593 Py_VISIT(self->code);
594 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
595}
596
597static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000598 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
599 PyDoc_STR("exception code")},
600 {NULL} /* Sentinel */
601};
602
603ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200604 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605 "Request to exit from the interpreter.");
606
607/*
608 * KeyboardInterrupt extends BaseException
609 */
610SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
611 "Program interrupted by user.");
612
613
614/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000615 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000616 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000617
Brett Cannon79ec55e2012-04-12 20:24:54 -0400618static int
619ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
620{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300621 static char *kwlist[] = {"name", "path", 0};
622 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400623 PyObject *msg = NULL;
624 PyObject *name = NULL;
625 PyObject *path = NULL;
626
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300627 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400628 return -1;
629
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300630 empty_tuple = PyTuple_New(0);
631 if (!empty_tuple)
632 return -1;
633 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
634 &name, &path)) {
635 Py_DECREF(empty_tuple);
636 return -1;
637 }
638 Py_DECREF(empty_tuple);
639
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300640 Py_XINCREF(name);
641 Py_XSETREF(self->name, name);
642
643 Py_XINCREF(path);
644 Py_XSETREF(self->path, path);
645
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300646 if (PyTuple_GET_SIZE(args) == 1) {
647 msg = PyTuple_GET_ITEM(args, 0);
648 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300649 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300650 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400651
652 return 0;
653}
654
655static int
656ImportError_clear(PyImportErrorObject *self)
657{
658 Py_CLEAR(self->msg);
659 Py_CLEAR(self->name);
660 Py_CLEAR(self->path);
661 return BaseException_clear((PyBaseExceptionObject *)self);
662}
663
664static void
665ImportError_dealloc(PyImportErrorObject *self)
666{
667 _PyObject_GC_UNTRACK(self);
668 ImportError_clear(self);
669 Py_TYPE(self)->tp_free((PyObject *)self);
670}
671
672static int
673ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
674{
675 Py_VISIT(self->msg);
676 Py_VISIT(self->name);
677 Py_VISIT(self->path);
678 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
679}
680
681static PyObject *
682ImportError_str(PyImportErrorObject *self)
683{
Brett Cannon07c6e712012-08-24 13:05:09 -0400684 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400685 Py_INCREF(self->msg);
686 return self->msg;
687 }
688 else {
689 return BaseException_str((PyBaseExceptionObject *)self);
690 }
691}
692
Serhiy Storchakab7853962017-04-08 09:55:07 +0300693static PyObject *
694ImportError_getstate(PyImportErrorObject *self)
695{
696 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
697 if (self->name || self->path) {
698 _Py_IDENTIFIER(name);
699 _Py_IDENTIFIER(path);
700 dict = dict ? PyDict_Copy(dict) : PyDict_New();
701 if (dict == NULL)
702 return NULL;
703 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
704 Py_DECREF(dict);
705 return NULL;
706 }
707 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
708 Py_DECREF(dict);
709 return NULL;
710 }
711 return dict;
712 }
713 else if (dict) {
714 Py_INCREF(dict);
715 return dict;
716 }
717 else {
718 Py_RETURN_NONE;
719 }
720}
721
722/* Pickling support */
723static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530724ImportError_reduce(PyImportErrorObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakab7853962017-04-08 09:55:07 +0300725{
726 PyObject *res;
727 PyObject *args;
728 PyObject *state = ImportError_getstate(self);
729 if (state == NULL)
730 return NULL;
731 args = ((PyBaseExceptionObject *)self)->args;
732 if (state == Py_None)
733 res = PyTuple_Pack(2, Py_TYPE(self), args);
734 else
735 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
736 Py_DECREF(state);
737 return res;
738}
739
Brett Cannon79ec55e2012-04-12 20:24:54 -0400740static PyMemberDef ImportError_members[] = {
741 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
742 PyDoc_STR("exception message")},
743 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
744 PyDoc_STR("module name")},
745 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
746 PyDoc_STR("module path")},
747 {NULL} /* Sentinel */
748};
749
750static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300751 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400752 {NULL}
753};
754
755ComplexExtendsException(PyExc_Exception, ImportError,
756 ImportError, 0 /* new */,
757 ImportError_methods, ImportError_members,
758 0 /* getset */, ImportError_str,
759 "Import can't find module, or can't find name in "
760 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000761
762/*
Eric Snowc9432652016-09-07 15:42:32 -0700763 * ModuleNotFoundError extends ImportError
764 */
765
766MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
767 "Module not found.");
768
769/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200770 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000771 */
772
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200773#ifdef MS_WINDOWS
774#include "errmap.h"
775#endif
776
Thomas Wouters477c8d52006-05-27 19:21:47 +0000777/* Where a function has a single filename, such as open() or some
778 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
779 * called, giving a third argument which is the filename. But, so
780 * that old code using in-place unpacking doesn't break, e.g.:
781 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200782 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000783 *
784 * we hack args so that it only contains two items. This also
785 * means we need our own __str__() which prints out the filename
786 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800787 *
788 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800789 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
790 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000791 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200792
Antoine Pitroue0e27352011-12-15 14:31:28 +0100793/* This function doesn't cleanup on error, the caller should */
794static int
795oserror_parse_args(PyObject **p_args,
796 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800797 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200798#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100799 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200800#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100801 )
802{
803 Py_ssize_t nargs;
804 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800805#ifndef MS_WINDOWS
806 /*
807 * ignored on non-Windows platforms,
808 * but parsed so OSError has a consistent signature
809 */
810 PyObject *_winerror = NULL;
811 PyObject **winerror = &_winerror;
812#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000813
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200814 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000815
Larry Hastingsb0827312014-02-09 22:05:19 -0800816 if (nargs >= 2 && nargs <= 5) {
817 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
818 myerrno, strerror,
819 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100820 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800821#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100822 if (*winerror && PyLong_Check(*winerror)) {
823 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200824 PyObject *newargs;
825 Py_ssize_t i;
826
Antoine Pitroue0e27352011-12-15 14:31:28 +0100827 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200828 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100829 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200830 /* Set errno to the corresponding POSIX errno (overriding
831 first argument). Windows Socket error codes (>= 10000)
832 have the same value as their POSIX counterparts.
833 */
834 if (winerrcode < 10000)
835 errcode = winerror_to_errno(winerrcode);
836 else
837 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100838 *myerrno = PyLong_FromLong(errcode);
839 if (!*myerrno)
840 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200841 newargs = PyTuple_New(nargs);
842 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100843 return -1;
844 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200845 for (i = 1; i < nargs; i++) {
846 PyObject *val = PyTuple_GET_ITEM(args, i);
847 Py_INCREF(val);
848 PyTuple_SET_ITEM(newargs, i, val);
849 }
850 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100851 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200852 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800853#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200854 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000855
Antoine Pitroue0e27352011-12-15 14:31:28 +0100856 return 0;
857}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000858
Antoine Pitroue0e27352011-12-15 14:31:28 +0100859static int
860oserror_init(PyOSErrorObject *self, PyObject **p_args,
861 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800862 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100863#ifdef MS_WINDOWS
864 , PyObject *winerror
865#endif
866 )
867{
868 PyObject *args = *p_args;
869 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000870
871 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200872 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100873 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200874 PyNumber_Check(filename)) {
875 /* BlockingIOError's 3rd argument can be the number of
876 * characters written.
877 */
878 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
879 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100880 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200881 }
882 else {
883 Py_INCREF(filename);
884 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000885
Larry Hastingsb0827312014-02-09 22:05:19 -0800886 if (filename2 && filename2 != Py_None) {
887 Py_INCREF(filename2);
888 self->filename2 = filename2;
889 }
890
891 if (nargs >= 2 && nargs <= 5) {
892 /* filename, filename2, and winerror are removed from the args tuple
893 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100894 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200895 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100896 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000897
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200898 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100899 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200900 }
901 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200903 Py_XINCREF(myerrno);
904 self->myerrno = myerrno;
905
906 Py_XINCREF(strerror);
907 self->strerror = strerror;
908
909#ifdef MS_WINDOWS
910 Py_XINCREF(winerror);
911 self->winerror = winerror;
912#endif
913
Antoine Pitroue0e27352011-12-15 14:31:28 +0100914 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300915 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100916 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100917
918 return 0;
919}
920
921static PyObject *
922OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
923static int
924OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
925
926static int
927oserror_use_init(PyTypeObject *type)
928{
Martin Panter7462b6492015-11-02 03:37:02 +0000929 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100930 extraneous argument to __new__ to be ignored. The only reasonable
931 solution, given __new__ takes a variable number of arguments,
932 is to defer arg parsing and initialization to __init__.
933
Martin Pantere26da7c2016-06-02 10:07:09 +0000934 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100935 with the right arguments.
936
937 (see http://bugs.python.org/issue12555#msg148829 )
938 */
939 if (type->tp_init != (initproc) OSError_init &&
940 type->tp_new == (newfunc) OSError_new) {
941 assert((PyObject *) type != PyExc_OSError);
942 return 1;
943 }
944 return 0;
945}
946
947static PyObject *
948OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
949{
950 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800951 PyObject *myerrno = NULL, *strerror = NULL;
952 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100953#ifdef MS_WINDOWS
954 PyObject *winerror = NULL;
955#endif
956
Victor Stinner46ef3192013-11-14 22:31:41 +0100957 Py_INCREF(args);
958
Antoine Pitroue0e27352011-12-15 14:31:28 +0100959 if (!oserror_use_init(type)) {
960 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100961 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100962
Larry Hastingsb0827312014-02-09 22:05:19 -0800963 if (oserror_parse_args(&args, &myerrno, &strerror,
964 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100965#ifdef MS_WINDOWS
966 , &winerror
967#endif
968 ))
969 goto error;
970
971 if (myerrno && PyLong_Check(myerrno) &&
972 errnomap && (PyObject *) type == PyExc_OSError) {
973 PyObject *newtype;
974 newtype = PyDict_GetItem(errnomap, myerrno);
975 if (newtype) {
976 assert(PyType_Check(newtype));
977 type = (PyTypeObject *) newtype;
978 }
979 else if (PyErr_Occurred())
980 goto error;
981 }
982 }
983
984 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
985 if (!self)
986 goto error;
987
988 self->dict = NULL;
989 self->traceback = self->cause = self->context = NULL;
990 self->written = -1;
991
992 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800993 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100994#ifdef MS_WINDOWS
995 , winerror
996#endif
997 ))
998 goto error;
999 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +02001000 else {
1001 self->args = PyTuple_New(0);
1002 if (self->args == NULL)
1003 goto error;
1004 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001005
Victor Stinner46ef3192013-11-14 22:31:41 +01001006 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001007 return (PyObject *) self;
1008
1009error:
1010 Py_XDECREF(args);
1011 Py_XDECREF(self);
1012 return NULL;
1013}
1014
1015static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001016OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001017{
Larry Hastingsb0827312014-02-09 22:05:19 -08001018 PyObject *myerrno = NULL, *strerror = NULL;
1019 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001020#ifdef MS_WINDOWS
1021 PyObject *winerror = NULL;
1022#endif
1023
1024 if (!oserror_use_init(Py_TYPE(self)))
1025 /* Everything already done in OSError_new */
1026 return 0;
1027
1028 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1029 return -1;
1030
1031 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001032 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001033#ifdef MS_WINDOWS
1034 , &winerror
1035#endif
1036 ))
1037 goto error;
1038
Larry Hastingsb0827312014-02-09 22:05:19 -08001039 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001040#ifdef MS_WINDOWS
1041 , winerror
1042#endif
1043 ))
1044 goto error;
1045
Thomas Wouters477c8d52006-05-27 19:21:47 +00001046 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001047
1048error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001049 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001050 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051}
1052
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001053static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055{
1056 Py_CLEAR(self->myerrno);
1057 Py_CLEAR(self->strerror);
1058 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001059 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001060#ifdef MS_WINDOWS
1061 Py_CLEAR(self->winerror);
1062#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001063 return BaseException_clear((PyBaseExceptionObject *)self);
1064}
1065
1066static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001067OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001069 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001070 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001071 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072}
1073
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001074static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001075OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001076 void *arg)
1077{
1078 Py_VISIT(self->myerrno);
1079 Py_VISIT(self->strerror);
1080 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001081 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001082#ifdef MS_WINDOWS
1083 Py_VISIT(self->winerror);
1084#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001085 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1086}
1087
1088static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001089OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090{
Larry Hastingsb0827312014-02-09 22:05:19 -08001091#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001092#ifdef MS_WINDOWS
1093 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001094 if (self->winerror && self->filename) {
1095 if (self->filename2) {
1096 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1097 OR_NONE(self->winerror),
1098 OR_NONE(self->strerror),
1099 self->filename,
1100 self->filename2);
1101 } else {
1102 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1103 OR_NONE(self->winerror),
1104 OR_NONE(self->strerror),
1105 self->filename);
1106 }
1107 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001108 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001109 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001110 self->winerror ? self->winerror: Py_None,
1111 self->strerror ? self->strerror: Py_None);
1112#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001113 if (self->filename) {
1114 if (self->filename2) {
1115 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1116 OR_NONE(self->myerrno),
1117 OR_NONE(self->strerror),
1118 self->filename,
1119 self->filename2);
1120 } else {
1121 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1122 OR_NONE(self->myerrno),
1123 OR_NONE(self->strerror),
1124 self->filename);
1125 }
1126 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001127 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001128 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001129 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131}
1132
Thomas Wouters477c8d52006-05-27 19:21:47 +00001133static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301134OSError_reduce(PyOSErrorObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135{
1136 PyObject *args = self->args;
1137 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001138
Thomas Wouters477c8d52006-05-27 19:21:47 +00001139 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001140 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001141 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001142 Py_ssize_t size = self->filename2 ? 5 : 3;
1143 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001144 if (!args)
1145 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001146
1147 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148 Py_INCREF(tmp);
1149 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001150
1151 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001152 Py_INCREF(tmp);
1153 PyTuple_SET_ITEM(args, 1, tmp);
1154
1155 Py_INCREF(self->filename);
1156 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001157
1158 if (self->filename2) {
1159 /*
1160 * This tuple is essentially used as OSError(*args).
1161 * So, to recreate filename2, we need to pass in
1162 * winerror as well.
1163 */
1164 Py_INCREF(Py_None);
1165 PyTuple_SET_ITEM(args, 3, Py_None);
1166
1167 /* filename2 */
1168 Py_INCREF(self->filename2);
1169 PyTuple_SET_ITEM(args, 4, self->filename2);
1170 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001171 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001172 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001173
1174 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001175 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001176 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001177 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001178 Py_DECREF(args);
1179 return res;
1180}
1181
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001182static PyObject *
1183OSError_written_get(PyOSErrorObject *self, void *context)
1184{
1185 if (self->written == -1) {
1186 PyErr_SetString(PyExc_AttributeError, "characters_written");
1187 return NULL;
1188 }
1189 return PyLong_FromSsize_t(self->written);
1190}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001191
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001192static int
1193OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1194{
1195 Py_ssize_t n;
1196 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1197 if (n == -1 && PyErr_Occurred())
1198 return -1;
1199 self->written = n;
1200 return 0;
1201}
1202
1203static PyMemberDef OSError_members[] = {
1204 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1205 PyDoc_STR("POSIX exception code")},
1206 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1207 PyDoc_STR("exception strerror")},
1208 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1209 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001210 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1211 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001212#ifdef MS_WINDOWS
1213 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1214 PyDoc_STR("Win32 exception code")},
1215#endif
1216 {NULL} /* Sentinel */
1217};
1218
1219static PyMethodDef OSError_methods[] = {
1220 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001221 {NULL}
1222};
1223
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001224static PyGetSetDef OSError_getset[] = {
1225 {"characters_written", (getter) OSError_written_get,
1226 (setter) OSError_written_set, NULL},
1227 {NULL}
1228};
1229
1230
1231ComplexExtendsException(PyExc_Exception, OSError,
1232 OSError, OSError_new,
1233 OSError_methods, OSError_members, OSError_getset,
1234 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001235 "Base class for I/O related errors.");
1236
1237
1238/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001239 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001240 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001241MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1242 "I/O operation would block.");
1243MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1244 "Connection error.");
1245MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1246 "Child process error.");
1247MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1248 "Broken pipe.");
1249MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1250 "Connection aborted.");
1251MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1252 "Connection refused.");
1253MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1254 "Connection reset.");
1255MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1256 "File already exists.");
1257MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1258 "File not found.");
1259MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1260 "Operation doesn't work on directories.");
1261MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1262 "Operation only works on directories.");
1263MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1264 "Interrupted by signal.");
1265MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1266 "Not enough permissions.");
1267MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1268 "Process not found.");
1269MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1270 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001271
1272/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001273 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001274 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001275SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001276 "Read beyond end of file.");
1277
1278
1279/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001280 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001281 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001282SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001283 "Unspecified run-time error.");
1284
Yury Selivanovf488fb42015-07-03 01:04:23 -04001285/*
1286 * RecursionError extends RuntimeError
1287 */
1288SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1289 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001290
1291/*
1292 * NotImplementedError extends RuntimeError
1293 */
1294SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1295 "Method or function hasn't been implemented yet.");
1296
1297/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001298 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001299 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001300SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301 "Name not found globally.");
1302
1303/*
1304 * UnboundLocalError extends NameError
1305 */
1306SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1307 "Local name referenced but not bound to a value.");
1308
1309/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001310 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001312SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313 "Attribute not found.");
1314
1315
1316/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001317 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001319
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001320/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001321static int _report_missing_parentheses(PySyntaxErrorObject *self);
1322
Thomas Wouters477c8d52006-05-27 19:21:47 +00001323static int
1324SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1325{
1326 PyObject *info = NULL;
1327 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1328
1329 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1330 return -1;
1331
1332 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001333 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001334 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335 }
1336 if (lenargs == 2) {
1337 info = PyTuple_GET_ITEM(args, 1);
1338 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001339 if (!info)
1340 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001341
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001342 if (PyTuple_GET_SIZE(info) != 4) {
1343 /* not a very good error message, but it's what Python 2.4 gives */
1344 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1345 Py_DECREF(info);
1346 return -1;
1347 }
1348
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001349 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001350 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001352 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001353 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001354
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001355 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001356 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001357
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001358 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001359 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001360
1361 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001362
Martijn Pieters772d8092017-08-22 21:16:23 +01001363 /*
1364 * Issue #21669: Custom error for 'print' & 'exec' as statements
1365 *
1366 * Only applies to SyntaxError instances, not to subclasses such
1367 * as TabError or IndentationError (see issue #31161)
1368 */
1369 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1370 self->text && PyUnicode_Check(self->text) &&
1371 _report_missing_parentheses(self) < 0) {
1372 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001373 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374 }
1375 return 0;
1376}
1377
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001378static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379SyntaxError_clear(PySyntaxErrorObject *self)
1380{
1381 Py_CLEAR(self->msg);
1382 Py_CLEAR(self->filename);
1383 Py_CLEAR(self->lineno);
1384 Py_CLEAR(self->offset);
1385 Py_CLEAR(self->text);
1386 Py_CLEAR(self->print_file_and_line);
1387 return BaseException_clear((PyBaseExceptionObject *)self);
1388}
1389
1390static void
1391SyntaxError_dealloc(PySyntaxErrorObject *self)
1392{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001393 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001394 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001395 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001396}
1397
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001398static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001399SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1400{
1401 Py_VISIT(self->msg);
1402 Py_VISIT(self->filename);
1403 Py_VISIT(self->lineno);
1404 Py_VISIT(self->offset);
1405 Py_VISIT(self->text);
1406 Py_VISIT(self->print_file_and_line);
1407 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1408}
1409
1410/* This is called "my_basename" instead of just "basename" to avoid name
1411 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1412 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001413static PyObject*
1414my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001415{
Victor Stinner6237daf2010-04-28 17:26:19 +00001416 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001417 int kind;
1418 void *data;
1419
1420 if (PyUnicode_READY(name))
1421 return NULL;
1422 kind = PyUnicode_KIND(name);
1423 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001424 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001425 offset = 0;
1426 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001427 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001428 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001429 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001430 if (offset != 0)
1431 return PyUnicode_Substring(name, offset, size);
1432 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001433 Py_INCREF(name);
1434 return name;
1435 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001436}
1437
1438
1439static PyObject *
1440SyntaxError_str(PySyntaxErrorObject *self)
1441{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001442 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001443 PyObject *filename;
1444 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001445 /* Below, we always ignore overflow errors, just printing -1.
1446 Still, we cannot allow an OverflowError to be raised, so
1447 we need to call PyLong_AsLongAndOverflow. */
1448 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001449
1450 /* XXX -- do all the additional formatting with filename and
1451 lineno here */
1452
Neal Norwitzed2b7392007-08-26 04:51:10 +00001453 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001454 filename = my_basename(self->filename);
1455 if (filename == NULL)
1456 return NULL;
1457 } else {
1458 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001459 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001460 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001461
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001462 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001463 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001464
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001465 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001466 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001467 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001468 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001470 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001471 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001472 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001473 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001474 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001475 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001476 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001477 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001478 Py_XDECREF(filename);
1479 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001480}
1481
1482static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001483 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1484 PyDoc_STR("exception msg")},
1485 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1486 PyDoc_STR("exception filename")},
1487 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1488 PyDoc_STR("exception lineno")},
1489 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1490 PyDoc_STR("exception offset")},
1491 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1492 PyDoc_STR("exception text")},
1493 {"print_file_and_line", T_OBJECT,
1494 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1495 PyDoc_STR("exception print_file_and_line")},
1496 {NULL} /* Sentinel */
1497};
1498
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001499ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001500 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501 SyntaxError_str, "Invalid syntax.");
1502
1503
1504/*
1505 * IndentationError extends SyntaxError
1506 */
1507MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1508 "Improper indentation.");
1509
1510
1511/*
1512 * TabError extends IndentationError
1513 */
1514MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1515 "Improper mixture of spaces and tabs.");
1516
1517
1518/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001519 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001520 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001521SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001522 "Base class for lookup errors.");
1523
1524
1525/*
1526 * IndexError extends LookupError
1527 */
1528SimpleExtendsException(PyExc_LookupError, IndexError,
1529 "Sequence index out of range.");
1530
1531
1532/*
1533 * KeyError extends LookupError
1534 */
1535static PyObject *
1536KeyError_str(PyBaseExceptionObject *self)
1537{
1538 /* If args is a tuple of exactly one item, apply repr to args[0].
1539 This is done so that e.g. the exception raised by {}[''] prints
1540 KeyError: ''
1541 rather than the confusing
1542 KeyError
1543 alone. The downside is that if KeyError is raised with an explanatory
1544 string, that string will be displayed in quotes. Too bad.
1545 If args is anything else, use the default BaseException__str__().
1546 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001547 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001548 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549 }
1550 return BaseException_str(self);
1551}
1552
1553ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001554 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001555
1556
1557/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001558 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001559 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001560SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561 "Inappropriate argument value (of correct type).");
1562
1563/*
1564 * UnicodeError extends ValueError
1565 */
1566
1567SimpleExtendsException(PyExc_ValueError, UnicodeError,
1568 "Unicode related error.");
1569
Thomas Wouters477c8d52006-05-27 19:21:47 +00001570static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001571get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001572{
1573 if (!attr) {
1574 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1575 return NULL;
1576 }
1577
Christian Heimes72b710a2008-05-26 13:28:38 +00001578 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001579 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1580 return NULL;
1581 }
1582 Py_INCREF(attr);
1583 return attr;
1584}
1585
1586static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001587get_unicode(PyObject *attr, const char *name)
1588{
1589 if (!attr) {
1590 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1591 return NULL;
1592 }
1593
1594 if (!PyUnicode_Check(attr)) {
1595 PyErr_Format(PyExc_TypeError,
1596 "%.200s attribute must be unicode", name);
1597 return NULL;
1598 }
1599 Py_INCREF(attr);
1600 return attr;
1601}
1602
Walter Dörwaldd2034312007-05-18 16:29:38 +00001603static int
1604set_unicodefromstring(PyObject **attr, const char *value)
1605{
1606 PyObject *obj = PyUnicode_FromString(value);
1607 if (!obj)
1608 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001609 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001610 return 0;
1611}
1612
Thomas Wouters477c8d52006-05-27 19:21:47 +00001613PyObject *
1614PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1615{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001616 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001617}
1618
1619PyObject *
1620PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1621{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001622 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001623}
1624
1625PyObject *
1626PyUnicodeEncodeError_GetObject(PyObject *exc)
1627{
1628 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1629}
1630
1631PyObject *
1632PyUnicodeDecodeError_GetObject(PyObject *exc)
1633{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001634 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001635}
1636
1637PyObject *
1638PyUnicodeTranslateError_GetObject(PyObject *exc)
1639{
1640 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1641}
1642
1643int
1644PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1645{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001646 Py_ssize_t size;
1647 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1648 "object");
1649 if (!obj)
1650 return -1;
1651 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001652 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001653 if (*start<0)
1654 *start = 0; /*XXX check for values <0*/
1655 if (*start>=size)
1656 *start = size-1;
1657 Py_DECREF(obj);
1658 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001659}
1660
1661
1662int
1663PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1664{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001665 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001666 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001667 if (!obj)
1668 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001669 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001670 *start = ((PyUnicodeErrorObject *)exc)->start;
1671 if (*start<0)
1672 *start = 0;
1673 if (*start>=size)
1674 *start = size-1;
1675 Py_DECREF(obj);
1676 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001677}
1678
1679
1680int
1681PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1682{
1683 return PyUnicodeEncodeError_GetStart(exc, start);
1684}
1685
1686
1687int
1688PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1689{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001690 ((PyUnicodeErrorObject *)exc)->start = start;
1691 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001692}
1693
1694
1695int
1696PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1697{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001698 ((PyUnicodeErrorObject *)exc)->start = start;
1699 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001700}
1701
1702
1703int
1704PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1705{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001706 ((PyUnicodeErrorObject *)exc)->start = start;
1707 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001708}
1709
1710
1711int
1712PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1713{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001714 Py_ssize_t size;
1715 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1716 "object");
1717 if (!obj)
1718 return -1;
1719 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001720 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001721 if (*end<1)
1722 *end = 1;
1723 if (*end>size)
1724 *end = size;
1725 Py_DECREF(obj);
1726 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001727}
1728
1729
1730int
1731PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1732{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001733 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001734 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001735 if (!obj)
1736 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001737 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001738 *end = ((PyUnicodeErrorObject *)exc)->end;
1739 if (*end<1)
1740 *end = 1;
1741 if (*end>size)
1742 *end = size;
1743 Py_DECREF(obj);
1744 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001745}
1746
1747
1748int
1749PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1750{
1751 return PyUnicodeEncodeError_GetEnd(exc, start);
1752}
1753
1754
1755int
1756PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1757{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001758 ((PyUnicodeErrorObject *)exc)->end = end;
1759 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001760}
1761
1762
1763int
1764PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1765{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001766 ((PyUnicodeErrorObject *)exc)->end = end;
1767 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001768}
1769
1770
1771int
1772PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1773{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001774 ((PyUnicodeErrorObject *)exc)->end = end;
1775 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776}
1777
1778PyObject *
1779PyUnicodeEncodeError_GetReason(PyObject *exc)
1780{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001781 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001782}
1783
1784
1785PyObject *
1786PyUnicodeDecodeError_GetReason(PyObject *exc)
1787{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001788 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001789}
1790
1791
1792PyObject *
1793PyUnicodeTranslateError_GetReason(PyObject *exc)
1794{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001795 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796}
1797
1798
1799int
1800PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1801{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001802 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1803 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001804}
1805
1806
1807int
1808PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1809{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001810 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1811 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812}
1813
1814
1815int
1816PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1817{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001818 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1819 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820}
1821
1822
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824UnicodeError_clear(PyUnicodeErrorObject *self)
1825{
1826 Py_CLEAR(self->encoding);
1827 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001828 Py_CLEAR(self->reason);
1829 return BaseException_clear((PyBaseExceptionObject *)self);
1830}
1831
1832static void
1833UnicodeError_dealloc(PyUnicodeErrorObject *self)
1834{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001835 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001837 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838}
1839
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001840static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001841UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1842{
1843 Py_VISIT(self->encoding);
1844 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845 Py_VISIT(self->reason);
1846 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1847}
1848
1849static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001850 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1851 PyDoc_STR("exception encoding")},
1852 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1853 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001854 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001855 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001856 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001857 PyDoc_STR("exception end")},
1858 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1859 PyDoc_STR("exception reason")},
1860 {NULL} /* Sentinel */
1861};
1862
1863
1864/*
1865 * UnicodeEncodeError extends UnicodeError
1866 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001867
1868static int
1869UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1870{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001871 PyUnicodeErrorObject *err;
1872
Thomas Wouters477c8d52006-05-27 19:21:47 +00001873 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1874 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001875
1876 err = (PyUnicodeErrorObject *)self;
1877
1878 Py_CLEAR(err->encoding);
1879 Py_CLEAR(err->object);
1880 Py_CLEAR(err->reason);
1881
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001882 if (!PyArg_ParseTuple(args, "UUnnU",
1883 &err->encoding, &err->object,
1884 &err->start, &err->end, &err->reason)) {
1885 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001886 return -1;
1887 }
1888
Guido van Rossum98297ee2007-11-06 21:34:58 +00001889 Py_INCREF(err->encoding);
1890 Py_INCREF(err->object);
1891 Py_INCREF(err->reason);
1892
1893 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001894}
1895
1896static PyObject *
1897UnicodeEncodeError_str(PyObject *self)
1898{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001899 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001900 PyObject *result = NULL;
1901 PyObject *reason_str = NULL;
1902 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001903
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001904 if (!uself->object)
1905 /* Not properly initialized. */
1906 return PyUnicode_FromString("");
1907
Eric Smith0facd772010-02-24 15:42:29 +00001908 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001909 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001910 reason_str = PyObject_Str(uself->reason);
1911 if (reason_str == NULL)
1912 goto done;
1913 encoding_str = PyObject_Str(uself->encoding);
1914 if (encoding_str == NULL)
1915 goto done;
1916
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001917 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1918 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001919 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001920 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001921 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001922 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001923 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001924 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001925 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001926 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001927 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001928 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001929 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001930 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001931 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001932 }
Eric Smith0facd772010-02-24 15:42:29 +00001933 else {
1934 result = PyUnicode_FromFormat(
1935 "'%U' codec can't encode characters in position %zd-%zd: %U",
1936 encoding_str,
1937 uself->start,
1938 uself->end-1,
1939 reason_str);
1940 }
1941done:
1942 Py_XDECREF(reason_str);
1943 Py_XDECREF(encoding_str);
1944 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945}
1946
1947static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001948 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001949 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001950 sizeof(PyUnicodeErrorObject), 0,
1951 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1952 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1953 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001954 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1955 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001956 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001957 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001958};
1959PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1960
1961PyObject *
1962PyUnicodeEncodeError_Create(
1963 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1964 Py_ssize_t start, Py_ssize_t end, const char *reason)
1965{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001966 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001967 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968}
1969
1970
1971/*
1972 * UnicodeDecodeError extends UnicodeError
1973 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001974
1975static int
1976UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1977{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001978 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001979
Thomas Wouters477c8d52006-05-27 19:21:47 +00001980 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1981 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001982
1983 ude = (PyUnicodeErrorObject *)self;
1984
1985 Py_CLEAR(ude->encoding);
1986 Py_CLEAR(ude->object);
1987 Py_CLEAR(ude->reason);
1988
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001989 if (!PyArg_ParseTuple(args, "UOnnU",
1990 &ude->encoding, &ude->object,
1991 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001992 ude->encoding = ude->object = ude->reason = NULL;
1993 return -1;
1994 }
1995
Guido van Rossum98297ee2007-11-06 21:34:58 +00001996 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001997 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001998 Py_INCREF(ude->reason);
1999
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002000 if (!PyBytes_Check(ude->object)) {
2001 Py_buffer view;
2002 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2003 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002004 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002005 PyBuffer_Release(&view);
2006 if (!ude->object)
2007 goto error;
2008 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002009 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002010
2011error:
2012 Py_CLEAR(ude->encoding);
2013 Py_CLEAR(ude->object);
2014 Py_CLEAR(ude->reason);
2015 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002016}
2017
2018static PyObject *
2019UnicodeDecodeError_str(PyObject *self)
2020{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002021 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002022 PyObject *result = NULL;
2023 PyObject *reason_str = NULL;
2024 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002025
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002026 if (!uself->object)
2027 /* Not properly initialized. */
2028 return PyUnicode_FromString("");
2029
Eric Smith0facd772010-02-24 15:42:29 +00002030 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002031 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002032 reason_str = PyObject_Str(uself->reason);
2033 if (reason_str == NULL)
2034 goto done;
2035 encoding_str = PyObject_Str(uself->encoding);
2036 if (encoding_str == NULL)
2037 goto done;
2038
2039 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002040 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002041 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002042 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002043 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002044 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002045 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002046 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002047 }
Eric Smith0facd772010-02-24 15:42:29 +00002048 else {
2049 result = PyUnicode_FromFormat(
2050 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2051 encoding_str,
2052 uself->start,
2053 uself->end-1,
2054 reason_str
2055 );
2056 }
2057done:
2058 Py_XDECREF(reason_str);
2059 Py_XDECREF(encoding_str);
2060 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002061}
2062
2063static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002064 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002065 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002066 sizeof(PyUnicodeErrorObject), 0,
2067 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2068 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2069 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002070 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2071 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002072 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002073 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074};
2075PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2076
2077PyObject *
2078PyUnicodeDecodeError_Create(
2079 const char *encoding, const char *object, Py_ssize_t length,
2080 Py_ssize_t start, Py_ssize_t end, const char *reason)
2081{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002082 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002083 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002084}
2085
2086
2087/*
2088 * UnicodeTranslateError extends UnicodeError
2089 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002090
2091static int
2092UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2093 PyObject *kwds)
2094{
2095 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2096 return -1;
2097
2098 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099 Py_CLEAR(self->reason);
2100
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002101 if (!PyArg_ParseTuple(args, "UnnU",
2102 &self->object,
2103 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002104 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002105 return -1;
2106 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002107
Thomas Wouters477c8d52006-05-27 19:21:47 +00002108 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002109 Py_INCREF(self->reason);
2110
2111 return 0;
2112}
2113
2114
2115static PyObject *
2116UnicodeTranslateError_str(PyObject *self)
2117{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002118 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002119 PyObject *result = NULL;
2120 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002121
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002122 if (!uself->object)
2123 /* Not properly initialized. */
2124 return PyUnicode_FromString("");
2125
Eric Smith0facd772010-02-24 15:42:29 +00002126 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002127 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002128 reason_str = PyObject_Str(uself->reason);
2129 if (reason_str == NULL)
2130 goto done;
2131
Victor Stinner53b33e72011-11-21 01:17:27 +01002132 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2133 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002134 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002135 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002136 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002137 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002138 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002139 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002140 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002141 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002142 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002143 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002144 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002145 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002146 );
Eric Smith0facd772010-02-24 15:42:29 +00002147 } else {
2148 result = PyUnicode_FromFormat(
2149 "can't translate characters in position %zd-%zd: %U",
2150 uself->start,
2151 uself->end-1,
2152 reason_str
2153 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002154 }
Eric Smith0facd772010-02-24 15:42:29 +00002155done:
2156 Py_XDECREF(reason_str);
2157 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002158}
2159
2160static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002161 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002162 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002163 sizeof(PyUnicodeErrorObject), 0,
2164 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2165 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2166 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002167 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002168 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2169 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002170 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171};
2172PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2173
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002174/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002175PyObject *
2176PyUnicodeTranslateError_Create(
2177 const Py_UNICODE *object, Py_ssize_t length,
2178 Py_ssize_t start, Py_ssize_t end, const char *reason)
2179{
2180 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002181 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002182}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002183
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002184PyObject *
2185_PyUnicodeTranslateError_Create(
2186 PyObject *object,
2187 Py_ssize_t start, Py_ssize_t end, const char *reason)
2188{
Victor Stinner69598d4c2014-04-04 20:59:44 +02002189 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002190 object, start, end, reason);
2191}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002192
2193/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002194 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002196SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002197 "Assertion failed.");
2198
2199
2200/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002201 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002202 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002203SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002204 "Base class for arithmetic errors.");
2205
2206
2207/*
2208 * FloatingPointError extends ArithmeticError
2209 */
2210SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2211 "Floating point operation failed.");
2212
2213
2214/*
2215 * OverflowError extends ArithmeticError
2216 */
2217SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2218 "Result too large to be represented.");
2219
2220
2221/*
2222 * ZeroDivisionError extends ArithmeticError
2223 */
2224SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2225 "Second argument to a division or modulo operation was zero.");
2226
2227
2228/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002229 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002230 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002231SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002232 "Internal error in the Python interpreter.\n"
2233 "\n"
2234 "Please report this to the Python maintainer, along with the traceback,\n"
2235 "the Python version, and the hardware/OS platform and version.");
2236
2237
2238/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002239 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002240 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002241SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002242 "Weak ref proxy used after referent went away.");
2243
2244
2245/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002246 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002247 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002248
2249#define MEMERRORS_SAVE 16
2250static PyBaseExceptionObject *memerrors_freelist = NULL;
2251static int memerrors_numfree = 0;
2252
2253static PyObject *
2254MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2255{
2256 PyBaseExceptionObject *self;
2257
2258 if (type != (PyTypeObject *) PyExc_MemoryError)
2259 return BaseException_new(type, args, kwds);
2260 if (memerrors_freelist == NULL)
2261 return BaseException_new(type, args, kwds);
2262 /* Fetch object from freelist and revive it */
2263 self = memerrors_freelist;
2264 self->args = PyTuple_New(0);
2265 /* This shouldn't happen since the empty tuple is persistent */
2266 if (self->args == NULL)
2267 return NULL;
2268 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2269 memerrors_numfree--;
2270 self->dict = NULL;
2271 _Py_NewReference((PyObject *)self);
2272 _PyObject_GC_TRACK(self);
2273 return (PyObject *)self;
2274}
2275
2276static void
2277MemoryError_dealloc(PyBaseExceptionObject *self)
2278{
2279 _PyObject_GC_UNTRACK(self);
2280 BaseException_clear(self);
2281 if (memerrors_numfree >= MEMERRORS_SAVE)
2282 Py_TYPE(self)->tp_free((PyObject *)self);
2283 else {
2284 self->dict = (PyObject *) memerrors_freelist;
2285 memerrors_freelist = self;
2286 memerrors_numfree++;
2287 }
2288}
2289
2290static void
2291preallocate_memerrors(void)
2292{
2293 /* We create enough MemoryErrors and then decref them, which will fill
2294 up the freelist. */
2295 int i;
2296 PyObject *errors[MEMERRORS_SAVE];
2297 for (i = 0; i < MEMERRORS_SAVE; i++) {
2298 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2299 NULL, NULL);
2300 if (!errors[i])
2301 Py_FatalError("Could not preallocate MemoryError object");
2302 }
2303 for (i = 0; i < MEMERRORS_SAVE; i++) {
2304 Py_DECREF(errors[i]);
2305 }
2306}
2307
2308static void
2309free_preallocated_memerrors(void)
2310{
2311 while (memerrors_freelist != NULL) {
2312 PyObject *self = (PyObject *) memerrors_freelist;
2313 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2314 Py_TYPE(self)->tp_free((PyObject *)self);
2315 }
2316}
2317
2318
2319static PyTypeObject _PyExc_MemoryError = {
2320 PyVarObject_HEAD_INIT(NULL, 0)
2321 "MemoryError",
2322 sizeof(PyBaseExceptionObject),
2323 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2324 0, 0, 0, 0, 0, 0, 0,
2325 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2326 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2327 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2328 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2329 (initproc)BaseException_init, 0, MemoryError_new
2330};
2331PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2332
Thomas Wouters477c8d52006-05-27 19:21:47 +00002333
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002334/*
2335 * BufferError extends Exception
2336 */
2337SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2338
Thomas Wouters477c8d52006-05-27 19:21:47 +00002339
2340/* Warning category docstrings */
2341
2342/*
2343 * Warning extends Exception
2344 */
2345SimpleExtendsException(PyExc_Exception, Warning,
2346 "Base class for warning categories.");
2347
2348
2349/*
2350 * UserWarning extends Warning
2351 */
2352SimpleExtendsException(PyExc_Warning, UserWarning,
2353 "Base class for warnings generated by user code.");
2354
2355
2356/*
2357 * DeprecationWarning extends Warning
2358 */
2359SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2360 "Base class for warnings about deprecated features.");
2361
2362
2363/*
2364 * PendingDeprecationWarning extends Warning
2365 */
2366SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2367 "Base class for warnings about features which will be deprecated\n"
2368 "in the future.");
2369
2370
2371/*
2372 * SyntaxWarning extends Warning
2373 */
2374SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2375 "Base class for warnings about dubious syntax.");
2376
2377
2378/*
2379 * RuntimeWarning extends Warning
2380 */
2381SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2382 "Base class for warnings about dubious runtime behavior.");
2383
2384
2385/*
2386 * FutureWarning extends Warning
2387 */
2388SimpleExtendsException(PyExc_Warning, FutureWarning,
2389 "Base class for warnings about constructs that will change semantically\n"
2390 "in the future.");
2391
2392
2393/*
2394 * ImportWarning extends Warning
2395 */
2396SimpleExtendsException(PyExc_Warning, ImportWarning,
2397 "Base class for warnings about probable mistakes in module imports");
2398
2399
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002400/*
2401 * UnicodeWarning extends Warning
2402 */
2403SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2404 "Base class for warnings about Unicode related problems, mostly\n"
2405 "related to conversion problems.");
2406
Georg Brandl08be72d2010-10-24 15:11:22 +00002407
Guido van Rossum98297ee2007-11-06 21:34:58 +00002408/*
2409 * BytesWarning extends Warning
2410 */
2411SimpleExtendsException(PyExc_Warning, BytesWarning,
2412 "Base class for warnings about bytes and buffer related problems, mostly\n"
2413 "related to conversion from str or comparing to str.");
2414
2415
Georg Brandl08be72d2010-10-24 15:11:22 +00002416/*
2417 * ResourceWarning extends Warning
2418 */
2419SimpleExtendsException(PyExc_Warning, ResourceWarning,
2420 "Base class for warnings about resource usage.");
2421
2422
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002423
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002424#define PRE_INIT(TYPE) \
2425 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2426 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2427 Py_FatalError("exceptions bootstrapping error."); \
2428 Py_INCREF(PyExc_ ## TYPE); \
2429 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002430
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002431#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002432 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2433 Py_FatalError("Module dictionary insertion problem.");
2434
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002435#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002436 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002437 PyExc_ ## NAME = PyExc_ ## TYPE; \
2438 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2439 Py_FatalError("Module dictionary insertion problem.");
2440
2441#define ADD_ERRNO(TYPE, CODE) { \
2442 PyObject *_code = PyLong_FromLong(CODE); \
2443 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2444 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2445 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002446 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002447 }
2448
2449#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002450#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002451/* The following constants were added to errno.h in VS2010 but have
2452 preferred WSA equivalents. */
2453#undef EADDRINUSE
2454#undef EADDRNOTAVAIL
2455#undef EAFNOSUPPORT
2456#undef EALREADY
2457#undef ECONNABORTED
2458#undef ECONNREFUSED
2459#undef ECONNRESET
2460#undef EDESTADDRREQ
2461#undef EHOSTUNREACH
2462#undef EINPROGRESS
2463#undef EISCONN
2464#undef ELOOP
2465#undef EMSGSIZE
2466#undef ENETDOWN
2467#undef ENETRESET
2468#undef ENETUNREACH
2469#undef ENOBUFS
2470#undef ENOPROTOOPT
2471#undef ENOTCONN
2472#undef ENOTSOCK
2473#undef EOPNOTSUPP
2474#undef EPROTONOSUPPORT
2475#undef EPROTOTYPE
2476#undef ETIMEDOUT
2477#undef EWOULDBLOCK
2478
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002479#if defined(WSAEALREADY) && !defined(EALREADY)
2480#define EALREADY WSAEALREADY
2481#endif
2482#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2483#define ECONNABORTED WSAECONNABORTED
2484#endif
2485#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2486#define ECONNREFUSED WSAECONNREFUSED
2487#endif
2488#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2489#define ECONNRESET WSAECONNRESET
2490#endif
2491#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2492#define EINPROGRESS WSAEINPROGRESS
2493#endif
2494#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2495#define ESHUTDOWN WSAESHUTDOWN
2496#endif
2497#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2498#define ETIMEDOUT WSAETIMEDOUT
2499#endif
2500#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2501#define EWOULDBLOCK WSAEWOULDBLOCK
2502#endif
2503#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002504
Martin v. Löwis1a214512008-06-11 05:26:20 +00002505void
Brett Cannonfd074152012-04-14 14:10:13 -04002506_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002507{
Brett Cannonfd074152012-04-14 14:10:13 -04002508 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002509
2510 PRE_INIT(BaseException)
2511 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002512 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002513 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002514 PRE_INIT(StopIteration)
2515 PRE_INIT(GeneratorExit)
2516 PRE_INIT(SystemExit)
2517 PRE_INIT(KeyboardInterrupt)
2518 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002519 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002520 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002521 PRE_INIT(EOFError)
2522 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002523 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002524 PRE_INIT(NotImplementedError)
2525 PRE_INIT(NameError)
2526 PRE_INIT(UnboundLocalError)
2527 PRE_INIT(AttributeError)
2528 PRE_INIT(SyntaxError)
2529 PRE_INIT(IndentationError)
2530 PRE_INIT(TabError)
2531 PRE_INIT(LookupError)
2532 PRE_INIT(IndexError)
2533 PRE_INIT(KeyError)
2534 PRE_INIT(ValueError)
2535 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536 PRE_INIT(UnicodeEncodeError)
2537 PRE_INIT(UnicodeDecodeError)
2538 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539 PRE_INIT(AssertionError)
2540 PRE_INIT(ArithmeticError)
2541 PRE_INIT(FloatingPointError)
2542 PRE_INIT(OverflowError)
2543 PRE_INIT(ZeroDivisionError)
2544 PRE_INIT(SystemError)
2545 PRE_INIT(ReferenceError)
2546 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002547 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002548 PRE_INIT(Warning)
2549 PRE_INIT(UserWarning)
2550 PRE_INIT(DeprecationWarning)
2551 PRE_INIT(PendingDeprecationWarning)
2552 PRE_INIT(SyntaxWarning)
2553 PRE_INIT(RuntimeWarning)
2554 PRE_INIT(FutureWarning)
2555 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002556 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002557 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002558 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002559
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002560 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002561 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002562
Louie Luc4318542017-03-29 13:28:15 +08002563 PRE_INIT(BlockingIOError)
2564 PRE_INIT(BrokenPipeError)
2565 PRE_INIT(ChildProcessError)
2566 PRE_INIT(ConnectionAbortedError)
2567 PRE_INIT(ConnectionRefusedError)
2568 PRE_INIT(ConnectionResetError)
2569 PRE_INIT(FileExistsError)
2570 PRE_INIT(FileNotFoundError)
2571 PRE_INIT(IsADirectoryError)
2572 PRE_INIT(NotADirectoryError)
2573 PRE_INIT(InterruptedError)
2574 PRE_INIT(PermissionError)
2575 PRE_INIT(ProcessLookupError)
2576 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002577
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578 bdict = PyModule_GetDict(bltinmod);
2579 if (bdict == NULL)
2580 Py_FatalError("exceptions bootstrapping error.");
2581
2582 POST_INIT(BaseException)
2583 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002585 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 POST_INIT(StopIteration)
2587 POST_INIT(GeneratorExit)
2588 POST_INIT(SystemExit)
2589 POST_INIT(KeyboardInterrupt)
2590 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002591 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002593 INIT_ALIAS(EnvironmentError, OSError)
2594 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002596 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002598 POST_INIT(EOFError)
2599 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002600 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002601 POST_INIT(NotImplementedError)
2602 POST_INIT(NameError)
2603 POST_INIT(UnboundLocalError)
2604 POST_INIT(AttributeError)
2605 POST_INIT(SyntaxError)
2606 POST_INIT(IndentationError)
2607 POST_INIT(TabError)
2608 POST_INIT(LookupError)
2609 POST_INIT(IndexError)
2610 POST_INIT(KeyError)
2611 POST_INIT(ValueError)
2612 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613 POST_INIT(UnicodeEncodeError)
2614 POST_INIT(UnicodeDecodeError)
2615 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002616 POST_INIT(AssertionError)
2617 POST_INIT(ArithmeticError)
2618 POST_INIT(FloatingPointError)
2619 POST_INIT(OverflowError)
2620 POST_INIT(ZeroDivisionError)
2621 POST_INIT(SystemError)
2622 POST_INIT(ReferenceError)
2623 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002624 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002625 POST_INIT(Warning)
2626 POST_INIT(UserWarning)
2627 POST_INIT(DeprecationWarning)
2628 POST_INIT(PendingDeprecationWarning)
2629 POST_INIT(SyntaxWarning)
2630 POST_INIT(RuntimeWarning)
2631 POST_INIT(FutureWarning)
2632 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002633 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002634 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002635 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002636
Antoine Pitrouac456a12012-01-18 21:35:21 +01002637 if (!errnomap) {
2638 errnomap = PyDict_New();
2639 if (!errnomap)
2640 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2641 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002642
2643 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002644 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002645
Louie Luc4318542017-03-29 13:28:15 +08002646 POST_INIT(BlockingIOError)
2647 ADD_ERRNO(BlockingIOError, EAGAIN)
2648 ADD_ERRNO(BlockingIOError, EALREADY)
2649 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2650 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2651 POST_INIT(BrokenPipeError)
2652 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002653#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002654 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002655#endif
Louie Luc4318542017-03-29 13:28:15 +08002656 POST_INIT(ChildProcessError)
2657 ADD_ERRNO(ChildProcessError, ECHILD)
2658 POST_INIT(ConnectionAbortedError)
2659 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2660 POST_INIT(ConnectionRefusedError)
2661 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2662 POST_INIT(ConnectionResetError)
2663 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2664 POST_INIT(FileExistsError)
2665 ADD_ERRNO(FileExistsError, EEXIST)
2666 POST_INIT(FileNotFoundError)
2667 ADD_ERRNO(FileNotFoundError, ENOENT)
2668 POST_INIT(IsADirectoryError)
2669 ADD_ERRNO(IsADirectoryError, EISDIR)
2670 POST_INIT(NotADirectoryError)
2671 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2672 POST_INIT(InterruptedError)
2673 ADD_ERRNO(InterruptedError, EINTR)
2674 POST_INIT(PermissionError)
2675 ADD_ERRNO(PermissionError, EACCES)
2676 ADD_ERRNO(PermissionError, EPERM)
2677 POST_INIT(ProcessLookupError)
2678 ADD_ERRNO(ProcessLookupError, ESRCH)
2679 POST_INIT(TimeoutError)
2680 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002681
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002682 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002683}
2684
2685void
2686_PyExc_Fini(void)
2687{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002688 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002689 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002690}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002691
2692/* Helper to do the equivalent of "raise X from Y" in C, but always using
2693 * the current exception rather than passing one in.
2694 *
2695 * We currently limit this to *only* exceptions that use the BaseException
2696 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2697 * those correctly without losing data and without losing backwards
2698 * compatibility.
2699 *
2700 * We also aim to rule out *all* exceptions that might be storing additional
2701 * state, whether by having a size difference relative to BaseException,
2702 * additional arguments passed in during construction or by having a
2703 * non-empty instance dict.
2704 *
2705 * We need to be very careful with what we wrap, since changing types to
2706 * a broader exception type would be backwards incompatible for
2707 * existing codecs, and with different init or new method implementations
2708 * may either not support instantiation with PyErr_Format or lose
2709 * information when instantiated that way.
2710 *
2711 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2712 * fact that exceptions are expected to support pickling. If more builtin
2713 * exceptions (e.g. AttributeError) start to be converted to rich
2714 * exceptions with additional attributes, that's probably a better approach
2715 * to pursue over adding special cases for particular stateful subclasses.
2716 *
2717 * Returns a borrowed reference to the new exception (if any), NULL if the
2718 * existing exception was left in place.
2719 */
2720PyObject *
2721_PyErr_TrySetFromCause(const char *format, ...)
2722{
2723 PyObject* msg_prefix;
2724 PyObject *exc, *val, *tb;
2725 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002726 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002727 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002728 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002729 PyObject *new_exc, *new_val, *new_tb;
2730 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002731 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002732
Nick Coghlan8b097b42013-11-13 23:49:21 +10002733 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002734 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002735 /* Ensure type info indicates no extra state is stored at the C level
2736 * and that the type can be reinstantiated using PyErr_Format
2737 */
2738 caught_type_size = caught_type->tp_basicsize;
2739 base_exc_size = _PyExc_BaseException.tp_basicsize;
2740 same_basic_size = (
2741 caught_type_size == base_exc_size ||
2742 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002743 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002744 )
2745 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002746 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002747 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002748 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002749 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002750 /* We can't be sure we can wrap this safely, since it may contain
2751 * more state than just the exception type. Accordingly, we just
2752 * leave it alone.
2753 */
2754 PyErr_Restore(exc, val, tb);
2755 return NULL;
2756 }
2757
2758 /* Check the args are empty or contain a single string */
2759 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002760 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002761 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002762 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002763 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002764 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002765 /* More than 1 arg, or the one arg we do have isn't a string
2766 */
2767 PyErr_Restore(exc, val, tb);
2768 return NULL;
2769 }
2770
2771 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002772 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002773 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002774 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002775 /* While we could potentially copy a non-empty instance dictionary
2776 * to the replacement exception, for now we take the more
2777 * conservative path of leaving exceptions with attributes set
2778 * alone.
2779 */
2780 PyErr_Restore(exc, val, tb);
2781 return NULL;
2782 }
2783
2784 /* For exceptions that we can wrap safely, we chain the original
2785 * exception to a new one of the exact same type with an
2786 * error message that mentions the additional details and the
2787 * original exception.
2788 *
2789 * It would be nice to wrap OSError and various other exception
2790 * types as well, but that's quite a bit trickier due to the extra
2791 * state potentially stored on OSError instances.
2792 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002793 /* Ensure the traceback is set correctly on the existing exception */
2794 if (tb != NULL) {
2795 PyException_SetTraceback(val, tb);
2796 Py_DECREF(tb);
2797 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002798
Christian Heimes507eabd2013-11-14 01:39:35 +01002799#ifdef HAVE_STDARG_PROTOTYPES
2800 va_start(vargs, format);
2801#else
2802 va_start(vargs);
2803#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002804 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002805 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002806 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002807 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002808 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002809 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002810 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002811
2812 PyErr_Format(exc, "%U (%s: %S)",
2813 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002814 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002815 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002816 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2817 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2818 PyException_SetCause(new_val, val);
2819 PyErr_Restore(new_exc, new_val, new_tb);
2820 return new_val;
2821}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002822
2823
2824/* To help with migration from Python 2, SyntaxError.__init__ applies some
2825 * heuristics to try to report a more meaningful exception when print and
2826 * exec are used like statements.
2827 *
2828 * The heuristics are currently expected to detect the following cases:
2829 * - top level statement
2830 * - statement in a nested suite
2831 * - trailing section of a one line complex statement
2832 *
2833 * They're currently known not to trigger:
2834 * - after a semi-colon
2835 *
2836 * The error message can be a bit odd in cases where the "arguments" are
2837 * completely illegal syntactically, but that isn't worth the hassle of
2838 * fixing.
2839 *
2840 * We also can't do anything about cases that are legal Python 3 syntax
2841 * but mean something entirely different from what they did in Python 2
2842 * (omitting the arguments entirely, printing items preceded by a unary plus
2843 * or minus, using the stream redirection syntax).
2844 */
2845
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302846
2847// Static helper for setting legacy print error message
2848static int
2849_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2850{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302851 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302852 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302853 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302854 Py_ssize_t start_pos = start + PRINT_OFFSET;
2855 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2856 Py_UCS4 semicolon = ';';
2857 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2858 start_pos, text_len, 1);
2859 if (end_pos < -1) {
2860 return -1;
2861 } else if (end_pos == -1) {
2862 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302863 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302864
2865 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302866 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302867 return -1;
2868 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302869
2870 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2871 if (strip_sep_obj == NULL) {
2872 Py_DECREF(data);
2873 return -1;
2874 }
2875
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302876 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302877 Py_DECREF(data);
2878 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302879 if (new_data == NULL) {
2880 return -1;
2881 }
2882 // gets the modified text_len after stripping `print `
2883 text_len = PyUnicode_GET_LENGTH(new_data);
2884 const char *maybe_end_arg = "";
2885 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2886 maybe_end_arg = " end=\" \"";
2887 }
2888 PyObject *error_msg = PyUnicode_FromFormat(
2889 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2890 new_data, maybe_end_arg
2891 );
2892 Py_DECREF(new_data);
2893 if (error_msg == NULL)
2894 return -1;
2895
2896 Py_XSETREF(self->msg, error_msg);
2897 return 1;
2898}
2899
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002900static int
2901_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2902{
2903 /* Return values:
2904 * -1: an error occurred
2905 * 0: nothing happened
2906 * 1: the check triggered & the error message was changed
2907 */
2908 static PyObject *print_prefix = NULL;
2909 static PyObject *exec_prefix = NULL;
Zackery Spytza4b48f12018-10-12 02:20:59 -06002910 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002911 int kind = PyUnicode_KIND(self->text);
2912 void *data = PyUnicode_DATA(self->text);
2913
2914 /* Ignore leading whitespace */
2915 while (start < text_len) {
2916 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2917 if (!Py_UNICODE_ISSPACE(ch))
2918 break;
2919 start++;
2920 }
2921 /* Checking against an empty or whitespace-only part of the string */
2922 if (start == text_len) {
2923 return 0;
2924 }
2925
2926 /* Check for legacy print statements */
2927 if (print_prefix == NULL) {
2928 print_prefix = PyUnicode_InternFromString("print ");
2929 if (print_prefix == NULL) {
2930 return -1;
2931 }
2932 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002933 match = PyUnicode_Tailmatch(self->text, print_prefix,
2934 start, text_len, -1);
2935 if (match == -1) {
2936 return -1;
2937 }
2938 if (match) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302939 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002940 }
2941
2942 /* Check for legacy exec statements */
2943 if (exec_prefix == NULL) {
2944 exec_prefix = PyUnicode_InternFromString("exec ");
2945 if (exec_prefix == NULL) {
2946 return -1;
2947 }
2948 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002949 match = PyUnicode_Tailmatch(self->text, exec_prefix, start, text_len, -1);
2950 if (match == -1) {
2951 return -1;
2952 }
2953 if (match) {
2954 PyObject *msg = PyUnicode_FromString("Missing parentheses in call "
2955 "to 'exec'");
2956 if (msg == NULL) {
2957 return -1;
2958 }
2959 Py_XSETREF(self->msg, msg);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002960 return 1;
2961 }
2962 /* Fall back to the default error message */
2963 return 0;
2964}
2965
2966static int
2967_report_missing_parentheses(PySyntaxErrorObject *self)
2968{
2969 Py_UCS4 left_paren = 40;
2970 Py_ssize_t left_paren_index;
2971 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2972 int legacy_check_result = 0;
2973
2974 /* Skip entirely if there is an opening parenthesis */
2975 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2976 0, text_len, 1);
2977 if (left_paren_index < -1) {
2978 return -1;
2979 }
2980 if (left_paren_index != -1) {
2981 /* Use default error message for any line with an opening paren */
2982 return 0;
2983 }
2984 /* Handle the simple statement case */
2985 legacy_check_result = _check_for_legacy_statements(self, 0);
2986 if (legacy_check_result < 0) {
2987 return -1;
2988
2989 }
2990 if (legacy_check_result == 0) {
2991 /* Handle the one-line complex statement case */
2992 Py_UCS4 colon = 58;
2993 Py_ssize_t colon_index;
2994 colon_index = PyUnicode_FindChar(self->text, colon,
2995 0, text_len, 1);
2996 if (colon_index < -1) {
2997 return -1;
2998 }
2999 if (colon_index >= 0 && colon_index < text_len) {
3000 /* Check again, starting from just after the colon */
3001 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3002 return -1;
3003 }
3004 }
3005 }
3006 return 0;
3007}