blob: 38723d93653c30dcf501fe14283f36f8a33767af [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 Stinner331a6a52019-05-27 16:39:22 +02009#include "pycore_initconfig.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010010#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010011#include "pycore_pymem.h"
12#include "pycore_pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#include "structmember.h"
14#include "osdefs.h"
15
Thomas Wouters477c8d52006-05-27 19:21:47 +000016
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020017/* Compatibility aliases */
18PyObject *PyExc_EnvironmentError = NULL;
19PyObject *PyExc_IOError = NULL;
20#ifdef MS_WINDOWS
21PyObject *PyExc_WindowsError = NULL;
22#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020023
24/* The dict map from errno codes to OSError subclasses */
25static PyObject *errnomap = NULL;
26
27
Thomas Wouters477c8d52006-05-27 19:21:47 +000028/* NOTE: If the exception class hierarchy changes, don't forget to update
29 * Lib/test/exception_hierarchy.txt
30 */
31
Thomas Wouters477c8d52006-05-27 19:21:47 +000032/*
33 * BaseException
34 */
35static PyObject *
36BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
37{
38 PyBaseExceptionObject *self;
39
40 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000041 if (!self)
42 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000043 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000044 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000045 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070046 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000047
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010048 if (args) {
49 self->args = args;
50 Py_INCREF(args);
51 return (PyObject *)self;
52 }
53
Thomas Wouters477c8d52006-05-27 19:21:47 +000054 self->args = PyTuple_New(0);
55 if (!self->args) {
56 Py_DECREF(self);
57 return NULL;
58 }
59
Thomas Wouters477c8d52006-05-27 19:21:47 +000060 return (PyObject *)self;
61}
62
63static int
64BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
65{
Christian Heimes90aa7642007-12-19 02:45:37 +000066 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000067 return -1;
68
Serhiy Storchaka576f1322016-01-05 21:27:54 +020069 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030070 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000071
Thomas Wouters477c8d52006-05-27 19:21:47 +000072 return 0;
73}
74
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000075static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000076BaseException_clear(PyBaseExceptionObject *self)
77{
78 Py_CLEAR(self->dict);
79 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000080 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000081 Py_CLEAR(self->cause);
82 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000083 return 0;
84}
85
86static void
87BaseException_dealloc(PyBaseExceptionObject *self)
88{
Thomas Wouters89f507f2006-12-13 04:49:30 +000089 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000090 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000091 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000092}
93
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000094static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000095BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
96{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000097 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000098 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000099 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +0000100 Py_VISIT(self->cause);
101 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000102 return 0;
103}
104
105static PyObject *
106BaseException_str(PyBaseExceptionObject *self)
107{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000108 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000110 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000112 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000113 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000114 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000116}
117
118static PyObject *
119BaseException_repr(PyBaseExceptionObject *self)
120{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300121 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200122 if (PyTuple_GET_SIZE(self->args) == 1)
123 return PyUnicode_FromFormat("%s(%R)", name,
124 PyTuple_GET_ITEM(self->args, 0));
125 else
126 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127}
128
129/* Pickling support */
130static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530131BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000135 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000136 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000137}
138
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000139/*
140 * Needed for backward compatibility, since exceptions used to store
141 * all their attributes in the __dict__. Code is taken from cPickle's
142 * load_build function.
143 */
144static PyObject *
145BaseException_setstate(PyObject *self, PyObject *state)
146{
147 PyObject *d_key, *d_value;
148 Py_ssize_t i = 0;
149
150 if (state != Py_None) {
151 if (!PyDict_Check(state)) {
152 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
153 return NULL;
154 }
155 while (PyDict_Next(state, &i, &d_key, &d_value)) {
156 if (PyObject_SetAttr(self, d_key, d_value) < 0)
157 return NULL;
158 }
159 }
160 Py_RETURN_NONE;
161}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000162
Collin Winter828f04a2007-08-31 00:04:24 +0000163static PyObject *
164BaseException_with_traceback(PyObject *self, PyObject *tb) {
165 if (PyException_SetTraceback(self, tb))
166 return NULL;
167
168 Py_INCREF(self);
169 return self;
170}
171
Georg Brandl76941002008-05-05 21:38:47 +0000172PyDoc_STRVAR(with_traceback_doc,
173"Exception.with_traceback(tb) --\n\
174 set self.__traceback__ to tb and return self.");
175
Thomas Wouters477c8d52006-05-27 19:21:47 +0000176
177static PyMethodDef BaseException_methods[] = {
178 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000179 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000180 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
181 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000182 {NULL, NULL, 0, NULL},
183};
184
Thomas Wouters477c8d52006-05-27 19:21:47 +0000185static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200186BaseException_get_args(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000187{
188 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200189 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000190 }
191 Py_INCREF(self->args);
192 return self->args;
193}
194
195static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200196BaseException_set_args(PyBaseExceptionObject *self, PyObject *val, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000197{
198 PyObject *seq;
199 if (val == NULL) {
200 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
201 return -1;
202 }
203 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500204 if (!seq)
205 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300206 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000207 return 0;
208}
209
Collin Winter828f04a2007-08-31 00:04:24 +0000210static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200211BaseException_get_tb(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000212{
213 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200214 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000215 }
216 Py_INCREF(self->traceback);
217 return self->traceback;
218}
219
220static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200221BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000222{
223 if (tb == NULL) {
224 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
225 return -1;
226 }
227 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
228 PyErr_SetString(PyExc_TypeError,
229 "__traceback__ must be a traceback or None");
230 return -1;
231 }
232
Serhiy Storchaka37665722016-08-20 21:22:03 +0300233 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300234 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000235 return 0;
236}
237
Georg Brandlab6f2f62009-03-31 04:16:10 +0000238static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200239BaseException_get_context(PyObject *self, void *Py_UNUSED(ignored))
240{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000241 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500242 if (res)
243 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000244 Py_RETURN_NONE;
245}
246
247static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200248BaseException_set_context(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
249{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000250 if (arg == NULL) {
251 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
252 return -1;
253 } else if (arg == Py_None) {
254 arg = NULL;
255 } else if (!PyExceptionInstance_Check(arg)) {
256 PyErr_SetString(PyExc_TypeError, "exception context must be None "
257 "or derive from BaseException");
258 return -1;
259 } else {
260 /* PyException_SetContext steals this reference */
261 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000263 PyException_SetContext(self, arg);
264 return 0;
265}
266
267static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200268BaseException_get_cause(PyObject *self, void *Py_UNUSED(ignored))
269{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000270 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500271 if (res)
272 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700273 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000274}
275
276static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200277BaseException_set_cause(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
278{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000279 if (arg == NULL) {
280 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
281 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700282 } else if (arg == Py_None) {
283 arg = NULL;
284 } else if (!PyExceptionInstance_Check(arg)) {
285 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
286 "or derive from BaseException");
287 return -1;
288 } else {
289 /* PyException_SetCause steals this reference */
290 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700292 PyException_SetCause(self, arg);
293 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000294}
295
Guido van Rossum360e4b82007-05-14 22:51:27 +0000296
Thomas Wouters477c8d52006-05-27 19:21:47 +0000297static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500298 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000300 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200301 {"__context__", BaseException_get_context,
302 BaseException_set_context, PyDoc_STR("exception context")},
303 {"__cause__", BaseException_get_cause,
304 BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000305 {NULL},
306};
307
308
Collin Winter828f04a2007-08-31 00:04:24 +0000309PyObject *
310PyException_GetTraceback(PyObject *self) {
311 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
312 Py_XINCREF(base_self->traceback);
313 return base_self->traceback;
314}
315
316
317int
318PyException_SetTraceback(PyObject *self, PyObject *tb) {
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200319 return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL);
Collin Winter828f04a2007-08-31 00:04:24 +0000320}
321
322PyObject *
323PyException_GetCause(PyObject *self) {
324 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
325 Py_XINCREF(cause);
326 return cause;
327}
328
329/* Steals a reference to cause */
330void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200331PyException_SetCause(PyObject *self, PyObject *cause)
332{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700333 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300334 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000335}
336
337PyObject *
338PyException_GetContext(PyObject *self) {
339 PyObject *context = ((PyBaseExceptionObject *)self)->context;
340 Py_XINCREF(context);
341 return context;
342}
343
344/* Steals a reference to context */
345void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200346PyException_SetContext(PyObject *self, PyObject *context)
347{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300348 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000349}
350
Christian Tismerea62ce72018-06-09 20:32:25 +0200351#undef PyExceptionClass_Name
Christian Tismer83987132018-06-11 00:48:28 +0200352
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300353const char *
Christian Tismerea62ce72018-06-09 20:32:25 +0200354PyExceptionClass_Name(PyObject *ob)
355{
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300356 return ((PyTypeObject*)ob)->tp_name;
Christian Tismerea62ce72018-06-09 20:32:25 +0200357}
Collin Winter828f04a2007-08-31 00:04:24 +0000358
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700359static struct PyMemberDef BaseException_members[] = {
360 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200361 offsetof(PyBaseExceptionObject, suppress_context)},
362 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700363};
364
365
Thomas Wouters477c8d52006-05-27 19:21:47 +0000366static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000367 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000368 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000369 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
370 0, /*tp_itemsize*/
371 (destructor)BaseException_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200372 0, /*tp_vectorcall_offset*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000373 0, /*tp_getattr*/
374 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200375 0, /*tp_as_async*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000376 (reprfunc)BaseException_repr, /*tp_repr*/
377 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000378 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 0, /*tp_as_mapping*/
380 0, /*tp_hash */
381 0, /*tp_call*/
382 (reprfunc)BaseException_str, /*tp_str*/
383 PyObject_GenericGetAttr, /*tp_getattro*/
384 PyObject_GenericSetAttr, /*tp_setattro*/
385 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000386 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
389 (traverseproc)BaseException_traverse, /* tp_traverse */
390 (inquiry)BaseException_clear, /* tp_clear */
391 0, /* tp_richcompare */
392 0, /* tp_weaklistoffset */
393 0, /* tp_iter */
394 0, /* tp_iternext */
395 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700396 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000397 BaseException_getset, /* tp_getset */
398 0, /* tp_base */
399 0, /* tp_dict */
400 0, /* tp_descr_get */
401 0, /* tp_descr_set */
402 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
403 (initproc)BaseException_init, /* tp_init */
404 0, /* tp_alloc */
405 BaseException_new, /* tp_new */
406};
407/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
408from the previous implmentation and also allowing Python objects to be used
409in the API */
410PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
411
412/* note these macros omit the last semicolon so the macro invocation may
413 * include it and not look strange.
414 */
415#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
416static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000417 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000418 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419 sizeof(PyBaseExceptionObject), \
420 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
421 0, 0, 0, 0, 0, 0, 0, \
422 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
423 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
424 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
425 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
426 (initproc)BaseException_init, 0, BaseException_new,\
427}; \
428PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
429
430#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
431static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000432 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000433 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000434 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000435 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000436 0, 0, 0, 0, 0, \
437 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000438 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
439 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000440 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200441 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442}; \
443PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
444
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200445#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
446 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
447 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000448static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000449 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000450 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000451 sizeof(Py ## EXCSTORE ## Object), 0, \
452 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
453 (reprfunc)EXCSTR, 0, 0, 0, \
454 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
455 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
456 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200457 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000458 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200459 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460}; \
461PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
462
463
464/*
465 * Exception extends BaseException
466 */
467SimpleExtendsException(PyExc_BaseException, Exception,
468 "Common base class for all non-exit exceptions.");
469
470
471/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000472 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000473 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000474SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000475 "Inappropriate argument type.");
476
477
478/*
Yury Selivanov75445082015-05-11 22:57:16 -0400479 * StopAsyncIteration extends Exception
480 */
481SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
482 "Signal the end from iterator.__anext__().");
483
484
485/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000486 * StopIteration extends Exception
487 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000488
489static PyMemberDef StopIteration_members[] = {
490 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
491 PyDoc_STR("generator return value")},
492 {NULL} /* Sentinel */
493};
494
495static int
496StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
497{
498 Py_ssize_t size = PyTuple_GET_SIZE(args);
499 PyObject *value;
500
501 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
502 return -1;
503 Py_CLEAR(self->value);
504 if (size > 0)
505 value = PyTuple_GET_ITEM(args, 0);
506 else
507 value = Py_None;
508 Py_INCREF(value);
509 self->value = value;
510 return 0;
511}
512
513static int
514StopIteration_clear(PyStopIterationObject *self)
515{
516 Py_CLEAR(self->value);
517 return BaseException_clear((PyBaseExceptionObject *)self);
518}
519
520static void
521StopIteration_dealloc(PyStopIterationObject *self)
522{
523 _PyObject_GC_UNTRACK(self);
524 StopIteration_clear(self);
525 Py_TYPE(self)->tp_free((PyObject *)self);
526}
527
528static int
529StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
530{
531 Py_VISIT(self->value);
532 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
533}
534
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000535ComplexExtendsException(
536 PyExc_Exception, /* base */
537 StopIteration, /* name */
538 StopIteration, /* prefix for *_init, etc */
539 0, /* new */
540 0, /* methods */
541 StopIteration_members, /* members */
542 0, /* getset */
543 0, /* str */
544 "Signal the end from iterator.__next__()."
545);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000546
547
548/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000549 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000550 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000551SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000552 "Request that a generator exit.");
553
554
555/*
556 * SystemExit extends BaseException
557 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558
559static int
560SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
561{
562 Py_ssize_t size = PyTuple_GET_SIZE(args);
563
564 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
565 return -1;
566
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567 if (size == 0)
568 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200569 if (size == 1) {
570 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300571 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200572 }
573 else { /* size > 1 */
574 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300575 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200576 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000577 return 0;
578}
579
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000580static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581SystemExit_clear(PySystemExitObject *self)
582{
583 Py_CLEAR(self->code);
584 return BaseException_clear((PyBaseExceptionObject *)self);
585}
586
587static void
588SystemExit_dealloc(PySystemExitObject *self)
589{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000591 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000592 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000593}
594
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000595static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000596SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
597{
598 Py_VISIT(self->code);
599 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
600}
601
602static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000603 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
604 PyDoc_STR("exception code")},
605 {NULL} /* Sentinel */
606};
607
608ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200609 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000610 "Request to exit from the interpreter.");
611
612/*
613 * KeyboardInterrupt extends BaseException
614 */
615SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
616 "Program interrupted by user.");
617
618
619/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000620 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000621 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000622
Brett Cannon79ec55e2012-04-12 20:24:54 -0400623static int
624ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
625{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300626 static char *kwlist[] = {"name", "path", 0};
627 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400628 PyObject *msg = NULL;
629 PyObject *name = NULL;
630 PyObject *path = NULL;
631
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300632 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400633 return -1;
634
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300635 empty_tuple = PyTuple_New(0);
636 if (!empty_tuple)
637 return -1;
638 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
639 &name, &path)) {
640 Py_DECREF(empty_tuple);
641 return -1;
642 }
643 Py_DECREF(empty_tuple);
644
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300645 Py_XINCREF(name);
646 Py_XSETREF(self->name, name);
647
648 Py_XINCREF(path);
649 Py_XSETREF(self->path, path);
650
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300651 if (PyTuple_GET_SIZE(args) == 1) {
652 msg = PyTuple_GET_ITEM(args, 0);
653 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300654 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300655 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400656
657 return 0;
658}
659
660static int
661ImportError_clear(PyImportErrorObject *self)
662{
663 Py_CLEAR(self->msg);
664 Py_CLEAR(self->name);
665 Py_CLEAR(self->path);
666 return BaseException_clear((PyBaseExceptionObject *)self);
667}
668
669static void
670ImportError_dealloc(PyImportErrorObject *self)
671{
672 _PyObject_GC_UNTRACK(self);
673 ImportError_clear(self);
674 Py_TYPE(self)->tp_free((PyObject *)self);
675}
676
677static int
678ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
679{
680 Py_VISIT(self->msg);
681 Py_VISIT(self->name);
682 Py_VISIT(self->path);
683 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
684}
685
686static PyObject *
687ImportError_str(PyImportErrorObject *self)
688{
Brett Cannon07c6e712012-08-24 13:05:09 -0400689 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400690 Py_INCREF(self->msg);
691 return self->msg;
692 }
693 else {
694 return BaseException_str((PyBaseExceptionObject *)self);
695 }
696}
697
Serhiy Storchakab7853962017-04-08 09:55:07 +0300698static PyObject *
699ImportError_getstate(PyImportErrorObject *self)
700{
701 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
702 if (self->name || self->path) {
703 _Py_IDENTIFIER(name);
704 _Py_IDENTIFIER(path);
705 dict = dict ? PyDict_Copy(dict) : PyDict_New();
706 if (dict == NULL)
707 return NULL;
708 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
709 Py_DECREF(dict);
710 return NULL;
711 }
712 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
713 Py_DECREF(dict);
714 return NULL;
715 }
716 return dict;
717 }
718 else if (dict) {
719 Py_INCREF(dict);
720 return dict;
721 }
722 else {
723 Py_RETURN_NONE;
724 }
725}
726
727/* Pickling support */
728static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530729ImportError_reduce(PyImportErrorObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakab7853962017-04-08 09:55:07 +0300730{
731 PyObject *res;
732 PyObject *args;
733 PyObject *state = ImportError_getstate(self);
734 if (state == NULL)
735 return NULL;
736 args = ((PyBaseExceptionObject *)self)->args;
737 if (state == Py_None)
738 res = PyTuple_Pack(2, Py_TYPE(self), args);
739 else
740 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
741 Py_DECREF(state);
742 return res;
743}
744
Brett Cannon79ec55e2012-04-12 20:24:54 -0400745static PyMemberDef ImportError_members[] = {
746 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
747 PyDoc_STR("exception message")},
748 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
749 PyDoc_STR("module name")},
750 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
751 PyDoc_STR("module path")},
752 {NULL} /* Sentinel */
753};
754
755static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300756 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400757 {NULL}
758};
759
760ComplexExtendsException(PyExc_Exception, ImportError,
761 ImportError, 0 /* new */,
762 ImportError_methods, ImportError_members,
763 0 /* getset */, ImportError_str,
764 "Import can't find module, or can't find name in "
765 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000766
767/*
Eric Snowc9432652016-09-07 15:42:32 -0700768 * ModuleNotFoundError extends ImportError
769 */
770
771MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
772 "Module not found.");
773
774/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200775 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000776 */
777
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200778#ifdef MS_WINDOWS
779#include "errmap.h"
780#endif
781
Thomas Wouters477c8d52006-05-27 19:21:47 +0000782/* Where a function has a single filename, such as open() or some
783 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
784 * called, giving a third argument which is the filename. But, so
785 * that old code using in-place unpacking doesn't break, e.g.:
786 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200787 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000788 *
789 * we hack args so that it only contains two items. This also
790 * means we need our own __str__() which prints out the filename
791 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800792 *
793 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800794 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
795 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000796 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200797
Antoine Pitroue0e27352011-12-15 14:31:28 +0100798/* This function doesn't cleanup on error, the caller should */
799static int
800oserror_parse_args(PyObject **p_args,
801 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800802 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200803#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100804 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200805#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100806 )
807{
808 Py_ssize_t nargs;
809 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800810#ifndef MS_WINDOWS
811 /*
812 * ignored on non-Windows platforms,
813 * but parsed so OSError has a consistent signature
814 */
815 PyObject *_winerror = NULL;
816 PyObject **winerror = &_winerror;
817#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000818
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200819 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000820
Larry Hastingsb0827312014-02-09 22:05:19 -0800821 if (nargs >= 2 && nargs <= 5) {
822 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
823 myerrno, strerror,
824 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100825 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800826#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100827 if (*winerror && PyLong_Check(*winerror)) {
828 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200829 PyObject *newargs;
830 Py_ssize_t i;
831
Antoine Pitroue0e27352011-12-15 14:31:28 +0100832 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200833 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100834 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200835 /* Set errno to the corresponding POSIX errno (overriding
836 first argument). Windows Socket error codes (>= 10000)
837 have the same value as their POSIX counterparts.
838 */
839 if (winerrcode < 10000)
840 errcode = winerror_to_errno(winerrcode);
841 else
842 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100843 *myerrno = PyLong_FromLong(errcode);
844 if (!*myerrno)
845 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200846 newargs = PyTuple_New(nargs);
847 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100848 return -1;
849 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200850 for (i = 1; i < nargs; i++) {
851 PyObject *val = PyTuple_GET_ITEM(args, i);
852 Py_INCREF(val);
853 PyTuple_SET_ITEM(newargs, i, val);
854 }
855 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100856 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200857 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800858#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200859 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000860
Antoine Pitroue0e27352011-12-15 14:31:28 +0100861 return 0;
862}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000863
Antoine Pitroue0e27352011-12-15 14:31:28 +0100864static int
865oserror_init(PyOSErrorObject *self, PyObject **p_args,
866 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800867 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100868#ifdef MS_WINDOWS
869 , PyObject *winerror
870#endif
871 )
872{
873 PyObject *args = *p_args;
874 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000875
876 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200877 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100878 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200879 PyNumber_Check(filename)) {
880 /* BlockingIOError's 3rd argument can be the number of
881 * characters written.
882 */
883 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
884 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100885 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200886 }
887 else {
888 Py_INCREF(filename);
889 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890
Larry Hastingsb0827312014-02-09 22:05:19 -0800891 if (filename2 && filename2 != Py_None) {
892 Py_INCREF(filename2);
893 self->filename2 = filename2;
894 }
895
896 if (nargs >= 2 && nargs <= 5) {
897 /* filename, filename2, and winerror are removed from the args tuple
898 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100899 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200900 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100901 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200903 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100904 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200905 }
906 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000907 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200908 Py_XINCREF(myerrno);
909 self->myerrno = myerrno;
910
911 Py_XINCREF(strerror);
912 self->strerror = strerror;
913
914#ifdef MS_WINDOWS
915 Py_XINCREF(winerror);
916 self->winerror = winerror;
917#endif
918
Antoine Pitroue0e27352011-12-15 14:31:28 +0100919 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300920 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100921 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100922
923 return 0;
924}
925
926static PyObject *
927OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
928static int
929OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
930
931static int
932oserror_use_init(PyTypeObject *type)
933{
Martin Panter7462b6492015-11-02 03:37:02 +0000934 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100935 extraneous argument to __new__ to be ignored. The only reasonable
936 solution, given __new__ takes a variable number of arguments,
937 is to defer arg parsing and initialization to __init__.
938
Martin Pantere26da7c2016-06-02 10:07:09 +0000939 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100940 with the right arguments.
941
942 (see http://bugs.python.org/issue12555#msg148829 )
943 */
944 if (type->tp_init != (initproc) OSError_init &&
945 type->tp_new == (newfunc) OSError_new) {
946 assert((PyObject *) type != PyExc_OSError);
947 return 1;
948 }
949 return 0;
950}
951
952static PyObject *
953OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
954{
955 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800956 PyObject *myerrno = NULL, *strerror = NULL;
957 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100958#ifdef MS_WINDOWS
959 PyObject *winerror = NULL;
960#endif
961
Victor Stinner46ef3192013-11-14 22:31:41 +0100962 Py_INCREF(args);
963
Antoine Pitroue0e27352011-12-15 14:31:28 +0100964 if (!oserror_use_init(type)) {
965 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100966 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100967
Larry Hastingsb0827312014-02-09 22:05:19 -0800968 if (oserror_parse_args(&args, &myerrno, &strerror,
969 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100970#ifdef MS_WINDOWS
971 , &winerror
972#endif
973 ))
974 goto error;
975
976 if (myerrno && PyLong_Check(myerrno) &&
977 errnomap && (PyObject *) type == PyExc_OSError) {
978 PyObject *newtype;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200979 newtype = PyDict_GetItemWithError(errnomap, myerrno);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100980 if (newtype) {
981 assert(PyType_Check(newtype));
982 type = (PyTypeObject *) newtype;
983 }
984 else if (PyErr_Occurred())
985 goto error;
986 }
987 }
988
989 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
990 if (!self)
991 goto error;
992
993 self->dict = NULL;
994 self->traceback = self->cause = self->context = NULL;
995 self->written = -1;
996
997 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800998 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100999#ifdef MS_WINDOWS
1000 , winerror
1001#endif
1002 ))
1003 goto error;
1004 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +02001005 else {
1006 self->args = PyTuple_New(0);
1007 if (self->args == NULL)
1008 goto error;
1009 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001010
Victor Stinner46ef3192013-11-14 22:31:41 +01001011 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001012 return (PyObject *) self;
1013
1014error:
1015 Py_XDECREF(args);
1016 Py_XDECREF(self);
1017 return NULL;
1018}
1019
1020static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001021OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001022{
Larry Hastingsb0827312014-02-09 22:05:19 -08001023 PyObject *myerrno = NULL, *strerror = NULL;
1024 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001025#ifdef MS_WINDOWS
1026 PyObject *winerror = NULL;
1027#endif
1028
1029 if (!oserror_use_init(Py_TYPE(self)))
1030 /* Everything already done in OSError_new */
1031 return 0;
1032
1033 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1034 return -1;
1035
1036 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001037 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001038#ifdef MS_WINDOWS
1039 , &winerror
1040#endif
1041 ))
1042 goto error;
1043
Larry Hastingsb0827312014-02-09 22:05:19 -08001044 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001045#ifdef MS_WINDOWS
1046 , winerror
1047#endif
1048 ))
1049 goto error;
1050
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001052
1053error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001054 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001055 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056}
1057
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001058static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001059OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060{
1061 Py_CLEAR(self->myerrno);
1062 Py_CLEAR(self->strerror);
1063 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001064 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001065#ifdef MS_WINDOWS
1066 Py_CLEAR(self->winerror);
1067#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068 return BaseException_clear((PyBaseExceptionObject *)self);
1069}
1070
1071static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001072OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001075 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001076 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077}
1078
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001079static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 void *arg)
1082{
1083 Py_VISIT(self->myerrno);
1084 Py_VISIT(self->strerror);
1085 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001086 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001087#ifdef MS_WINDOWS
1088 Py_VISIT(self->winerror);
1089#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1091}
1092
1093static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001094OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001095{
Larry Hastingsb0827312014-02-09 22:05:19 -08001096#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001097#ifdef MS_WINDOWS
1098 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001099 if (self->winerror && self->filename) {
1100 if (self->filename2) {
1101 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1102 OR_NONE(self->winerror),
1103 OR_NONE(self->strerror),
1104 self->filename,
1105 self->filename2);
1106 } else {
1107 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1108 OR_NONE(self->winerror),
1109 OR_NONE(self->strerror),
1110 self->filename);
1111 }
1112 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001113 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001114 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001115 self->winerror ? self->winerror: Py_None,
1116 self->strerror ? self->strerror: Py_None);
1117#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001118 if (self->filename) {
1119 if (self->filename2) {
1120 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1121 OR_NONE(self->myerrno),
1122 OR_NONE(self->strerror),
1123 self->filename,
1124 self->filename2);
1125 } else {
1126 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1127 OR_NONE(self->myerrno),
1128 OR_NONE(self->strerror),
1129 self->filename);
1130 }
1131 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001132 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001133 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001134 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001135 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001136}
1137
Thomas Wouters477c8d52006-05-27 19:21:47 +00001138static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301139OSError_reduce(PyOSErrorObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001140{
1141 PyObject *args = self->args;
1142 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001143
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001145 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001146 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001147 Py_ssize_t size = self->filename2 ? 5 : 3;
1148 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001149 if (!args)
1150 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001151
1152 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001153 Py_INCREF(tmp);
1154 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001155
1156 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001157 Py_INCREF(tmp);
1158 PyTuple_SET_ITEM(args, 1, tmp);
1159
1160 Py_INCREF(self->filename);
1161 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001162
1163 if (self->filename2) {
1164 /*
1165 * This tuple is essentially used as OSError(*args).
1166 * So, to recreate filename2, we need to pass in
1167 * winerror as well.
1168 */
1169 Py_INCREF(Py_None);
1170 PyTuple_SET_ITEM(args, 3, Py_None);
1171
1172 /* filename2 */
1173 Py_INCREF(self->filename2);
1174 PyTuple_SET_ITEM(args, 4, self->filename2);
1175 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001176 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001177 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001178
1179 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001180 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001181 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001182 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183 Py_DECREF(args);
1184 return res;
1185}
1186
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001187static PyObject *
1188OSError_written_get(PyOSErrorObject *self, void *context)
1189{
1190 if (self->written == -1) {
1191 PyErr_SetString(PyExc_AttributeError, "characters_written");
1192 return NULL;
1193 }
1194 return PyLong_FromSsize_t(self->written);
1195}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001196
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001197static int
1198OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1199{
Serhiy Storchakae2af34f2018-12-17 16:43:14 +02001200 if (arg == NULL) {
1201 if (self->written == -1) {
1202 PyErr_SetString(PyExc_AttributeError, "characters_written");
1203 return -1;
1204 }
1205 self->written = -1;
1206 return 0;
1207 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001208 Py_ssize_t n;
1209 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1210 if (n == -1 && PyErr_Occurred())
1211 return -1;
1212 self->written = n;
1213 return 0;
1214}
1215
1216static PyMemberDef OSError_members[] = {
1217 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1218 PyDoc_STR("POSIX exception code")},
1219 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1220 PyDoc_STR("exception strerror")},
1221 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1222 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001223 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1224 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001225#ifdef MS_WINDOWS
1226 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1227 PyDoc_STR("Win32 exception code")},
1228#endif
1229 {NULL} /* Sentinel */
1230};
1231
1232static PyMethodDef OSError_methods[] = {
1233 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234 {NULL}
1235};
1236
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001237static PyGetSetDef OSError_getset[] = {
1238 {"characters_written", (getter) OSError_written_get,
1239 (setter) OSError_written_set, NULL},
1240 {NULL}
1241};
1242
1243
1244ComplexExtendsException(PyExc_Exception, OSError,
1245 OSError, OSError_new,
1246 OSError_methods, OSError_members, OSError_getset,
1247 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001248 "Base class for I/O related errors.");
1249
1250
1251/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001252 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001253 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001254MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1255 "I/O operation would block.");
1256MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1257 "Connection error.");
1258MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1259 "Child process error.");
1260MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1261 "Broken pipe.");
1262MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1263 "Connection aborted.");
1264MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1265 "Connection refused.");
1266MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1267 "Connection reset.");
1268MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1269 "File already exists.");
1270MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1271 "File not found.");
1272MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1273 "Operation doesn't work on directories.");
1274MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1275 "Operation only works on directories.");
1276MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1277 "Interrupted by signal.");
1278MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1279 "Not enough permissions.");
1280MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1281 "Process not found.");
1282MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1283 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001284
1285/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001286 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001287 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001288SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289 "Read beyond end of file.");
1290
1291
1292/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001293 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001294 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001295SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001296 "Unspecified run-time error.");
1297
Yury Selivanovf488fb42015-07-03 01:04:23 -04001298/*
1299 * RecursionError extends RuntimeError
1300 */
1301SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1302 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001303
1304/*
1305 * NotImplementedError extends RuntimeError
1306 */
1307SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1308 "Method or function hasn't been implemented yet.");
1309
1310/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001311 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001312 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001313SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314 "Name not found globally.");
1315
1316/*
1317 * UnboundLocalError extends NameError
1318 */
1319SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1320 "Local name referenced but not bound to a value.");
1321
1322/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001323 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001325SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001326 "Attribute not found.");
1327
1328
1329/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001330 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001331 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001332
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001333/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001334static int _report_missing_parentheses(PySyntaxErrorObject *self);
1335
Thomas Wouters477c8d52006-05-27 19:21:47 +00001336static int
1337SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1338{
1339 PyObject *info = NULL;
1340 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1341
1342 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1343 return -1;
1344
1345 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001346 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001347 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348 }
1349 if (lenargs == 2) {
1350 info = PyTuple_GET_ITEM(args, 1);
1351 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001352 if (!info)
1353 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001354
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001355 if (PyTuple_GET_SIZE(info) != 4) {
1356 /* not a very good error message, but it's what Python 2.4 gives */
1357 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1358 Py_DECREF(info);
1359 return -1;
1360 }
1361
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001362 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001363 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001364
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001365 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001366 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001367
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001368 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001369 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001371 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001372 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001373
1374 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001375
Martijn Pieters772d8092017-08-22 21:16:23 +01001376 /*
1377 * Issue #21669: Custom error for 'print' & 'exec' as statements
1378 *
1379 * Only applies to SyntaxError instances, not to subclasses such
1380 * as TabError or IndentationError (see issue #31161)
1381 */
1382 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1383 self->text && PyUnicode_Check(self->text) &&
1384 _report_missing_parentheses(self) < 0) {
1385 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001386 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387 }
1388 return 0;
1389}
1390
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001391static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001392SyntaxError_clear(PySyntaxErrorObject *self)
1393{
1394 Py_CLEAR(self->msg);
1395 Py_CLEAR(self->filename);
1396 Py_CLEAR(self->lineno);
1397 Py_CLEAR(self->offset);
1398 Py_CLEAR(self->text);
1399 Py_CLEAR(self->print_file_and_line);
1400 return BaseException_clear((PyBaseExceptionObject *)self);
1401}
1402
1403static void
1404SyntaxError_dealloc(PySyntaxErrorObject *self)
1405{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001408 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001409}
1410
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001411static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001412SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1413{
1414 Py_VISIT(self->msg);
1415 Py_VISIT(self->filename);
1416 Py_VISIT(self->lineno);
1417 Py_VISIT(self->offset);
1418 Py_VISIT(self->text);
1419 Py_VISIT(self->print_file_and_line);
1420 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1421}
1422
1423/* This is called "my_basename" instead of just "basename" to avoid name
1424 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1425 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001426static PyObject*
1427my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001428{
Victor Stinner6237daf2010-04-28 17:26:19 +00001429 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001430 int kind;
1431 void *data;
1432
1433 if (PyUnicode_READY(name))
1434 return NULL;
1435 kind = PyUnicode_KIND(name);
1436 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001437 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001438 offset = 0;
1439 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001440 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001441 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001442 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001443 if (offset != 0)
1444 return PyUnicode_Substring(name, offset, size);
1445 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001446 Py_INCREF(name);
1447 return name;
1448 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001449}
1450
1451
1452static PyObject *
1453SyntaxError_str(PySyntaxErrorObject *self)
1454{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001455 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001456 PyObject *filename;
1457 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001458 /* Below, we always ignore overflow errors, just printing -1.
1459 Still, we cannot allow an OverflowError to be raised, so
1460 we need to call PyLong_AsLongAndOverflow. */
1461 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001462
1463 /* XXX -- do all the additional formatting with filename and
1464 lineno here */
1465
Neal Norwitzed2b7392007-08-26 04:51:10 +00001466 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001467 filename = my_basename(self->filename);
1468 if (filename == NULL)
1469 return NULL;
1470 } else {
1471 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001472 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001473 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001474
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001475 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001476 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001477
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001478 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001479 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001480 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001481 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001483 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001484 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001485 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001486 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001487 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001488 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001489 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001490 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001491 Py_XDECREF(filename);
1492 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001493}
1494
1495static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1497 PyDoc_STR("exception msg")},
1498 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1499 PyDoc_STR("exception filename")},
1500 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1501 PyDoc_STR("exception lineno")},
1502 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1503 PyDoc_STR("exception offset")},
1504 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1505 PyDoc_STR("exception text")},
1506 {"print_file_and_line", T_OBJECT,
1507 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1508 PyDoc_STR("exception print_file_and_line")},
1509 {NULL} /* Sentinel */
1510};
1511
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001512ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001513 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001514 SyntaxError_str, "Invalid syntax.");
1515
1516
1517/*
1518 * IndentationError extends SyntaxError
1519 */
1520MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1521 "Improper indentation.");
1522
1523
1524/*
1525 * TabError extends IndentationError
1526 */
1527MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1528 "Improper mixture of spaces and tabs.");
1529
1530
1531/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001532 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001533 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001534SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001535 "Base class for lookup errors.");
1536
1537
1538/*
1539 * IndexError extends LookupError
1540 */
1541SimpleExtendsException(PyExc_LookupError, IndexError,
1542 "Sequence index out of range.");
1543
1544
1545/*
1546 * KeyError extends LookupError
1547 */
1548static PyObject *
1549KeyError_str(PyBaseExceptionObject *self)
1550{
1551 /* If args is a tuple of exactly one item, apply repr to args[0].
1552 This is done so that e.g. the exception raised by {}[''] prints
1553 KeyError: ''
1554 rather than the confusing
1555 KeyError
1556 alone. The downside is that if KeyError is raised with an explanatory
1557 string, that string will be displayed in quotes. Too bad.
1558 If args is anything else, use the default BaseException__str__().
1559 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001560 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001561 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001562 }
1563 return BaseException_str(self);
1564}
1565
1566ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001567 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001568
1569
1570/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001571 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001572 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001573SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574 "Inappropriate argument value (of correct type).");
1575
1576/*
1577 * UnicodeError extends ValueError
1578 */
1579
1580SimpleExtendsException(PyExc_ValueError, UnicodeError,
1581 "Unicode related error.");
1582
Thomas Wouters477c8d52006-05-27 19:21:47 +00001583static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001584get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001585{
1586 if (!attr) {
1587 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1588 return NULL;
1589 }
1590
Christian Heimes72b710a2008-05-26 13:28:38 +00001591 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001592 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1593 return NULL;
1594 }
1595 Py_INCREF(attr);
1596 return attr;
1597}
1598
1599static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001600get_unicode(PyObject *attr, const char *name)
1601{
1602 if (!attr) {
1603 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1604 return NULL;
1605 }
1606
1607 if (!PyUnicode_Check(attr)) {
1608 PyErr_Format(PyExc_TypeError,
1609 "%.200s attribute must be unicode", name);
1610 return NULL;
1611 }
1612 Py_INCREF(attr);
1613 return attr;
1614}
1615
Walter Dörwaldd2034312007-05-18 16:29:38 +00001616static int
1617set_unicodefromstring(PyObject **attr, const char *value)
1618{
1619 PyObject *obj = PyUnicode_FromString(value);
1620 if (!obj)
1621 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001622 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001623 return 0;
1624}
1625
Thomas Wouters477c8d52006-05-27 19:21:47 +00001626PyObject *
1627PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1628{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001629 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001630}
1631
1632PyObject *
1633PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1634{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001635 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001636}
1637
1638PyObject *
1639PyUnicodeEncodeError_GetObject(PyObject *exc)
1640{
1641 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1642}
1643
1644PyObject *
1645PyUnicodeDecodeError_GetObject(PyObject *exc)
1646{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001647 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001648}
1649
1650PyObject *
1651PyUnicodeTranslateError_GetObject(PyObject *exc)
1652{
1653 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1654}
1655
1656int
1657PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1658{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001659 Py_ssize_t size;
1660 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1661 "object");
1662 if (!obj)
1663 return -1;
1664 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001665 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001666 if (*start<0)
1667 *start = 0; /*XXX check for values <0*/
1668 if (*start>=size)
1669 *start = size-1;
1670 Py_DECREF(obj);
1671 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001672}
1673
1674
1675int
1676PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1677{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001678 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001679 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001680 if (!obj)
1681 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001682 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001683 *start = ((PyUnicodeErrorObject *)exc)->start;
1684 if (*start<0)
1685 *start = 0;
1686 if (*start>=size)
1687 *start = size-1;
1688 Py_DECREF(obj);
1689 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001690}
1691
1692
1693int
1694PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1695{
1696 return PyUnicodeEncodeError_GetStart(exc, start);
1697}
1698
1699
1700int
1701PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1702{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001703 ((PyUnicodeErrorObject *)exc)->start = start;
1704 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001705}
1706
1707
1708int
1709PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1710{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001711 ((PyUnicodeErrorObject *)exc)->start = start;
1712 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713}
1714
1715
1716int
1717PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1718{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001719 ((PyUnicodeErrorObject *)exc)->start = start;
1720 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001721}
1722
1723
1724int
1725PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1726{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001727 Py_ssize_t size;
1728 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1729 "object");
1730 if (!obj)
1731 return -1;
1732 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001733 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001734 if (*end<1)
1735 *end = 1;
1736 if (*end>size)
1737 *end = size;
1738 Py_DECREF(obj);
1739 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001740}
1741
1742
1743int
1744PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1745{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001746 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001747 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001748 if (!obj)
1749 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001750 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001751 *end = ((PyUnicodeErrorObject *)exc)->end;
1752 if (*end<1)
1753 *end = 1;
1754 if (*end>size)
1755 *end = size;
1756 Py_DECREF(obj);
1757 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001758}
1759
1760
1761int
Max Bernsteine6a0e802019-04-02 01:16:22 -07001762PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763{
Max Bernsteine6a0e802019-04-02 01:16:22 -07001764 return PyUnicodeEncodeError_GetEnd(exc, end);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001765}
1766
1767
1768int
1769PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1770{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001771 ((PyUnicodeErrorObject *)exc)->end = end;
1772 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773}
1774
1775
1776int
1777PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1778{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001779 ((PyUnicodeErrorObject *)exc)->end = end;
1780 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001781}
1782
1783
1784int
1785PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1786{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001787 ((PyUnicodeErrorObject *)exc)->end = end;
1788 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001789}
1790
1791PyObject *
1792PyUnicodeEncodeError_GetReason(PyObject *exc)
1793{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001794 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001795}
1796
1797
1798PyObject *
1799PyUnicodeDecodeError_GetReason(PyObject *exc)
1800{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001801 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802}
1803
1804
1805PyObject *
1806PyUnicodeTranslateError_GetReason(PyObject *exc)
1807{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001808 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001809}
1810
1811
1812int
1813PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1814{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001815 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1816 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817}
1818
1819
1820int
1821PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1822{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001823 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1824 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001825}
1826
1827
1828int
1829PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1830{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001831 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1832 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833}
1834
1835
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837UnicodeError_clear(PyUnicodeErrorObject *self)
1838{
1839 Py_CLEAR(self->encoding);
1840 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001841 Py_CLEAR(self->reason);
1842 return BaseException_clear((PyBaseExceptionObject *)self);
1843}
1844
1845static void
1846UnicodeError_dealloc(PyUnicodeErrorObject *self)
1847{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001848 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001850 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851}
1852
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001853static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1855{
1856 Py_VISIT(self->encoding);
1857 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001858 Py_VISIT(self->reason);
1859 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1860}
1861
1862static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001863 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1864 PyDoc_STR("exception encoding")},
1865 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1866 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001867 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001868 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001869 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001870 PyDoc_STR("exception end")},
1871 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1872 PyDoc_STR("exception reason")},
1873 {NULL} /* Sentinel */
1874};
1875
1876
1877/*
1878 * UnicodeEncodeError extends UnicodeError
1879 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001880
1881static int
1882UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1883{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001884 PyUnicodeErrorObject *err;
1885
Thomas Wouters477c8d52006-05-27 19:21:47 +00001886 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1887 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001888
1889 err = (PyUnicodeErrorObject *)self;
1890
1891 Py_CLEAR(err->encoding);
1892 Py_CLEAR(err->object);
1893 Py_CLEAR(err->reason);
1894
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001895 if (!PyArg_ParseTuple(args, "UUnnU",
1896 &err->encoding, &err->object,
1897 &err->start, &err->end, &err->reason)) {
1898 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001899 return -1;
1900 }
1901
Guido van Rossum98297ee2007-11-06 21:34:58 +00001902 Py_INCREF(err->encoding);
1903 Py_INCREF(err->object);
1904 Py_INCREF(err->reason);
1905
1906 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001907}
1908
1909static PyObject *
1910UnicodeEncodeError_str(PyObject *self)
1911{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001912 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001913 PyObject *result = NULL;
1914 PyObject *reason_str = NULL;
1915 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001916
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001917 if (!uself->object)
1918 /* Not properly initialized. */
1919 return PyUnicode_FromString("");
1920
Eric Smith0facd772010-02-24 15:42:29 +00001921 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001922 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001923 reason_str = PyObject_Str(uself->reason);
1924 if (reason_str == NULL)
1925 goto done;
1926 encoding_str = PyObject_Str(uself->encoding);
1927 if (encoding_str == NULL)
1928 goto done;
1929
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001930 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1931 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001932 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001933 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001934 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001935 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001936 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001937 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001938 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001939 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001940 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001941 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001942 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001943 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001944 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945 }
Eric Smith0facd772010-02-24 15:42:29 +00001946 else {
1947 result = PyUnicode_FromFormat(
1948 "'%U' codec can't encode characters in position %zd-%zd: %U",
1949 encoding_str,
1950 uself->start,
1951 uself->end-1,
1952 reason_str);
1953 }
1954done:
1955 Py_XDECREF(reason_str);
1956 Py_XDECREF(encoding_str);
1957 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001958}
1959
1960static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001961 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001962 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001963 sizeof(PyUnicodeErrorObject), 0,
1964 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1965 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1966 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001967 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1968 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001969 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001970 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001971};
1972PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1973
1974PyObject *
1975PyUnicodeEncodeError_Create(
1976 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1977 Py_ssize_t start, Py_ssize_t end, const char *reason)
1978{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001979 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001980 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001981}
1982
1983
1984/*
1985 * UnicodeDecodeError extends UnicodeError
1986 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001987
1988static int
1989UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1990{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001991 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001992
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1994 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001995
1996 ude = (PyUnicodeErrorObject *)self;
1997
1998 Py_CLEAR(ude->encoding);
1999 Py_CLEAR(ude->object);
2000 Py_CLEAR(ude->reason);
2001
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002002 if (!PyArg_ParseTuple(args, "UOnnU",
2003 &ude->encoding, &ude->object,
2004 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002005 ude->encoding = ude->object = ude->reason = NULL;
2006 return -1;
2007 }
2008
Guido van Rossum98297ee2007-11-06 21:34:58 +00002009 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002010 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002011 Py_INCREF(ude->reason);
2012
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002013 if (!PyBytes_Check(ude->object)) {
2014 Py_buffer view;
2015 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2016 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002017 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002018 PyBuffer_Release(&view);
2019 if (!ude->object)
2020 goto error;
2021 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002022 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002023
2024error:
2025 Py_CLEAR(ude->encoding);
2026 Py_CLEAR(ude->object);
2027 Py_CLEAR(ude->reason);
2028 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002029}
2030
2031static PyObject *
2032UnicodeDecodeError_str(PyObject *self)
2033{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002034 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002035 PyObject *result = NULL;
2036 PyObject *reason_str = NULL;
2037 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002038
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002039 if (!uself->object)
2040 /* Not properly initialized. */
2041 return PyUnicode_FromString("");
2042
Eric Smith0facd772010-02-24 15:42:29 +00002043 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002044 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002045 reason_str = PyObject_Str(uself->reason);
2046 if (reason_str == NULL)
2047 goto done;
2048 encoding_str = PyObject_Str(uself->encoding);
2049 if (encoding_str == NULL)
2050 goto done;
2051
2052 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002053 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002054 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002055 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002056 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002057 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002058 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002059 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060 }
Eric Smith0facd772010-02-24 15:42:29 +00002061 else {
2062 result = PyUnicode_FromFormat(
2063 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2064 encoding_str,
2065 uself->start,
2066 uself->end-1,
2067 reason_str
2068 );
2069 }
2070done:
2071 Py_XDECREF(reason_str);
2072 Py_XDECREF(encoding_str);
2073 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074}
2075
2076static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002077 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002078 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002079 sizeof(PyUnicodeErrorObject), 0,
2080 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2081 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2082 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002083 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2084 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002085 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002086 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002087};
2088PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2089
2090PyObject *
2091PyUnicodeDecodeError_Create(
2092 const char *encoding, const char *object, Py_ssize_t length,
2093 Py_ssize_t start, Py_ssize_t end, const char *reason)
2094{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002095 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002096 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002097}
2098
2099
2100/*
2101 * UnicodeTranslateError extends UnicodeError
2102 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002103
2104static int
2105UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2106 PyObject *kwds)
2107{
2108 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2109 return -1;
2110
2111 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002112 Py_CLEAR(self->reason);
2113
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002114 if (!PyArg_ParseTuple(args, "UnnU",
2115 &self->object,
2116 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002117 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002118 return -1;
2119 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002120
Thomas Wouters477c8d52006-05-27 19:21:47 +00002121 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002122 Py_INCREF(self->reason);
2123
2124 return 0;
2125}
2126
2127
2128static PyObject *
2129UnicodeTranslateError_str(PyObject *self)
2130{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002131 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002132 PyObject *result = NULL;
2133 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002134
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002135 if (!uself->object)
2136 /* Not properly initialized. */
2137 return PyUnicode_FromString("");
2138
Eric Smith0facd772010-02-24 15:42:29 +00002139 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002140 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002141 reason_str = PyObject_Str(uself->reason);
2142 if (reason_str == NULL)
2143 goto done;
2144
Victor Stinner53b33e72011-11-21 01:17:27 +01002145 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2146 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002147 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002148 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002149 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002150 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002151 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002152 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002153 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002154 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002155 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002156 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002157 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002158 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002159 );
Eric Smith0facd772010-02-24 15:42:29 +00002160 } else {
2161 result = PyUnicode_FromFormat(
2162 "can't translate characters in position %zd-%zd: %U",
2163 uself->start,
2164 uself->end-1,
2165 reason_str
2166 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002167 }
Eric Smith0facd772010-02-24 15:42:29 +00002168done:
2169 Py_XDECREF(reason_str);
2170 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171}
2172
2173static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002174 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002175 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002176 sizeof(PyUnicodeErrorObject), 0,
2177 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2178 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2179 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002180 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002181 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2182 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002183 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002184};
2185PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2186
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002187/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188PyObject *
2189PyUnicodeTranslateError_Create(
2190 const Py_UNICODE *object, Py_ssize_t length,
2191 Py_ssize_t start, Py_ssize_t end, const char *reason)
2192{
2193 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002194 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002196
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002197PyObject *
2198_PyUnicodeTranslateError_Create(
2199 PyObject *object,
2200 Py_ssize_t start, Py_ssize_t end, const char *reason)
2201{
Victor Stinner69598d42014-04-04 20:59:44 +02002202 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002203 object, start, end, reason);
2204}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002205
2206/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002207 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002208 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002209SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002210 "Assertion failed.");
2211
2212
2213/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002214 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002215 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002216SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002217 "Base class for arithmetic errors.");
2218
2219
2220/*
2221 * FloatingPointError extends ArithmeticError
2222 */
2223SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2224 "Floating point operation failed.");
2225
2226
2227/*
2228 * OverflowError extends ArithmeticError
2229 */
2230SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2231 "Result too large to be represented.");
2232
2233
2234/*
2235 * ZeroDivisionError extends ArithmeticError
2236 */
2237SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2238 "Second argument to a division or modulo operation was zero.");
2239
2240
2241/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002242 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002243 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002244SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002245 "Internal error in the Python interpreter.\n"
2246 "\n"
2247 "Please report this to the Python maintainer, along with the traceback,\n"
2248 "the Python version, and the hardware/OS platform and version.");
2249
2250
2251/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002252 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002253 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002254SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002255 "Weak ref proxy used after referent went away.");
2256
2257
2258/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002259 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002260 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002261
2262#define MEMERRORS_SAVE 16
2263static PyBaseExceptionObject *memerrors_freelist = NULL;
2264static int memerrors_numfree = 0;
2265
2266static PyObject *
2267MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2268{
2269 PyBaseExceptionObject *self;
2270
2271 if (type != (PyTypeObject *) PyExc_MemoryError)
2272 return BaseException_new(type, args, kwds);
2273 if (memerrors_freelist == NULL)
2274 return BaseException_new(type, args, kwds);
2275 /* Fetch object from freelist and revive it */
2276 self = memerrors_freelist;
2277 self->args = PyTuple_New(0);
2278 /* This shouldn't happen since the empty tuple is persistent */
2279 if (self->args == NULL)
2280 return NULL;
2281 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2282 memerrors_numfree--;
2283 self->dict = NULL;
2284 _Py_NewReference((PyObject *)self);
2285 _PyObject_GC_TRACK(self);
2286 return (PyObject *)self;
2287}
2288
2289static void
2290MemoryError_dealloc(PyBaseExceptionObject *self)
2291{
2292 _PyObject_GC_UNTRACK(self);
2293 BaseException_clear(self);
2294 if (memerrors_numfree >= MEMERRORS_SAVE)
2295 Py_TYPE(self)->tp_free((PyObject *)self);
2296 else {
2297 self->dict = (PyObject *) memerrors_freelist;
2298 memerrors_freelist = self;
2299 memerrors_numfree++;
2300 }
2301}
2302
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002303static int
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002304preallocate_memerrors(void)
2305{
2306 /* We create enough MemoryErrors and then decref them, which will fill
2307 up the freelist. */
2308 int i;
2309 PyObject *errors[MEMERRORS_SAVE];
2310 for (i = 0; i < MEMERRORS_SAVE; i++) {
2311 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2312 NULL, NULL);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002313 if (!errors[i]) {
2314 return -1;
2315 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002316 }
2317 for (i = 0; i < MEMERRORS_SAVE; i++) {
2318 Py_DECREF(errors[i]);
2319 }
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002320 return 0;
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002321}
2322
2323static void
2324free_preallocated_memerrors(void)
2325{
2326 while (memerrors_freelist != NULL) {
2327 PyObject *self = (PyObject *) memerrors_freelist;
2328 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2329 Py_TYPE(self)->tp_free((PyObject *)self);
2330 }
2331}
2332
2333
2334static PyTypeObject _PyExc_MemoryError = {
2335 PyVarObject_HEAD_INIT(NULL, 0)
2336 "MemoryError",
2337 sizeof(PyBaseExceptionObject),
2338 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2339 0, 0, 0, 0, 0, 0, 0,
2340 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2341 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2342 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2343 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2344 (initproc)BaseException_init, 0, MemoryError_new
2345};
2346PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2347
Thomas Wouters477c8d52006-05-27 19:21:47 +00002348
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002349/*
2350 * BufferError extends Exception
2351 */
2352SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2353
Thomas Wouters477c8d52006-05-27 19:21:47 +00002354
2355/* Warning category docstrings */
2356
2357/*
2358 * Warning extends Exception
2359 */
2360SimpleExtendsException(PyExc_Exception, Warning,
2361 "Base class for warning categories.");
2362
2363
2364/*
2365 * UserWarning extends Warning
2366 */
2367SimpleExtendsException(PyExc_Warning, UserWarning,
2368 "Base class for warnings generated by user code.");
2369
2370
2371/*
2372 * DeprecationWarning extends Warning
2373 */
2374SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2375 "Base class for warnings about deprecated features.");
2376
2377
2378/*
2379 * PendingDeprecationWarning extends Warning
2380 */
2381SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2382 "Base class for warnings about features which will be deprecated\n"
2383 "in the future.");
2384
2385
2386/*
2387 * SyntaxWarning extends Warning
2388 */
2389SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2390 "Base class for warnings about dubious syntax.");
2391
2392
2393/*
2394 * RuntimeWarning extends Warning
2395 */
2396SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2397 "Base class for warnings about dubious runtime behavior.");
2398
2399
2400/*
2401 * FutureWarning extends Warning
2402 */
2403SimpleExtendsException(PyExc_Warning, FutureWarning,
2404 "Base class for warnings about constructs that will change semantically\n"
2405 "in the future.");
2406
2407
2408/*
2409 * ImportWarning extends Warning
2410 */
2411SimpleExtendsException(PyExc_Warning, ImportWarning,
2412 "Base class for warnings about probable mistakes in module imports");
2413
2414
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002415/*
2416 * UnicodeWarning extends Warning
2417 */
2418SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2419 "Base class for warnings about Unicode related problems, mostly\n"
2420 "related to conversion problems.");
2421
Georg Brandl08be72d2010-10-24 15:11:22 +00002422
Guido van Rossum98297ee2007-11-06 21:34:58 +00002423/*
2424 * BytesWarning extends Warning
2425 */
2426SimpleExtendsException(PyExc_Warning, BytesWarning,
2427 "Base class for warnings about bytes and buffer related problems, mostly\n"
2428 "related to conversion from str or comparing to str.");
2429
2430
Georg Brandl08be72d2010-10-24 15:11:22 +00002431/*
2432 * ResourceWarning extends Warning
2433 */
2434SimpleExtendsException(PyExc_Warning, ResourceWarning,
2435 "Base class for warnings about resource usage.");
2436
2437
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002438
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002439#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002440#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002441/* The following constants were added to errno.h in VS2010 but have
2442 preferred WSA equivalents. */
2443#undef EADDRINUSE
2444#undef EADDRNOTAVAIL
2445#undef EAFNOSUPPORT
2446#undef EALREADY
2447#undef ECONNABORTED
2448#undef ECONNREFUSED
2449#undef ECONNRESET
2450#undef EDESTADDRREQ
2451#undef EHOSTUNREACH
2452#undef EINPROGRESS
2453#undef EISCONN
2454#undef ELOOP
2455#undef EMSGSIZE
2456#undef ENETDOWN
2457#undef ENETRESET
2458#undef ENETUNREACH
2459#undef ENOBUFS
2460#undef ENOPROTOOPT
2461#undef ENOTCONN
2462#undef ENOTSOCK
2463#undef EOPNOTSUPP
2464#undef EPROTONOSUPPORT
2465#undef EPROTOTYPE
2466#undef ETIMEDOUT
2467#undef EWOULDBLOCK
2468
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002469#if defined(WSAEALREADY) && !defined(EALREADY)
2470#define EALREADY WSAEALREADY
2471#endif
2472#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2473#define ECONNABORTED WSAECONNABORTED
2474#endif
2475#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2476#define ECONNREFUSED WSAECONNREFUSED
2477#endif
2478#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2479#define ECONNRESET WSAECONNRESET
2480#endif
2481#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2482#define EINPROGRESS WSAEINPROGRESS
2483#endif
2484#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2485#define ESHUTDOWN WSAESHUTDOWN
2486#endif
2487#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2488#define ETIMEDOUT WSAETIMEDOUT
2489#endif
2490#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2491#define EWOULDBLOCK WSAEWOULDBLOCK
2492#endif
2493#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002494
Victor Stinner331a6a52019-05-27 16:39:22 +02002495PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002496_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002497{
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002498#define PRE_INIT(TYPE) \
2499 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2500 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002501 return _PyStatus_ERR("exceptions bootstrapping error."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002502 } \
2503 Py_INCREF(PyExc_ ## TYPE); \
2504 }
2505
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002506#define ADD_ERRNO(TYPE, CODE) \
2507 do { \
2508 PyObject *_code = PyLong_FromLong(CODE); \
2509 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2510 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
Victor Stinner331a6a52019-05-27 16:39:22 +02002511 return _PyStatus_ERR("errmap insertion problem."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002512 Py_DECREF(_code); \
2513 } while (0)
2514
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002515 PRE_INIT(BaseException);
2516 PRE_INIT(Exception);
2517 PRE_INIT(TypeError);
2518 PRE_INIT(StopAsyncIteration);
2519 PRE_INIT(StopIteration);
2520 PRE_INIT(GeneratorExit);
2521 PRE_INIT(SystemExit);
2522 PRE_INIT(KeyboardInterrupt);
2523 PRE_INIT(ImportError);
2524 PRE_INIT(ModuleNotFoundError);
2525 PRE_INIT(OSError);
2526 PRE_INIT(EOFError);
2527 PRE_INIT(RuntimeError);
2528 PRE_INIT(RecursionError);
2529 PRE_INIT(NotImplementedError);
2530 PRE_INIT(NameError);
2531 PRE_INIT(UnboundLocalError);
2532 PRE_INIT(AttributeError);
2533 PRE_INIT(SyntaxError);
2534 PRE_INIT(IndentationError);
2535 PRE_INIT(TabError);
2536 PRE_INIT(LookupError);
2537 PRE_INIT(IndexError);
2538 PRE_INIT(KeyError);
2539 PRE_INIT(ValueError);
2540 PRE_INIT(UnicodeError);
2541 PRE_INIT(UnicodeEncodeError);
2542 PRE_INIT(UnicodeDecodeError);
2543 PRE_INIT(UnicodeTranslateError);
2544 PRE_INIT(AssertionError);
2545 PRE_INIT(ArithmeticError);
2546 PRE_INIT(FloatingPointError);
2547 PRE_INIT(OverflowError);
2548 PRE_INIT(ZeroDivisionError);
2549 PRE_INIT(SystemError);
2550 PRE_INIT(ReferenceError);
2551 PRE_INIT(MemoryError);
2552 PRE_INIT(BufferError);
2553 PRE_INIT(Warning);
2554 PRE_INIT(UserWarning);
2555 PRE_INIT(DeprecationWarning);
2556 PRE_INIT(PendingDeprecationWarning);
2557 PRE_INIT(SyntaxWarning);
2558 PRE_INIT(RuntimeWarning);
2559 PRE_INIT(FutureWarning);
2560 PRE_INIT(ImportWarning);
2561 PRE_INIT(UnicodeWarning);
2562 PRE_INIT(BytesWarning);
2563 PRE_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002564
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002565 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002566 PRE_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002567
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002568 PRE_INIT(BlockingIOError);
2569 PRE_INIT(BrokenPipeError);
2570 PRE_INIT(ChildProcessError);
2571 PRE_INIT(ConnectionAbortedError);
2572 PRE_INIT(ConnectionRefusedError);
2573 PRE_INIT(ConnectionResetError);
2574 PRE_INIT(FileExistsError);
2575 PRE_INIT(FileNotFoundError);
2576 PRE_INIT(IsADirectoryError);
2577 PRE_INIT(NotADirectoryError);
2578 PRE_INIT(InterruptedError);
2579 PRE_INIT(PermissionError);
2580 PRE_INIT(ProcessLookupError);
2581 PRE_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002582
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002583 if (preallocate_memerrors() < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002584 return _PyStatus_ERR("Could not preallocate MemoryError object");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002585 }
2586
2587 /* Add exceptions to errnomap */
2588 if (!errnomap) {
2589 errnomap = PyDict_New();
2590 if (!errnomap) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002591 return _PyStatus_ERR("Cannot allocate map from errnos to OSError subclasses");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002592 }
2593 }
2594
2595 ADD_ERRNO(BlockingIOError, EAGAIN);
2596 ADD_ERRNO(BlockingIOError, EALREADY);
2597 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2598 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2599 ADD_ERRNO(BrokenPipeError, EPIPE);
2600#ifdef ESHUTDOWN
2601 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2602#endif
2603 ADD_ERRNO(ChildProcessError, ECHILD);
2604 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2605 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2606 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2607 ADD_ERRNO(FileExistsError, EEXIST);
2608 ADD_ERRNO(FileNotFoundError, ENOENT);
2609 ADD_ERRNO(IsADirectoryError, EISDIR);
2610 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2611 ADD_ERRNO(InterruptedError, EINTR);
2612 ADD_ERRNO(PermissionError, EACCES);
2613 ADD_ERRNO(PermissionError, EPERM);
2614 ADD_ERRNO(ProcessLookupError, ESRCH);
2615 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2616
Victor Stinner331a6a52019-05-27 16:39:22 +02002617 return _PyStatus_OK();
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002618
2619#undef PRE_INIT
2620#undef ADD_ERRNO
2621}
2622
2623
2624/* Add exception types to the builtins module */
Victor Stinner331a6a52019-05-27 16:39:22 +02002625PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002626_PyBuiltins_AddExceptions(PyObject *bltinmod)
2627{
2628#define POST_INIT(TYPE) \
2629 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002630 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002631 }
2632
2633#define INIT_ALIAS(NAME, TYPE) \
2634 do { \
2635 Py_INCREF(PyExc_ ## TYPE); \
2636 Py_XDECREF(PyExc_ ## NAME); \
2637 PyExc_ ## NAME = PyExc_ ## TYPE; \
2638 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002639 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002640 } \
2641 } while (0)
2642
2643 PyObject *bdict;
2644
Thomas Wouters477c8d52006-05-27 19:21:47 +00002645 bdict = PyModule_GetDict(bltinmod);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002646 if (bdict == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002647 return _PyStatus_ERR("exceptions bootstrapping error.");
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002648 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002649
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002650 POST_INIT(BaseException);
2651 POST_INIT(Exception);
2652 POST_INIT(TypeError);
2653 POST_INIT(StopAsyncIteration);
2654 POST_INIT(StopIteration);
2655 POST_INIT(GeneratorExit);
2656 POST_INIT(SystemExit);
2657 POST_INIT(KeyboardInterrupt);
2658 POST_INIT(ImportError);
2659 POST_INIT(ModuleNotFoundError);
2660 POST_INIT(OSError);
2661 INIT_ALIAS(EnvironmentError, OSError);
2662 INIT_ALIAS(IOError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663#ifdef MS_WINDOWS
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002664 INIT_ALIAS(WindowsError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665#endif
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002666 POST_INIT(EOFError);
2667 POST_INIT(RuntimeError);
2668 POST_INIT(RecursionError);
2669 POST_INIT(NotImplementedError);
2670 POST_INIT(NameError);
2671 POST_INIT(UnboundLocalError);
2672 POST_INIT(AttributeError);
2673 POST_INIT(SyntaxError);
2674 POST_INIT(IndentationError);
2675 POST_INIT(TabError);
2676 POST_INIT(LookupError);
2677 POST_INIT(IndexError);
2678 POST_INIT(KeyError);
2679 POST_INIT(ValueError);
2680 POST_INIT(UnicodeError);
2681 POST_INIT(UnicodeEncodeError);
2682 POST_INIT(UnicodeDecodeError);
2683 POST_INIT(UnicodeTranslateError);
2684 POST_INIT(AssertionError);
2685 POST_INIT(ArithmeticError);
2686 POST_INIT(FloatingPointError);
2687 POST_INIT(OverflowError);
2688 POST_INIT(ZeroDivisionError);
2689 POST_INIT(SystemError);
2690 POST_INIT(ReferenceError);
2691 POST_INIT(MemoryError);
2692 POST_INIT(BufferError);
2693 POST_INIT(Warning);
2694 POST_INIT(UserWarning);
2695 POST_INIT(DeprecationWarning);
2696 POST_INIT(PendingDeprecationWarning);
2697 POST_INIT(SyntaxWarning);
2698 POST_INIT(RuntimeWarning);
2699 POST_INIT(FutureWarning);
2700 POST_INIT(ImportWarning);
2701 POST_INIT(UnicodeWarning);
2702 POST_INIT(BytesWarning);
2703 POST_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002704
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002705 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002706 POST_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002707
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002708 POST_INIT(BlockingIOError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002709 POST_INIT(BrokenPipeError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002710 POST_INIT(ChildProcessError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002711 POST_INIT(ConnectionAbortedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002712 POST_INIT(ConnectionRefusedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002713 POST_INIT(ConnectionResetError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002714 POST_INIT(FileExistsError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002715 POST_INIT(FileNotFoundError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002716 POST_INIT(IsADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002717 POST_INIT(NotADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002718 POST_INIT(InterruptedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002719 POST_INIT(PermissionError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002720 POST_INIT(ProcessLookupError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002721 POST_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002722
Victor Stinner331a6a52019-05-27 16:39:22 +02002723 return _PyStatus_OK();
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002724
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002725#undef POST_INIT
2726#undef INIT_ALIAS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002727}
2728
2729void
2730_PyExc_Fini(void)
2731{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002732 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002733 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002734}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002735
2736/* Helper to do the equivalent of "raise X from Y" in C, but always using
2737 * the current exception rather than passing one in.
2738 *
2739 * We currently limit this to *only* exceptions that use the BaseException
2740 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2741 * those correctly without losing data and without losing backwards
2742 * compatibility.
2743 *
2744 * We also aim to rule out *all* exceptions that might be storing additional
2745 * state, whether by having a size difference relative to BaseException,
2746 * additional arguments passed in during construction or by having a
2747 * non-empty instance dict.
2748 *
2749 * We need to be very careful with what we wrap, since changing types to
2750 * a broader exception type would be backwards incompatible for
2751 * existing codecs, and with different init or new method implementations
2752 * may either not support instantiation with PyErr_Format or lose
2753 * information when instantiated that way.
2754 *
2755 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2756 * fact that exceptions are expected to support pickling. If more builtin
2757 * exceptions (e.g. AttributeError) start to be converted to rich
2758 * exceptions with additional attributes, that's probably a better approach
2759 * to pursue over adding special cases for particular stateful subclasses.
2760 *
2761 * Returns a borrowed reference to the new exception (if any), NULL if the
2762 * existing exception was left in place.
2763 */
2764PyObject *
2765_PyErr_TrySetFromCause(const char *format, ...)
2766{
2767 PyObject* msg_prefix;
2768 PyObject *exc, *val, *tb;
2769 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002770 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002771 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002772 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002773 PyObject *new_exc, *new_val, *new_tb;
2774 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002775 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002776
Nick Coghlan8b097b42013-11-13 23:49:21 +10002777 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002778 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002779 /* Ensure type info indicates no extra state is stored at the C level
2780 * and that the type can be reinstantiated using PyErr_Format
2781 */
2782 caught_type_size = caught_type->tp_basicsize;
2783 base_exc_size = _PyExc_BaseException.tp_basicsize;
2784 same_basic_size = (
2785 caught_type_size == base_exc_size ||
2786 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002787 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002788 )
2789 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002790 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002791 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002792 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002793 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002794 /* We can't be sure we can wrap this safely, since it may contain
2795 * more state than just the exception type. Accordingly, we just
2796 * leave it alone.
2797 */
2798 PyErr_Restore(exc, val, tb);
2799 return NULL;
2800 }
2801
2802 /* Check the args are empty or contain a single string */
2803 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002804 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002805 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002806 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002807 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002808 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002809 /* More than 1 arg, or the one arg we do have isn't a string
2810 */
2811 PyErr_Restore(exc, val, tb);
2812 return NULL;
2813 }
2814
2815 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002816 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002817 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002818 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002819 /* While we could potentially copy a non-empty instance dictionary
2820 * to the replacement exception, for now we take the more
2821 * conservative path of leaving exceptions with attributes set
2822 * alone.
2823 */
2824 PyErr_Restore(exc, val, tb);
2825 return NULL;
2826 }
2827
2828 /* For exceptions that we can wrap safely, we chain the original
2829 * exception to a new one of the exact same type with an
2830 * error message that mentions the additional details and the
2831 * original exception.
2832 *
2833 * It would be nice to wrap OSError and various other exception
2834 * types as well, but that's quite a bit trickier due to the extra
2835 * state potentially stored on OSError instances.
2836 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002837 /* Ensure the traceback is set correctly on the existing exception */
2838 if (tb != NULL) {
2839 PyException_SetTraceback(val, tb);
2840 Py_DECREF(tb);
2841 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002842
Christian Heimes507eabd2013-11-14 01:39:35 +01002843#ifdef HAVE_STDARG_PROTOTYPES
2844 va_start(vargs, format);
2845#else
2846 va_start(vargs);
2847#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002848 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002849 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002850 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002851 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002852 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002853 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002854 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002855
2856 PyErr_Format(exc, "%U (%s: %S)",
2857 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002858 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002859 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002860 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2861 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2862 PyException_SetCause(new_val, val);
2863 PyErr_Restore(new_exc, new_val, new_tb);
2864 return new_val;
2865}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002866
2867
2868/* To help with migration from Python 2, SyntaxError.__init__ applies some
2869 * heuristics to try to report a more meaningful exception when print and
2870 * exec are used like statements.
2871 *
2872 * The heuristics are currently expected to detect the following cases:
2873 * - top level statement
2874 * - statement in a nested suite
2875 * - trailing section of a one line complex statement
2876 *
2877 * They're currently known not to trigger:
2878 * - after a semi-colon
2879 *
2880 * The error message can be a bit odd in cases where the "arguments" are
2881 * completely illegal syntactically, but that isn't worth the hassle of
2882 * fixing.
2883 *
2884 * We also can't do anything about cases that are legal Python 3 syntax
2885 * but mean something entirely different from what they did in Python 2
2886 * (omitting the arguments entirely, printing items preceded by a unary plus
2887 * or minus, using the stream redirection syntax).
2888 */
2889
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302890
2891// Static helper for setting legacy print error message
2892static int
2893_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2894{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302895 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302896 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302897 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302898 Py_ssize_t start_pos = start + PRINT_OFFSET;
2899 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2900 Py_UCS4 semicolon = ';';
2901 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2902 start_pos, text_len, 1);
2903 if (end_pos < -1) {
2904 return -1;
2905 } else if (end_pos == -1) {
2906 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302907 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302908
2909 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302910 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302911 return -1;
2912 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302913
2914 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2915 if (strip_sep_obj == NULL) {
2916 Py_DECREF(data);
2917 return -1;
2918 }
2919
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302920 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302921 Py_DECREF(data);
2922 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302923 if (new_data == NULL) {
2924 return -1;
2925 }
2926 // gets the modified text_len after stripping `print `
2927 text_len = PyUnicode_GET_LENGTH(new_data);
2928 const char *maybe_end_arg = "";
2929 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2930 maybe_end_arg = " end=\" \"";
2931 }
2932 PyObject *error_msg = PyUnicode_FromFormat(
2933 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2934 new_data, maybe_end_arg
2935 );
2936 Py_DECREF(new_data);
2937 if (error_msg == NULL)
2938 return -1;
2939
2940 Py_XSETREF(self->msg, error_msg);
2941 return 1;
2942}
2943
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002944static int
2945_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2946{
2947 /* Return values:
2948 * -1: an error occurred
2949 * 0: nothing happened
2950 * 1: the check triggered & the error message was changed
2951 */
2952 static PyObject *print_prefix = NULL;
2953 static PyObject *exec_prefix = NULL;
Zackery Spytza4b48f12018-10-12 02:20:59 -06002954 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002955 int kind = PyUnicode_KIND(self->text);
2956 void *data = PyUnicode_DATA(self->text);
2957
2958 /* Ignore leading whitespace */
2959 while (start < text_len) {
2960 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2961 if (!Py_UNICODE_ISSPACE(ch))
2962 break;
2963 start++;
2964 }
2965 /* Checking against an empty or whitespace-only part of the string */
2966 if (start == text_len) {
2967 return 0;
2968 }
2969
2970 /* Check for legacy print statements */
2971 if (print_prefix == NULL) {
2972 print_prefix = PyUnicode_InternFromString("print ");
2973 if (print_prefix == NULL) {
2974 return -1;
2975 }
2976 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002977 match = PyUnicode_Tailmatch(self->text, print_prefix,
2978 start, text_len, -1);
2979 if (match == -1) {
2980 return -1;
2981 }
2982 if (match) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302983 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002984 }
2985
2986 /* Check for legacy exec statements */
2987 if (exec_prefix == NULL) {
2988 exec_prefix = PyUnicode_InternFromString("exec ");
2989 if (exec_prefix == NULL) {
2990 return -1;
2991 }
2992 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002993 match = PyUnicode_Tailmatch(self->text, exec_prefix, start, text_len, -1);
2994 if (match == -1) {
2995 return -1;
2996 }
2997 if (match) {
2998 PyObject *msg = PyUnicode_FromString("Missing parentheses in call "
2999 "to 'exec'");
3000 if (msg == NULL) {
3001 return -1;
3002 }
3003 Py_XSETREF(self->msg, msg);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10003004 return 1;
3005 }
3006 /* Fall back to the default error message */
3007 return 0;
3008}
3009
3010static int
3011_report_missing_parentheses(PySyntaxErrorObject *self)
3012{
3013 Py_UCS4 left_paren = 40;
3014 Py_ssize_t left_paren_index;
3015 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
3016 int legacy_check_result = 0;
3017
3018 /* Skip entirely if there is an opening parenthesis */
3019 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
3020 0, text_len, 1);
3021 if (left_paren_index < -1) {
3022 return -1;
3023 }
3024 if (left_paren_index != -1) {
3025 /* Use default error message for any line with an opening paren */
3026 return 0;
3027 }
3028 /* Handle the simple statement case */
3029 legacy_check_result = _check_for_legacy_statements(self, 0);
3030 if (legacy_check_result < 0) {
3031 return -1;
3032
3033 }
3034 if (legacy_check_result == 0) {
3035 /* Handle the one-line complex statement case */
3036 Py_UCS4 colon = 58;
3037 Py_ssize_t colon_index;
3038 colon_index = PyUnicode_FindChar(self->text, colon,
3039 0, text_len, 1);
3040 if (colon_index < -1) {
3041 return -1;
3042 }
3043 if (colon_index >= 0 && colon_index < text_len) {
3044 /* Check again, starting from just after the colon */
3045 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3046 return -1;
3047 }
3048 }
3049 }
3050 return 0;
3051}