blob: 8456a8f182861141365d8ac6cb8d8665aa141e50 [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*/
372 0, /*tp_print*/
373 0, /*tp_getattr*/
374 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000375 0, /* tp_reserved; */
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/*
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001525 * TargetScopeError extends SyntaxError
1526 */
1527MiddlingExtendsException(PyExc_SyntaxError, TargetScopeError, SyntaxError,
1528 "Improper scope target.");
1529
1530
1531/*
Thomas Wouters477c8d52006-05-27 19:21:47 +00001532 * TabError extends IndentationError
1533 */
1534MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1535 "Improper mixture of spaces and tabs.");
1536
1537
1538/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001539 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001540 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001541SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001542 "Base class for lookup errors.");
1543
1544
1545/*
1546 * IndexError extends LookupError
1547 */
1548SimpleExtendsException(PyExc_LookupError, IndexError,
1549 "Sequence index out of range.");
1550
1551
1552/*
1553 * KeyError extends LookupError
1554 */
1555static PyObject *
1556KeyError_str(PyBaseExceptionObject *self)
1557{
1558 /* If args is a tuple of exactly one item, apply repr to args[0].
1559 This is done so that e.g. the exception raised by {}[''] prints
1560 KeyError: ''
1561 rather than the confusing
1562 KeyError
1563 alone. The downside is that if KeyError is raised with an explanatory
1564 string, that string will be displayed in quotes. Too bad.
1565 If args is anything else, use the default BaseException__str__().
1566 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001567 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001568 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001569 }
1570 return BaseException_str(self);
1571}
1572
1573ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001574 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001575
1576
1577/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001578 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001579 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001580SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001581 "Inappropriate argument value (of correct type).");
1582
1583/*
1584 * UnicodeError extends ValueError
1585 */
1586
1587SimpleExtendsException(PyExc_ValueError, UnicodeError,
1588 "Unicode related error.");
1589
Thomas Wouters477c8d52006-05-27 19:21:47 +00001590static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001591get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001592{
1593 if (!attr) {
1594 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1595 return NULL;
1596 }
1597
Christian Heimes72b710a2008-05-26 13:28:38 +00001598 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001599 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1600 return NULL;
1601 }
1602 Py_INCREF(attr);
1603 return attr;
1604}
1605
1606static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001607get_unicode(PyObject *attr, const char *name)
1608{
1609 if (!attr) {
1610 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1611 return NULL;
1612 }
1613
1614 if (!PyUnicode_Check(attr)) {
1615 PyErr_Format(PyExc_TypeError,
1616 "%.200s attribute must be unicode", name);
1617 return NULL;
1618 }
1619 Py_INCREF(attr);
1620 return attr;
1621}
1622
Walter Dörwaldd2034312007-05-18 16:29:38 +00001623static int
1624set_unicodefromstring(PyObject **attr, const char *value)
1625{
1626 PyObject *obj = PyUnicode_FromString(value);
1627 if (!obj)
1628 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001629 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001630 return 0;
1631}
1632
Thomas Wouters477c8d52006-05-27 19:21:47 +00001633PyObject *
1634PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1635{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001636 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001637}
1638
1639PyObject *
1640PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1641{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001642 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643}
1644
1645PyObject *
1646PyUnicodeEncodeError_GetObject(PyObject *exc)
1647{
1648 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1649}
1650
1651PyObject *
1652PyUnicodeDecodeError_GetObject(PyObject *exc)
1653{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001654 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655}
1656
1657PyObject *
1658PyUnicodeTranslateError_GetObject(PyObject *exc)
1659{
1660 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1661}
1662
1663int
1664PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1665{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001666 Py_ssize_t size;
1667 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1668 "object");
1669 if (!obj)
1670 return -1;
1671 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001672 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001673 if (*start<0)
1674 *start = 0; /*XXX check for values <0*/
1675 if (*start>=size)
1676 *start = size-1;
1677 Py_DECREF(obj);
1678 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001679}
1680
1681
1682int
1683PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1684{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001685 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001686 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001687 if (!obj)
1688 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001689 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001690 *start = ((PyUnicodeErrorObject *)exc)->start;
1691 if (*start<0)
1692 *start = 0;
1693 if (*start>=size)
1694 *start = size-1;
1695 Py_DECREF(obj);
1696 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001697}
1698
1699
1700int
1701PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1702{
1703 return PyUnicodeEncodeError_GetStart(exc, start);
1704}
1705
1706
1707int
1708PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1709{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001710 ((PyUnicodeErrorObject *)exc)->start = start;
1711 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001712}
1713
1714
1715int
1716PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1717{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001718 ((PyUnicodeErrorObject *)exc)->start = start;
1719 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001720}
1721
1722
1723int
1724PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1725{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001726 ((PyUnicodeErrorObject *)exc)->start = start;
1727 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001728}
1729
1730
1731int
1732PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1733{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001734 Py_ssize_t size;
1735 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1736 "object");
1737 if (!obj)
1738 return -1;
1739 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001740 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001741 if (*end<1)
1742 *end = 1;
1743 if (*end>size)
1744 *end = size;
1745 Py_DECREF(obj);
1746 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001747}
1748
1749
1750int
1751PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1752{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001753 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001754 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001755 if (!obj)
1756 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001757 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001758 *end = ((PyUnicodeErrorObject *)exc)->end;
1759 if (*end<1)
1760 *end = 1;
1761 if (*end>size)
1762 *end = size;
1763 Py_DECREF(obj);
1764 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001765}
1766
1767
1768int
Max Bernsteine6a0e802019-04-02 01:16:22 -07001769PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001770{
Max Bernsteine6a0e802019-04-02 01:16:22 -07001771 return PyUnicodeEncodeError_GetEnd(exc, end);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772}
1773
1774
1775int
1776PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1777{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001778 ((PyUnicodeErrorObject *)exc)->end = end;
1779 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780}
1781
1782
1783int
1784PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1785{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001786 ((PyUnicodeErrorObject *)exc)->end = end;
1787 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788}
1789
1790
1791int
1792PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1793{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001794 ((PyUnicodeErrorObject *)exc)->end = end;
1795 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796}
1797
1798PyObject *
1799PyUnicodeEncodeError_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 *
1806PyUnicodeDecodeError_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
1812PyObject *
1813PyUnicodeTranslateError_GetReason(PyObject *exc)
1814{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001815 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816}
1817
1818
1819int
1820PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1821{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001822 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1823 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824}
1825
1826
1827int
1828PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1829{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001830 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1831 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832}
1833
1834
1835int
1836PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1837{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001838 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1839 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001840}
1841
1842
Thomas Wouters477c8d52006-05-27 19:21:47 +00001843static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844UnicodeError_clear(PyUnicodeErrorObject *self)
1845{
1846 Py_CLEAR(self->encoding);
1847 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 Py_CLEAR(self->reason);
1849 return BaseException_clear((PyBaseExceptionObject *)self);
1850}
1851
1852static void
1853UnicodeError_dealloc(PyUnicodeErrorObject *self)
1854{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001855 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001856 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001857 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001858}
1859
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001860static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001861UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1862{
1863 Py_VISIT(self->encoding);
1864 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 Py_VISIT(self->reason);
1866 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1867}
1868
1869static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001870 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1871 PyDoc_STR("exception encoding")},
1872 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1873 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001874 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001875 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001876 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001877 PyDoc_STR("exception end")},
1878 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1879 PyDoc_STR("exception reason")},
1880 {NULL} /* Sentinel */
1881};
1882
1883
1884/*
1885 * UnicodeEncodeError extends UnicodeError
1886 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001887
1888static int
1889UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1890{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001891 PyUnicodeErrorObject *err;
1892
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1894 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001895
1896 err = (PyUnicodeErrorObject *)self;
1897
1898 Py_CLEAR(err->encoding);
1899 Py_CLEAR(err->object);
1900 Py_CLEAR(err->reason);
1901
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001902 if (!PyArg_ParseTuple(args, "UUnnU",
1903 &err->encoding, &err->object,
1904 &err->start, &err->end, &err->reason)) {
1905 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001906 return -1;
1907 }
1908
Guido van Rossum98297ee2007-11-06 21:34:58 +00001909 Py_INCREF(err->encoding);
1910 Py_INCREF(err->object);
1911 Py_INCREF(err->reason);
1912
1913 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001914}
1915
1916static PyObject *
1917UnicodeEncodeError_str(PyObject *self)
1918{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001919 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001920 PyObject *result = NULL;
1921 PyObject *reason_str = NULL;
1922 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001923
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001924 if (!uself->object)
1925 /* Not properly initialized. */
1926 return PyUnicode_FromString("");
1927
Eric Smith0facd772010-02-24 15:42:29 +00001928 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001929 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001930 reason_str = PyObject_Str(uself->reason);
1931 if (reason_str == NULL)
1932 goto done;
1933 encoding_str = PyObject_Str(uself->encoding);
1934 if (encoding_str == NULL)
1935 goto done;
1936
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001937 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1938 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001939 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001940 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001941 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001942 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001943 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001944 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001945 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001946 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001947 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001948 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001949 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001950 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001951 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001952 }
Eric Smith0facd772010-02-24 15:42:29 +00001953 else {
1954 result = PyUnicode_FromFormat(
1955 "'%U' codec can't encode characters in position %zd-%zd: %U",
1956 encoding_str,
1957 uself->start,
1958 uself->end-1,
1959 reason_str);
1960 }
1961done:
1962 Py_XDECREF(reason_str);
1963 Py_XDECREF(encoding_str);
1964 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001965}
1966
1967static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001968 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001969 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970 sizeof(PyUnicodeErrorObject), 0,
1971 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1972 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1973 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001974 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1975 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001976 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001977 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001978};
1979PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1980
1981PyObject *
1982PyUnicodeEncodeError_Create(
1983 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1984 Py_ssize_t start, Py_ssize_t end, const char *reason)
1985{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001986 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001987 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988}
1989
1990
1991/*
1992 * UnicodeDecodeError extends UnicodeError
1993 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001994
1995static int
1996UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1997{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001998 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001999
Thomas Wouters477c8d52006-05-27 19:21:47 +00002000 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2001 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00002002
2003 ude = (PyUnicodeErrorObject *)self;
2004
2005 Py_CLEAR(ude->encoding);
2006 Py_CLEAR(ude->object);
2007 Py_CLEAR(ude->reason);
2008
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002009 if (!PyArg_ParseTuple(args, "UOnnU",
2010 &ude->encoding, &ude->object,
2011 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002012 ude->encoding = ude->object = ude->reason = NULL;
2013 return -1;
2014 }
2015
Guido van Rossum98297ee2007-11-06 21:34:58 +00002016 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002017 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002018 Py_INCREF(ude->reason);
2019
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002020 if (!PyBytes_Check(ude->object)) {
2021 Py_buffer view;
2022 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2023 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002024 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002025 PyBuffer_Release(&view);
2026 if (!ude->object)
2027 goto error;
2028 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002029 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002030
2031error:
2032 Py_CLEAR(ude->encoding);
2033 Py_CLEAR(ude->object);
2034 Py_CLEAR(ude->reason);
2035 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002036}
2037
2038static PyObject *
2039UnicodeDecodeError_str(PyObject *self)
2040{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002041 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002042 PyObject *result = NULL;
2043 PyObject *reason_str = NULL;
2044 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002045
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002046 if (!uself->object)
2047 /* Not properly initialized. */
2048 return PyUnicode_FromString("");
2049
Eric Smith0facd772010-02-24 15:42:29 +00002050 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002051 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002052 reason_str = PyObject_Str(uself->reason);
2053 if (reason_str == NULL)
2054 goto done;
2055 encoding_str = PyObject_Str(uself->encoding);
2056 if (encoding_str == NULL)
2057 goto done;
2058
2059 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002060 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002061 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002062 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002063 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002064 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002065 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002066 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002067 }
Eric Smith0facd772010-02-24 15:42:29 +00002068 else {
2069 result = PyUnicode_FromFormat(
2070 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2071 encoding_str,
2072 uself->start,
2073 uself->end-1,
2074 reason_str
2075 );
2076 }
2077done:
2078 Py_XDECREF(reason_str);
2079 Py_XDECREF(encoding_str);
2080 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002081}
2082
2083static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002084 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002085 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002086 sizeof(PyUnicodeErrorObject), 0,
2087 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2088 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2089 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002090 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2091 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002092 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002093 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002094};
2095PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2096
2097PyObject *
2098PyUnicodeDecodeError_Create(
2099 const char *encoding, const char *object, Py_ssize_t length,
2100 Py_ssize_t start, Py_ssize_t end, const char *reason)
2101{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002102 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002103 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104}
2105
2106
2107/*
2108 * UnicodeTranslateError extends UnicodeError
2109 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002110
2111static int
2112UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2113 PyObject *kwds)
2114{
2115 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2116 return -1;
2117
2118 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002119 Py_CLEAR(self->reason);
2120
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002121 if (!PyArg_ParseTuple(args, "UnnU",
2122 &self->object,
2123 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002124 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002125 return -1;
2126 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002127
Thomas Wouters477c8d52006-05-27 19:21:47 +00002128 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002129 Py_INCREF(self->reason);
2130
2131 return 0;
2132}
2133
2134
2135static PyObject *
2136UnicodeTranslateError_str(PyObject *self)
2137{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002138 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002139 PyObject *result = NULL;
2140 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002141
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002142 if (!uself->object)
2143 /* Not properly initialized. */
2144 return PyUnicode_FromString("");
2145
Eric Smith0facd772010-02-24 15:42:29 +00002146 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002147 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002148 reason_str = PyObject_Str(uself->reason);
2149 if (reason_str == NULL)
2150 goto done;
2151
Victor Stinner53b33e72011-11-21 01:17:27 +01002152 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2153 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002154 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002155 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002156 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002157 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002158 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002159 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002160 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002161 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002162 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002163 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002164 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002165 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002166 );
Eric Smith0facd772010-02-24 15:42:29 +00002167 } else {
2168 result = PyUnicode_FromFormat(
2169 "can't translate characters in position %zd-%zd: %U",
2170 uself->start,
2171 uself->end-1,
2172 reason_str
2173 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002174 }
Eric Smith0facd772010-02-24 15:42:29 +00002175done:
2176 Py_XDECREF(reason_str);
2177 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002178}
2179
2180static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002181 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002182 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002183 sizeof(PyUnicodeErrorObject), 0,
2184 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2185 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2186 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002187 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002188 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2189 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002190 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002191};
2192PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2193
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002194/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195PyObject *
2196PyUnicodeTranslateError_Create(
2197 const Py_UNICODE *object, Py_ssize_t length,
2198 Py_ssize_t start, Py_ssize_t end, const char *reason)
2199{
2200 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002201 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002202}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002203
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002204PyObject *
2205_PyUnicodeTranslateError_Create(
2206 PyObject *object,
2207 Py_ssize_t start, Py_ssize_t end, const char *reason)
2208{
Victor Stinner69598d42014-04-04 20:59:44 +02002209 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002210 object, start, end, reason);
2211}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002212
2213/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002214 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002215 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002216SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002217 "Assertion failed.");
2218
2219
2220/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002221 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002222 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002223SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 "Base class for arithmetic errors.");
2225
2226
2227/*
2228 * FloatingPointError extends ArithmeticError
2229 */
2230SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2231 "Floating point operation failed.");
2232
2233
2234/*
2235 * OverflowError extends ArithmeticError
2236 */
2237SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2238 "Result too large to be represented.");
2239
2240
2241/*
2242 * ZeroDivisionError extends ArithmeticError
2243 */
2244SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2245 "Second argument to a division or modulo operation was zero.");
2246
2247
2248/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002249 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002250 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002251SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002252 "Internal error in the Python interpreter.\n"
2253 "\n"
2254 "Please report this to the Python maintainer, along with the traceback,\n"
2255 "the Python version, and the hardware/OS platform and version.");
2256
2257
2258/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002259 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002260 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002261SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002262 "Weak ref proxy used after referent went away.");
2263
2264
2265/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002266 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002267 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002268
2269#define MEMERRORS_SAVE 16
2270static PyBaseExceptionObject *memerrors_freelist = NULL;
2271static int memerrors_numfree = 0;
2272
2273static PyObject *
2274MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2275{
2276 PyBaseExceptionObject *self;
2277
2278 if (type != (PyTypeObject *) PyExc_MemoryError)
2279 return BaseException_new(type, args, kwds);
2280 if (memerrors_freelist == NULL)
2281 return BaseException_new(type, args, kwds);
2282 /* Fetch object from freelist and revive it */
2283 self = memerrors_freelist;
2284 self->args = PyTuple_New(0);
2285 /* This shouldn't happen since the empty tuple is persistent */
2286 if (self->args == NULL)
2287 return NULL;
2288 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2289 memerrors_numfree--;
2290 self->dict = NULL;
2291 _Py_NewReference((PyObject *)self);
2292 _PyObject_GC_TRACK(self);
2293 return (PyObject *)self;
2294}
2295
2296static void
2297MemoryError_dealloc(PyBaseExceptionObject *self)
2298{
2299 _PyObject_GC_UNTRACK(self);
2300 BaseException_clear(self);
2301 if (memerrors_numfree >= MEMERRORS_SAVE)
2302 Py_TYPE(self)->tp_free((PyObject *)self);
2303 else {
2304 self->dict = (PyObject *) memerrors_freelist;
2305 memerrors_freelist = self;
2306 memerrors_numfree++;
2307 }
2308}
2309
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002310static int
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002311preallocate_memerrors(void)
2312{
2313 /* We create enough MemoryErrors and then decref them, which will fill
2314 up the freelist. */
2315 int i;
2316 PyObject *errors[MEMERRORS_SAVE];
2317 for (i = 0; i < MEMERRORS_SAVE; i++) {
2318 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2319 NULL, NULL);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002320 if (!errors[i]) {
2321 return -1;
2322 }
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002323 }
2324 for (i = 0; i < MEMERRORS_SAVE; i++) {
2325 Py_DECREF(errors[i]);
2326 }
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002327 return 0;
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002328}
2329
2330static void
2331free_preallocated_memerrors(void)
2332{
2333 while (memerrors_freelist != NULL) {
2334 PyObject *self = (PyObject *) memerrors_freelist;
2335 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2336 Py_TYPE(self)->tp_free((PyObject *)self);
2337 }
2338}
2339
2340
2341static PyTypeObject _PyExc_MemoryError = {
2342 PyVarObject_HEAD_INIT(NULL, 0)
2343 "MemoryError",
2344 sizeof(PyBaseExceptionObject),
2345 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2346 0, 0, 0, 0, 0, 0, 0,
2347 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2348 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2349 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2350 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2351 (initproc)BaseException_init, 0, MemoryError_new
2352};
2353PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2354
Thomas Wouters477c8d52006-05-27 19:21:47 +00002355
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002356/*
2357 * BufferError extends Exception
2358 */
2359SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2360
Thomas Wouters477c8d52006-05-27 19:21:47 +00002361
2362/* Warning category docstrings */
2363
2364/*
2365 * Warning extends Exception
2366 */
2367SimpleExtendsException(PyExc_Exception, Warning,
2368 "Base class for warning categories.");
2369
2370
2371/*
2372 * UserWarning extends Warning
2373 */
2374SimpleExtendsException(PyExc_Warning, UserWarning,
2375 "Base class for warnings generated by user code.");
2376
2377
2378/*
2379 * DeprecationWarning extends Warning
2380 */
2381SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2382 "Base class for warnings about deprecated features.");
2383
2384
2385/*
2386 * PendingDeprecationWarning extends Warning
2387 */
2388SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2389 "Base class for warnings about features which will be deprecated\n"
2390 "in the future.");
2391
2392
2393/*
2394 * SyntaxWarning extends Warning
2395 */
2396SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2397 "Base class for warnings about dubious syntax.");
2398
2399
2400/*
2401 * RuntimeWarning extends Warning
2402 */
2403SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2404 "Base class for warnings about dubious runtime behavior.");
2405
2406
2407/*
2408 * FutureWarning extends Warning
2409 */
2410SimpleExtendsException(PyExc_Warning, FutureWarning,
2411 "Base class for warnings about constructs that will change semantically\n"
2412 "in the future.");
2413
2414
2415/*
2416 * ImportWarning extends Warning
2417 */
2418SimpleExtendsException(PyExc_Warning, ImportWarning,
2419 "Base class for warnings about probable mistakes in module imports");
2420
2421
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002422/*
2423 * UnicodeWarning extends Warning
2424 */
2425SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2426 "Base class for warnings about Unicode related problems, mostly\n"
2427 "related to conversion problems.");
2428
Georg Brandl08be72d2010-10-24 15:11:22 +00002429
Guido van Rossum98297ee2007-11-06 21:34:58 +00002430/*
2431 * BytesWarning extends Warning
2432 */
2433SimpleExtendsException(PyExc_Warning, BytesWarning,
2434 "Base class for warnings about bytes and buffer related problems, mostly\n"
2435 "related to conversion from str or comparing to str.");
2436
2437
Georg Brandl08be72d2010-10-24 15:11:22 +00002438/*
2439 * ResourceWarning extends Warning
2440 */
2441SimpleExtendsException(PyExc_Warning, ResourceWarning,
2442 "Base class for warnings about resource usage.");
2443
2444
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002445
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002446#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002447#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002448/* The following constants were added to errno.h in VS2010 but have
2449 preferred WSA equivalents. */
2450#undef EADDRINUSE
2451#undef EADDRNOTAVAIL
2452#undef EAFNOSUPPORT
2453#undef EALREADY
2454#undef ECONNABORTED
2455#undef ECONNREFUSED
2456#undef ECONNRESET
2457#undef EDESTADDRREQ
2458#undef EHOSTUNREACH
2459#undef EINPROGRESS
2460#undef EISCONN
2461#undef ELOOP
2462#undef EMSGSIZE
2463#undef ENETDOWN
2464#undef ENETRESET
2465#undef ENETUNREACH
2466#undef ENOBUFS
2467#undef ENOPROTOOPT
2468#undef ENOTCONN
2469#undef ENOTSOCK
2470#undef EOPNOTSUPP
2471#undef EPROTONOSUPPORT
2472#undef EPROTOTYPE
2473#undef ETIMEDOUT
2474#undef EWOULDBLOCK
2475
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002476#if defined(WSAEALREADY) && !defined(EALREADY)
2477#define EALREADY WSAEALREADY
2478#endif
2479#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2480#define ECONNABORTED WSAECONNABORTED
2481#endif
2482#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2483#define ECONNREFUSED WSAECONNREFUSED
2484#endif
2485#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2486#define ECONNRESET WSAECONNRESET
2487#endif
2488#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2489#define EINPROGRESS WSAEINPROGRESS
2490#endif
2491#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2492#define ESHUTDOWN WSAESHUTDOWN
2493#endif
2494#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2495#define ETIMEDOUT WSAETIMEDOUT
2496#endif
2497#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2498#define EWOULDBLOCK WSAEWOULDBLOCK
2499#endif
2500#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002501
Victor Stinner331a6a52019-05-27 16:39:22 +02002502PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002503_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002504{
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002505#define PRE_INIT(TYPE) \
2506 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2507 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002508 return _PyStatus_ERR("exceptions bootstrapping error."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002509 } \
2510 Py_INCREF(PyExc_ ## TYPE); \
2511 }
2512
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002513#define ADD_ERRNO(TYPE, CODE) \
2514 do { \
2515 PyObject *_code = PyLong_FromLong(CODE); \
2516 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2517 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
Victor Stinner331a6a52019-05-27 16:39:22 +02002518 return _PyStatus_ERR("errmap insertion problem."); \
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002519 Py_DECREF(_code); \
2520 } while (0)
2521
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002522 PRE_INIT(BaseException);
2523 PRE_INIT(Exception);
2524 PRE_INIT(TypeError);
2525 PRE_INIT(StopAsyncIteration);
2526 PRE_INIT(StopIteration);
2527 PRE_INIT(GeneratorExit);
2528 PRE_INIT(SystemExit);
2529 PRE_INIT(KeyboardInterrupt);
2530 PRE_INIT(ImportError);
2531 PRE_INIT(ModuleNotFoundError);
2532 PRE_INIT(OSError);
2533 PRE_INIT(EOFError);
2534 PRE_INIT(RuntimeError);
2535 PRE_INIT(RecursionError);
2536 PRE_INIT(NotImplementedError);
2537 PRE_INIT(NameError);
2538 PRE_INIT(UnboundLocalError);
2539 PRE_INIT(AttributeError);
2540 PRE_INIT(SyntaxError);
2541 PRE_INIT(IndentationError);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002542 PRE_INIT(TargetScopeError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002543 PRE_INIT(TabError);
2544 PRE_INIT(LookupError);
2545 PRE_INIT(IndexError);
2546 PRE_INIT(KeyError);
2547 PRE_INIT(ValueError);
2548 PRE_INIT(UnicodeError);
2549 PRE_INIT(UnicodeEncodeError);
2550 PRE_INIT(UnicodeDecodeError);
2551 PRE_INIT(UnicodeTranslateError);
2552 PRE_INIT(AssertionError);
2553 PRE_INIT(ArithmeticError);
2554 PRE_INIT(FloatingPointError);
2555 PRE_INIT(OverflowError);
2556 PRE_INIT(ZeroDivisionError);
2557 PRE_INIT(SystemError);
2558 PRE_INIT(ReferenceError);
2559 PRE_INIT(MemoryError);
2560 PRE_INIT(BufferError);
2561 PRE_INIT(Warning);
2562 PRE_INIT(UserWarning);
2563 PRE_INIT(DeprecationWarning);
2564 PRE_INIT(PendingDeprecationWarning);
2565 PRE_INIT(SyntaxWarning);
2566 PRE_INIT(RuntimeWarning);
2567 PRE_INIT(FutureWarning);
2568 PRE_INIT(ImportWarning);
2569 PRE_INIT(UnicodeWarning);
2570 PRE_INIT(BytesWarning);
2571 PRE_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002573 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002574 PRE_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002575
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002576 PRE_INIT(BlockingIOError);
2577 PRE_INIT(BrokenPipeError);
2578 PRE_INIT(ChildProcessError);
2579 PRE_INIT(ConnectionAbortedError);
2580 PRE_INIT(ConnectionRefusedError);
2581 PRE_INIT(ConnectionResetError);
2582 PRE_INIT(FileExistsError);
2583 PRE_INIT(FileNotFoundError);
2584 PRE_INIT(IsADirectoryError);
2585 PRE_INIT(NotADirectoryError);
2586 PRE_INIT(InterruptedError);
2587 PRE_INIT(PermissionError);
2588 PRE_INIT(ProcessLookupError);
2589 PRE_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002590
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002591 if (preallocate_memerrors() < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002592 return _PyStatus_ERR("Could not preallocate MemoryError object");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002593 }
2594
2595 /* Add exceptions to errnomap */
2596 if (!errnomap) {
2597 errnomap = PyDict_New();
2598 if (!errnomap) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002599 return _PyStatus_ERR("Cannot allocate map from errnos to OSError subclasses");
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002600 }
2601 }
2602
2603 ADD_ERRNO(BlockingIOError, EAGAIN);
2604 ADD_ERRNO(BlockingIOError, EALREADY);
2605 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2606 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2607 ADD_ERRNO(BrokenPipeError, EPIPE);
2608#ifdef ESHUTDOWN
2609 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2610#endif
2611 ADD_ERRNO(ChildProcessError, ECHILD);
2612 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2613 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2614 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2615 ADD_ERRNO(FileExistsError, EEXIST);
2616 ADD_ERRNO(FileNotFoundError, ENOENT);
2617 ADD_ERRNO(IsADirectoryError, EISDIR);
2618 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2619 ADD_ERRNO(InterruptedError, EINTR);
2620 ADD_ERRNO(PermissionError, EACCES);
2621 ADD_ERRNO(PermissionError, EPERM);
2622 ADD_ERRNO(ProcessLookupError, ESRCH);
2623 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2624
Victor Stinner331a6a52019-05-27 16:39:22 +02002625 return _PyStatus_OK();
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002626
2627#undef PRE_INIT
2628#undef ADD_ERRNO
2629}
2630
2631
2632/* Add exception types to the builtins module */
Victor Stinner331a6a52019-05-27 16:39:22 +02002633PyStatus
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002634_PyBuiltins_AddExceptions(PyObject *bltinmod)
2635{
2636#define POST_INIT(TYPE) \
2637 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002638 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002639 }
2640
2641#define INIT_ALIAS(NAME, TYPE) \
2642 do { \
2643 Py_INCREF(PyExc_ ## TYPE); \
2644 Py_XDECREF(PyExc_ ## NAME); \
2645 PyExc_ ## NAME = PyExc_ ## TYPE; \
2646 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002647 return _PyStatus_ERR("Module dictionary insertion problem."); \
Victor Stinner6d43f6f2019-01-22 21:18:05 +01002648 } \
2649 } while (0)
2650
2651 PyObject *bdict;
2652
Thomas Wouters477c8d52006-05-27 19:21:47 +00002653 bdict = PyModule_GetDict(bltinmod);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002654 if (bdict == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002655 return _PyStatus_ERR("exceptions bootstrapping error.");
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002658 POST_INIT(BaseException);
2659 POST_INIT(Exception);
2660 POST_INIT(TypeError);
2661 POST_INIT(StopAsyncIteration);
2662 POST_INIT(StopIteration);
2663 POST_INIT(GeneratorExit);
2664 POST_INIT(SystemExit);
2665 POST_INIT(KeyboardInterrupt);
2666 POST_INIT(ImportError);
2667 POST_INIT(ModuleNotFoundError);
2668 POST_INIT(OSError);
2669 INIT_ALIAS(EnvironmentError, OSError);
2670 INIT_ALIAS(IOError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671#ifdef MS_WINDOWS
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002672 INIT_ALIAS(WindowsError, OSError);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673#endif
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002674 POST_INIT(EOFError);
2675 POST_INIT(RuntimeError);
2676 POST_INIT(RecursionError);
2677 POST_INIT(NotImplementedError);
2678 POST_INIT(NameError);
2679 POST_INIT(UnboundLocalError);
2680 POST_INIT(AttributeError);
2681 POST_INIT(SyntaxError);
2682 POST_INIT(IndentationError);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002683 POST_INIT(TargetScopeError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002684 POST_INIT(TabError);
2685 POST_INIT(LookupError);
2686 POST_INIT(IndexError);
2687 POST_INIT(KeyError);
2688 POST_INIT(ValueError);
2689 POST_INIT(UnicodeError);
2690 POST_INIT(UnicodeEncodeError);
2691 POST_INIT(UnicodeDecodeError);
2692 POST_INIT(UnicodeTranslateError);
2693 POST_INIT(AssertionError);
2694 POST_INIT(ArithmeticError);
2695 POST_INIT(FloatingPointError);
2696 POST_INIT(OverflowError);
2697 POST_INIT(ZeroDivisionError);
2698 POST_INIT(SystemError);
2699 POST_INIT(ReferenceError);
2700 POST_INIT(MemoryError);
2701 POST_INIT(BufferError);
2702 POST_INIT(Warning);
2703 POST_INIT(UserWarning);
2704 POST_INIT(DeprecationWarning);
2705 POST_INIT(PendingDeprecationWarning);
2706 POST_INIT(SyntaxWarning);
2707 POST_INIT(RuntimeWarning);
2708 POST_INIT(FutureWarning);
2709 POST_INIT(ImportWarning);
2710 POST_INIT(UnicodeWarning);
2711 POST_INIT(BytesWarning);
2712 POST_INIT(ResourceWarning);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002713
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002714 /* OSError subclasses */
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002715 POST_INIT(ConnectionError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002716
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002717 POST_INIT(BlockingIOError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002718 POST_INIT(BrokenPipeError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002719 POST_INIT(ChildProcessError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002720 POST_INIT(ConnectionAbortedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002721 POST_INIT(ConnectionRefusedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002722 POST_INIT(ConnectionResetError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002723 POST_INIT(FileExistsError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002724 POST_INIT(FileNotFoundError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002725 POST_INIT(IsADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002726 POST_INIT(NotADirectoryError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002727 POST_INIT(InterruptedError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002728 POST_INIT(PermissionError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002729 POST_INIT(ProcessLookupError);
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002730 POST_INIT(TimeoutError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002731
Victor Stinner331a6a52019-05-27 16:39:22 +02002732 return _PyStatus_OK();
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002733
Victor Stinnerbf4ac2d2019-01-22 17:39:03 +01002734#undef POST_INIT
2735#undef INIT_ALIAS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002736}
2737
2738void
2739_PyExc_Fini(void)
2740{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002741 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002742 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002743}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002744
2745/* Helper to do the equivalent of "raise X from Y" in C, but always using
2746 * the current exception rather than passing one in.
2747 *
2748 * We currently limit this to *only* exceptions that use the BaseException
2749 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2750 * those correctly without losing data and without losing backwards
2751 * compatibility.
2752 *
2753 * We also aim to rule out *all* exceptions that might be storing additional
2754 * state, whether by having a size difference relative to BaseException,
2755 * additional arguments passed in during construction or by having a
2756 * non-empty instance dict.
2757 *
2758 * We need to be very careful with what we wrap, since changing types to
2759 * a broader exception type would be backwards incompatible for
2760 * existing codecs, and with different init or new method implementations
2761 * may either not support instantiation with PyErr_Format or lose
2762 * information when instantiated that way.
2763 *
2764 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2765 * fact that exceptions are expected to support pickling. If more builtin
2766 * exceptions (e.g. AttributeError) start to be converted to rich
2767 * exceptions with additional attributes, that's probably a better approach
2768 * to pursue over adding special cases for particular stateful subclasses.
2769 *
2770 * Returns a borrowed reference to the new exception (if any), NULL if the
2771 * existing exception was left in place.
2772 */
2773PyObject *
2774_PyErr_TrySetFromCause(const char *format, ...)
2775{
2776 PyObject* msg_prefix;
2777 PyObject *exc, *val, *tb;
2778 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002779 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002780 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002781 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002782 PyObject *new_exc, *new_val, *new_tb;
2783 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002784 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002785
Nick Coghlan8b097b42013-11-13 23:49:21 +10002786 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002787 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002788 /* Ensure type info indicates no extra state is stored at the C level
2789 * and that the type can be reinstantiated using PyErr_Format
2790 */
2791 caught_type_size = caught_type->tp_basicsize;
2792 base_exc_size = _PyExc_BaseException.tp_basicsize;
2793 same_basic_size = (
2794 caught_type_size == base_exc_size ||
2795 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002796 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002797 )
2798 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002799 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002800 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002801 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002802 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002803 /* We can't be sure we can wrap this safely, since it may contain
2804 * more state than just the exception type. Accordingly, we just
2805 * leave it alone.
2806 */
2807 PyErr_Restore(exc, val, tb);
2808 return NULL;
2809 }
2810
2811 /* Check the args are empty or contain a single string */
2812 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002813 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002814 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002815 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002816 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002817 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002818 /* More than 1 arg, or the one arg we do have isn't a string
2819 */
2820 PyErr_Restore(exc, val, tb);
2821 return NULL;
2822 }
2823
2824 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002825 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002826 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002827 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002828 /* While we could potentially copy a non-empty instance dictionary
2829 * to the replacement exception, for now we take the more
2830 * conservative path of leaving exceptions with attributes set
2831 * alone.
2832 */
2833 PyErr_Restore(exc, val, tb);
2834 return NULL;
2835 }
2836
2837 /* For exceptions that we can wrap safely, we chain the original
2838 * exception to a new one of the exact same type with an
2839 * error message that mentions the additional details and the
2840 * original exception.
2841 *
2842 * It would be nice to wrap OSError and various other exception
2843 * types as well, but that's quite a bit trickier due to the extra
2844 * state potentially stored on OSError instances.
2845 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002846 /* Ensure the traceback is set correctly on the existing exception */
2847 if (tb != NULL) {
2848 PyException_SetTraceback(val, tb);
2849 Py_DECREF(tb);
2850 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002851
Christian Heimes507eabd2013-11-14 01:39:35 +01002852#ifdef HAVE_STDARG_PROTOTYPES
2853 va_start(vargs, format);
2854#else
2855 va_start(vargs);
2856#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002857 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002858 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002859 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002860 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002861 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002862 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002863 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002864
2865 PyErr_Format(exc, "%U (%s: %S)",
2866 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002867 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002868 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002869 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2870 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2871 PyException_SetCause(new_val, val);
2872 PyErr_Restore(new_exc, new_val, new_tb);
2873 return new_val;
2874}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002875
2876
2877/* To help with migration from Python 2, SyntaxError.__init__ applies some
2878 * heuristics to try to report a more meaningful exception when print and
2879 * exec are used like statements.
2880 *
2881 * The heuristics are currently expected to detect the following cases:
2882 * - top level statement
2883 * - statement in a nested suite
2884 * - trailing section of a one line complex statement
2885 *
2886 * They're currently known not to trigger:
2887 * - after a semi-colon
2888 *
2889 * The error message can be a bit odd in cases where the "arguments" are
2890 * completely illegal syntactically, but that isn't worth the hassle of
2891 * fixing.
2892 *
2893 * We also can't do anything about cases that are legal Python 3 syntax
2894 * but mean something entirely different from what they did in Python 2
2895 * (omitting the arguments entirely, printing items preceded by a unary plus
2896 * or minus, using the stream redirection syntax).
2897 */
2898
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302899
2900// Static helper for setting legacy print error message
2901static int
2902_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2903{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302904 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302905 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302906 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302907 Py_ssize_t start_pos = start + PRINT_OFFSET;
2908 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2909 Py_UCS4 semicolon = ';';
2910 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2911 start_pos, text_len, 1);
2912 if (end_pos < -1) {
2913 return -1;
2914 } else if (end_pos == -1) {
2915 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302916 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302917
2918 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302919 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302920 return -1;
2921 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302922
2923 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2924 if (strip_sep_obj == NULL) {
2925 Py_DECREF(data);
2926 return -1;
2927 }
2928
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302929 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302930 Py_DECREF(data);
2931 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302932 if (new_data == NULL) {
2933 return -1;
2934 }
2935 // gets the modified text_len after stripping `print `
2936 text_len = PyUnicode_GET_LENGTH(new_data);
2937 const char *maybe_end_arg = "";
2938 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2939 maybe_end_arg = " end=\" \"";
2940 }
2941 PyObject *error_msg = PyUnicode_FromFormat(
2942 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2943 new_data, maybe_end_arg
2944 );
2945 Py_DECREF(new_data);
2946 if (error_msg == NULL)
2947 return -1;
2948
2949 Py_XSETREF(self->msg, error_msg);
2950 return 1;
2951}
2952
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002953static int
2954_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2955{
2956 /* Return values:
2957 * -1: an error occurred
2958 * 0: nothing happened
2959 * 1: the check triggered & the error message was changed
2960 */
2961 static PyObject *print_prefix = NULL;
2962 static PyObject *exec_prefix = NULL;
Zackery Spytza4b48f12018-10-12 02:20:59 -06002963 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002964 int kind = PyUnicode_KIND(self->text);
2965 void *data = PyUnicode_DATA(self->text);
2966
2967 /* Ignore leading whitespace */
2968 while (start < text_len) {
2969 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2970 if (!Py_UNICODE_ISSPACE(ch))
2971 break;
2972 start++;
2973 }
2974 /* Checking against an empty or whitespace-only part of the string */
2975 if (start == text_len) {
2976 return 0;
2977 }
2978
2979 /* Check for legacy print statements */
2980 if (print_prefix == NULL) {
2981 print_prefix = PyUnicode_InternFromString("print ");
2982 if (print_prefix == NULL) {
2983 return -1;
2984 }
2985 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002986 match = PyUnicode_Tailmatch(self->text, print_prefix,
2987 start, text_len, -1);
2988 if (match == -1) {
2989 return -1;
2990 }
2991 if (match) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302992 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002993 }
2994
2995 /* Check for legacy exec statements */
2996 if (exec_prefix == NULL) {
2997 exec_prefix = PyUnicode_InternFromString("exec ");
2998 if (exec_prefix == NULL) {
2999 return -1;
3000 }
3001 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06003002 match = PyUnicode_Tailmatch(self->text, exec_prefix, start, text_len, -1);
3003 if (match == -1) {
3004 return -1;
3005 }
3006 if (match) {
3007 PyObject *msg = PyUnicode_FromString("Missing parentheses in call "
3008 "to 'exec'");
3009 if (msg == NULL) {
3010 return -1;
3011 }
3012 Py_XSETREF(self->msg, msg);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10003013 return 1;
3014 }
3015 /* Fall back to the default error message */
3016 return 0;
3017}
3018
3019static int
3020_report_missing_parentheses(PySyntaxErrorObject *self)
3021{
3022 Py_UCS4 left_paren = 40;
3023 Py_ssize_t left_paren_index;
3024 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
3025 int legacy_check_result = 0;
3026
3027 /* Skip entirely if there is an opening parenthesis */
3028 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
3029 0, text_len, 1);
3030 if (left_paren_index < -1) {
3031 return -1;
3032 }
3033 if (left_paren_index != -1) {
3034 /* Use default error message for any line with an opening paren */
3035 return 0;
3036 }
3037 /* Handle the simple statement case */
3038 legacy_check_result = _check_for_legacy_statements(self, 0);
3039 if (legacy_check_result < 0) {
3040 return -1;
3041
3042 }
3043 if (legacy_check_result == 0) {
3044 /* Handle the one-line complex statement case */
3045 Py_UCS4 colon = 58;
3046 Py_ssize_t colon_index;
3047 colon_index = PyUnicode_FindChar(self->text, colon,
3048 0, text_len, 1);
3049 if (colon_index < -1) {
3050 return -1;
3051 }
3052 if (colon_index >= 0 && colon_index < text_len) {
3053 /* Check again, starting from just after the colon */
3054 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3055 return -1;
3056 }
3057 }
3058 }
3059 return 0;
3060}