blob: 002a602373d7323a26d56ac968d6306095aef2e2 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
Victor Stinnerbcda8f12018-11-21 22:27:47 +01009#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010010#include "pycore_pymem.h"
11#include "pycore_pystate.h"
Thomas Wouters477c8d52006-05-27 19:21:47 +000012#include "structmember.h"
13#include "osdefs.h"
14
Thomas Wouters477c8d52006-05-27 19:21:47 +000015
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020016/* Compatibility aliases */
17PyObject *PyExc_EnvironmentError = NULL;
18PyObject *PyExc_IOError = NULL;
19#ifdef MS_WINDOWS
20PyObject *PyExc_WindowsError = NULL;
21#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020022
23/* The dict map from errno codes to OSError subclasses */
24static PyObject *errnomap = NULL;
25
26
Thomas Wouters477c8d52006-05-27 19:21:47 +000027/* NOTE: If the exception class hierarchy changes, don't forget to update
28 * Lib/test/exception_hierarchy.txt
29 */
30
Thomas Wouters477c8d52006-05-27 19:21:47 +000031/*
32 * BaseException
33 */
34static PyObject *
35BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36{
37 PyBaseExceptionObject *self;
38
39 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000040 if (!self)
41 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000042 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000043 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000044 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070045 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000046
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010047 if (args) {
48 self->args = args;
49 Py_INCREF(args);
50 return (PyObject *)self;
51 }
52
Thomas Wouters477c8d52006-05-27 19:21:47 +000053 self->args = PyTuple_New(0);
54 if (!self->args) {
55 Py_DECREF(self);
56 return NULL;
57 }
58
Thomas Wouters477c8d52006-05-27 19:21:47 +000059 return (PyObject *)self;
60}
61
62static int
63BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
64{
Christian Heimes90aa7642007-12-19 02:45:37 +000065 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000066 return -1;
67
Serhiy Storchaka576f1322016-01-05 21:27:54 +020068 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030069 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000070
Thomas Wouters477c8d52006-05-27 19:21:47 +000071 return 0;
72}
73
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000074static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000075BaseException_clear(PyBaseExceptionObject *self)
76{
77 Py_CLEAR(self->dict);
78 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000079 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000080 Py_CLEAR(self->cause);
81 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000082 return 0;
83}
84
85static void
86BaseException_dealloc(PyBaseExceptionObject *self)
87{
Thomas Wouters89f507f2006-12-13 04:49:30 +000088 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000089 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000090 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000091}
92
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000094BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
95{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000096 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000097 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000098 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000099 Py_VISIT(self->cause);
100 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000101 return 0;
102}
103
104static PyObject *
105BaseException_str(PyBaseExceptionObject *self)
106{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000107 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000109 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000111 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000113 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115}
116
117static PyObject *
118BaseException_repr(PyBaseExceptionObject *self)
119{
Serhiy Storchaka4ab46d72017-09-17 21:11:04 +0300120 const char *name = _PyType_Name(Py_TYPE(self));
Serhiy Storchakaf8a4c032017-11-15 17:53:28 +0200121 if (PyTuple_GET_SIZE(self->args) == 1)
122 return PyUnicode_FromFormat("%s(%R)", name,
123 PyTuple_GET_ITEM(self->args, 0));
124 else
125 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000126}
127
128/* Pickling support */
129static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530130BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000132 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000133 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000134 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000135 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136}
137
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000138/*
139 * Needed for backward compatibility, since exceptions used to store
140 * all their attributes in the __dict__. Code is taken from cPickle's
141 * load_build function.
142 */
143static PyObject *
144BaseException_setstate(PyObject *self, PyObject *state)
145{
146 PyObject *d_key, *d_value;
147 Py_ssize_t i = 0;
148
149 if (state != Py_None) {
150 if (!PyDict_Check(state)) {
151 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
152 return NULL;
153 }
154 while (PyDict_Next(state, &i, &d_key, &d_value)) {
155 if (PyObject_SetAttr(self, d_key, d_value) < 0)
156 return NULL;
157 }
158 }
159 Py_RETURN_NONE;
160}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000161
Collin Winter828f04a2007-08-31 00:04:24 +0000162static PyObject *
163BaseException_with_traceback(PyObject *self, PyObject *tb) {
164 if (PyException_SetTraceback(self, tb))
165 return NULL;
166
167 Py_INCREF(self);
168 return self;
169}
170
Georg Brandl76941002008-05-05 21:38:47 +0000171PyDoc_STRVAR(with_traceback_doc,
172"Exception.with_traceback(tb) --\n\
173 set self.__traceback__ to tb and return self.");
174
Thomas Wouters477c8d52006-05-27 19:21:47 +0000175
176static PyMethodDef BaseException_methods[] = {
177 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000178 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000179 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
180 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181 {NULL, NULL, 0, NULL},
182};
183
Thomas Wouters477c8d52006-05-27 19:21:47 +0000184static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200185BaseException_get_args(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000186{
187 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200188 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000189 }
190 Py_INCREF(self->args);
191 return self->args;
192}
193
194static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200195BaseException_set_args(PyBaseExceptionObject *self, PyObject *val, void *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000196{
197 PyObject *seq;
198 if (val == NULL) {
199 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
200 return -1;
201 }
202 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500203 if (!seq)
204 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300205 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000206 return 0;
207}
208
Collin Winter828f04a2007-08-31 00:04:24 +0000209static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200210BaseException_get_tb(PyBaseExceptionObject *self, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000211{
212 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200213 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000214 }
215 Py_INCREF(self->traceback);
216 return self->traceback;
217}
218
219static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200220BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb, void *Py_UNUSED(ignored))
Collin Winter828f04a2007-08-31 00:04:24 +0000221{
222 if (tb == NULL) {
223 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
224 return -1;
225 }
226 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
227 PyErr_SetString(PyExc_TypeError,
228 "__traceback__ must be a traceback or None");
229 return -1;
230 }
231
Serhiy Storchaka37665722016-08-20 21:22:03 +0300232 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300233 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000234 return 0;
235}
236
Georg Brandlab6f2f62009-03-31 04:16:10 +0000237static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200238BaseException_get_context(PyObject *self, void *Py_UNUSED(ignored))
239{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000240 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500241 if (res)
242 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000243 Py_RETURN_NONE;
244}
245
246static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200247BaseException_set_context(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
248{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000249 if (arg == NULL) {
250 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
251 return -1;
252 } else if (arg == Py_None) {
253 arg = NULL;
254 } else if (!PyExceptionInstance_Check(arg)) {
255 PyErr_SetString(PyExc_TypeError, "exception context must be None "
256 "or derive from BaseException");
257 return -1;
258 } else {
259 /* PyException_SetContext steals this reference */
260 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000262 PyException_SetContext(self, arg);
263 return 0;
264}
265
266static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200267BaseException_get_cause(PyObject *self, void *Py_UNUSED(ignored))
268{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000269 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500270 if (res)
271 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700272 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000273}
274
275static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200276BaseException_set_cause(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored))
277{
Georg Brandlab6f2f62009-03-31 04:16:10 +0000278 if (arg == NULL) {
279 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
280 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700281 } else if (arg == Py_None) {
282 arg = NULL;
283 } else if (!PyExceptionInstance_Check(arg)) {
284 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
285 "or derive from BaseException");
286 return -1;
287 } else {
288 /* PyException_SetCause steals this reference */
289 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700291 PyException_SetCause(self, arg);
292 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000293}
294
Guido van Rossum360e4b82007-05-14 22:51:27 +0000295
Thomas Wouters477c8d52006-05-27 19:21:47 +0000296static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500297 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000298 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000299 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200300 {"__context__", BaseException_get_context,
301 BaseException_set_context, PyDoc_STR("exception context")},
302 {"__cause__", BaseException_get_cause,
303 BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000304 {NULL},
305};
306
307
Collin Winter828f04a2007-08-31 00:04:24 +0000308PyObject *
309PyException_GetTraceback(PyObject *self) {
310 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
311 Py_XINCREF(base_self->traceback);
312 return base_self->traceback;
313}
314
315
316int
317PyException_SetTraceback(PyObject *self, PyObject *tb) {
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +0200318 return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL);
Collin Winter828f04a2007-08-31 00:04:24 +0000319}
320
321PyObject *
322PyException_GetCause(PyObject *self) {
323 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
324 Py_XINCREF(cause);
325 return cause;
326}
327
328/* Steals a reference to cause */
329void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200330PyException_SetCause(PyObject *self, PyObject *cause)
331{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700332 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300333 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000334}
335
336PyObject *
337PyException_GetContext(PyObject *self) {
338 PyObject *context = ((PyBaseExceptionObject *)self)->context;
339 Py_XINCREF(context);
340 return context;
341}
342
343/* Steals a reference to context */
344void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200345PyException_SetContext(PyObject *self, PyObject *context)
346{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300347 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000348}
349
Christian Tismerea62ce72018-06-09 20:32:25 +0200350#undef PyExceptionClass_Name
Christian Tismer83987132018-06-11 00:48:28 +0200351
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300352const char *
Christian Tismerea62ce72018-06-09 20:32:25 +0200353PyExceptionClass_Name(PyObject *ob)
354{
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300355 return ((PyTypeObject*)ob)->tp_name;
Christian Tismerea62ce72018-06-09 20:32:25 +0200356}
Collin Winter828f04a2007-08-31 00:04:24 +0000357
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700358static struct PyMemberDef BaseException_members[] = {
359 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200360 offsetof(PyBaseExceptionObject, suppress_context)},
361 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700362};
363
364
Thomas Wouters477c8d52006-05-27 19:21:47 +0000365static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000366 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000367 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000368 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
369 0, /*tp_itemsize*/
370 (destructor)BaseException_dealloc, /*tp_dealloc*/
371 0, /*tp_print*/
372 0, /*tp_getattr*/
373 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000374 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000375 (reprfunc)BaseException_repr, /*tp_repr*/
376 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000377 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378 0, /*tp_as_mapping*/
379 0, /*tp_hash */
380 0, /*tp_call*/
381 (reprfunc)BaseException_str, /*tp_str*/
382 PyObject_GenericGetAttr, /*tp_getattro*/
383 PyObject_GenericSetAttr, /*tp_setattro*/
384 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000385 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000387 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
388 (traverseproc)BaseException_traverse, /* tp_traverse */
389 (inquiry)BaseException_clear, /* tp_clear */
390 0, /* tp_richcompare */
391 0, /* tp_weaklistoffset */
392 0, /* tp_iter */
393 0, /* tp_iternext */
394 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700395 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000396 BaseException_getset, /* tp_getset */
397 0, /* tp_base */
398 0, /* tp_dict */
399 0, /* tp_descr_get */
400 0, /* tp_descr_set */
401 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
402 (initproc)BaseException_init, /* tp_init */
403 0, /* tp_alloc */
404 BaseException_new, /* tp_new */
405};
406/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
407from the previous implmentation and also allowing Python objects to be used
408in the API */
409PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
410
411/* note these macros omit the last semicolon so the macro invocation may
412 * include it and not look strange.
413 */
414#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
415static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000416 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000417 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000418 sizeof(PyBaseExceptionObject), \
419 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
420 0, 0, 0, 0, 0, 0, 0, \
421 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
422 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
423 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
424 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
425 (initproc)BaseException_init, 0, BaseException_new,\
426}; \
427PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
428
429#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
430static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000431 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000432 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000433 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000434 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435 0, 0, 0, 0, 0, \
436 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000437 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
438 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000439 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200440 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000441}; \
442PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
443
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200444#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
445 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
446 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000448 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000449 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000450 sizeof(Py ## EXCSTORE ## Object), 0, \
451 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
452 (reprfunc)EXCSTR, 0, 0, 0, \
453 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
454 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
455 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200456 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000457 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200458 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000459}; \
460PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
461
462
463/*
464 * Exception extends BaseException
465 */
466SimpleExtendsException(PyExc_BaseException, Exception,
467 "Common base class for all non-exit exceptions.");
468
469
470/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000471 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000472 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000473SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000474 "Inappropriate argument type.");
475
476
477/*
Yury Selivanov75445082015-05-11 22:57:16 -0400478 * StopAsyncIteration extends Exception
479 */
480SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
481 "Signal the end from iterator.__anext__().");
482
483
484/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000485 * StopIteration extends Exception
486 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000487
488static PyMemberDef StopIteration_members[] = {
489 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
490 PyDoc_STR("generator return value")},
491 {NULL} /* Sentinel */
492};
493
494static int
495StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
496{
497 Py_ssize_t size = PyTuple_GET_SIZE(args);
498 PyObject *value;
499
500 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
501 return -1;
502 Py_CLEAR(self->value);
503 if (size > 0)
504 value = PyTuple_GET_ITEM(args, 0);
505 else
506 value = Py_None;
507 Py_INCREF(value);
508 self->value = value;
509 return 0;
510}
511
512static int
513StopIteration_clear(PyStopIterationObject *self)
514{
515 Py_CLEAR(self->value);
516 return BaseException_clear((PyBaseExceptionObject *)self);
517}
518
519static void
520StopIteration_dealloc(PyStopIterationObject *self)
521{
522 _PyObject_GC_UNTRACK(self);
523 StopIteration_clear(self);
524 Py_TYPE(self)->tp_free((PyObject *)self);
525}
526
527static int
528StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
529{
530 Py_VISIT(self->value);
531 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
532}
533
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000534ComplexExtendsException(
535 PyExc_Exception, /* base */
536 StopIteration, /* name */
537 StopIteration, /* prefix for *_init, etc */
538 0, /* new */
539 0, /* methods */
540 StopIteration_members, /* members */
541 0, /* getset */
542 0, /* str */
543 "Signal the end from iterator.__next__()."
544);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000545
546
547/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000548 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000549 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000550SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000551 "Request that a generator exit.");
552
553
554/*
555 * SystemExit extends BaseException
556 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000557
558static int
559SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
560{
561 Py_ssize_t size = PyTuple_GET_SIZE(args);
562
563 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
564 return -1;
565
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000566 if (size == 0)
567 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200568 if (size == 1) {
569 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300570 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200571 }
572 else { /* size > 1 */
573 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300574 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200575 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000576 return 0;
577}
578
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000579static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580SystemExit_clear(PySystemExitObject *self)
581{
582 Py_CLEAR(self->code);
583 return BaseException_clear((PyBaseExceptionObject *)self);
584}
585
586static void
587SystemExit_dealloc(PySystemExitObject *self)
588{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000589 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000591 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592}
593
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000594static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000595SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
596{
597 Py_VISIT(self->code);
598 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
599}
600
601static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000602 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
603 PyDoc_STR("exception code")},
604 {NULL} /* Sentinel */
605};
606
607ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200608 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609 "Request to exit from the interpreter.");
610
611/*
612 * KeyboardInterrupt extends BaseException
613 */
614SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
615 "Program interrupted by user.");
616
617
618/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000620 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000621
Brett Cannon79ec55e2012-04-12 20:24:54 -0400622static int
623ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
624{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300625 static char *kwlist[] = {"name", "path", 0};
626 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400627 PyObject *msg = NULL;
628 PyObject *name = NULL;
629 PyObject *path = NULL;
630
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300631 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400632 return -1;
633
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300634 empty_tuple = PyTuple_New(0);
635 if (!empty_tuple)
636 return -1;
637 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
638 &name, &path)) {
639 Py_DECREF(empty_tuple);
640 return -1;
641 }
642 Py_DECREF(empty_tuple);
643
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300644 Py_XINCREF(name);
645 Py_XSETREF(self->name, name);
646
647 Py_XINCREF(path);
648 Py_XSETREF(self->path, path);
649
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300650 if (PyTuple_GET_SIZE(args) == 1) {
651 msg = PyTuple_GET_ITEM(args, 0);
652 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300653 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300654 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400655
656 return 0;
657}
658
659static int
660ImportError_clear(PyImportErrorObject *self)
661{
662 Py_CLEAR(self->msg);
663 Py_CLEAR(self->name);
664 Py_CLEAR(self->path);
665 return BaseException_clear((PyBaseExceptionObject *)self);
666}
667
668static void
669ImportError_dealloc(PyImportErrorObject *self)
670{
671 _PyObject_GC_UNTRACK(self);
672 ImportError_clear(self);
673 Py_TYPE(self)->tp_free((PyObject *)self);
674}
675
676static int
677ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
678{
679 Py_VISIT(self->msg);
680 Py_VISIT(self->name);
681 Py_VISIT(self->path);
682 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
683}
684
685static PyObject *
686ImportError_str(PyImportErrorObject *self)
687{
Brett Cannon07c6e712012-08-24 13:05:09 -0400688 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400689 Py_INCREF(self->msg);
690 return self->msg;
691 }
692 else {
693 return BaseException_str((PyBaseExceptionObject *)self);
694 }
695}
696
Serhiy Storchakab7853962017-04-08 09:55:07 +0300697static PyObject *
698ImportError_getstate(PyImportErrorObject *self)
699{
700 PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
701 if (self->name || self->path) {
702 _Py_IDENTIFIER(name);
703 _Py_IDENTIFIER(path);
704 dict = dict ? PyDict_Copy(dict) : PyDict_New();
705 if (dict == NULL)
706 return NULL;
707 if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
708 Py_DECREF(dict);
709 return NULL;
710 }
711 if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
712 Py_DECREF(dict);
713 return NULL;
714 }
715 return dict;
716 }
717 else if (dict) {
718 Py_INCREF(dict);
719 return dict;
720 }
721 else {
722 Py_RETURN_NONE;
723 }
724}
725
726/* Pickling support */
727static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530728ImportError_reduce(PyImportErrorObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakab7853962017-04-08 09:55:07 +0300729{
730 PyObject *res;
731 PyObject *args;
732 PyObject *state = ImportError_getstate(self);
733 if (state == NULL)
734 return NULL;
735 args = ((PyBaseExceptionObject *)self)->args;
736 if (state == Py_None)
737 res = PyTuple_Pack(2, Py_TYPE(self), args);
738 else
739 res = PyTuple_Pack(3, Py_TYPE(self), args, state);
740 Py_DECREF(state);
741 return res;
742}
743
Brett Cannon79ec55e2012-04-12 20:24:54 -0400744static PyMemberDef ImportError_members[] = {
745 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
746 PyDoc_STR("exception message")},
747 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
748 PyDoc_STR("module name")},
749 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
750 PyDoc_STR("module path")},
751 {NULL} /* Sentinel */
752};
753
754static PyMethodDef ImportError_methods[] = {
Serhiy Storchakab7853962017-04-08 09:55:07 +0300755 {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
Brett Cannon79ec55e2012-04-12 20:24:54 -0400756 {NULL}
757};
758
759ComplexExtendsException(PyExc_Exception, ImportError,
760 ImportError, 0 /* new */,
761 ImportError_methods, ImportError_members,
762 0 /* getset */, ImportError_str,
763 "Import can't find module, or can't find name in "
764 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000765
766/*
Eric Snowc9432652016-09-07 15:42:32 -0700767 * ModuleNotFoundError extends ImportError
768 */
769
770MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
771 "Module not found.");
772
773/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200774 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000775 */
776
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200777#ifdef MS_WINDOWS
778#include "errmap.h"
779#endif
780
Thomas Wouters477c8d52006-05-27 19:21:47 +0000781/* Where a function has a single filename, such as open() or some
782 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
783 * called, giving a third argument which is the filename. But, so
784 * that old code using in-place unpacking doesn't break, e.g.:
785 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200786 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000787 *
788 * we hack args so that it only contains two items. This also
789 * means we need our own __str__() which prints out the filename
790 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800791 *
792 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800793 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
794 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000795 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200796
Antoine Pitroue0e27352011-12-15 14:31:28 +0100797/* This function doesn't cleanup on error, the caller should */
798static int
799oserror_parse_args(PyObject **p_args,
800 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800801 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200802#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100803 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200804#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100805 )
806{
807 Py_ssize_t nargs;
808 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800809#ifndef MS_WINDOWS
810 /*
811 * ignored on non-Windows platforms,
812 * but parsed so OSError has a consistent signature
813 */
814 PyObject *_winerror = NULL;
815 PyObject **winerror = &_winerror;
816#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000817
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000819
Larry Hastingsb0827312014-02-09 22:05:19 -0800820 if (nargs >= 2 && nargs <= 5) {
821 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
822 myerrno, strerror,
823 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100824 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800825#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100826 if (*winerror && PyLong_Check(*winerror)) {
827 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200828 PyObject *newargs;
829 Py_ssize_t i;
830
Antoine Pitroue0e27352011-12-15 14:31:28 +0100831 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200832 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100833 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200834 /* Set errno to the corresponding POSIX errno (overriding
835 first argument). Windows Socket error codes (>= 10000)
836 have the same value as their POSIX counterparts.
837 */
838 if (winerrcode < 10000)
839 errcode = winerror_to_errno(winerrcode);
840 else
841 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100842 *myerrno = PyLong_FromLong(errcode);
843 if (!*myerrno)
844 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200845 newargs = PyTuple_New(nargs);
846 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100847 return -1;
848 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200849 for (i = 1; i < nargs; i++) {
850 PyObject *val = PyTuple_GET_ITEM(args, i);
851 Py_INCREF(val);
852 PyTuple_SET_ITEM(newargs, i, val);
853 }
854 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100855 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200856 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800857#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200858 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000859
Antoine Pitroue0e27352011-12-15 14:31:28 +0100860 return 0;
861}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000862
Antoine Pitroue0e27352011-12-15 14:31:28 +0100863static int
864oserror_init(PyOSErrorObject *self, PyObject **p_args,
865 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800866 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100867#ifdef MS_WINDOWS
868 , PyObject *winerror
869#endif
870 )
871{
872 PyObject *args = *p_args;
873 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000874
875 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200876 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100877 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200878 PyNumber_Check(filename)) {
879 /* BlockingIOError's 3rd argument can be the number of
880 * characters written.
881 */
882 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
883 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100884 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200885 }
886 else {
887 Py_INCREF(filename);
888 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000889
Larry Hastingsb0827312014-02-09 22:05:19 -0800890 if (filename2 && filename2 != Py_None) {
891 Py_INCREF(filename2);
892 self->filename2 = filename2;
893 }
894
895 if (nargs >= 2 && nargs <= 5) {
896 /* filename, filename2, and winerror are removed from the args tuple
897 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100898 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200899 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100900 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000901
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200902 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100903 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200904 }
905 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000906 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200907 Py_XINCREF(myerrno);
908 self->myerrno = myerrno;
909
910 Py_XINCREF(strerror);
911 self->strerror = strerror;
912
913#ifdef MS_WINDOWS
914 Py_XINCREF(winerror);
915 self->winerror = winerror;
916#endif
917
Antoine Pitroue0e27352011-12-15 14:31:28 +0100918 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300919 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100920 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100921
922 return 0;
923}
924
925static PyObject *
926OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
927static int
928OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
929
930static int
931oserror_use_init(PyTypeObject *type)
932{
Martin Panter7462b6492015-11-02 03:37:02 +0000933 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100934 extraneous argument to __new__ to be ignored. The only reasonable
935 solution, given __new__ takes a variable number of arguments,
936 is to defer arg parsing and initialization to __init__.
937
Martin Pantere26da7c2016-06-02 10:07:09 +0000938 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100939 with the right arguments.
940
941 (see http://bugs.python.org/issue12555#msg148829 )
942 */
943 if (type->tp_init != (initproc) OSError_init &&
944 type->tp_new == (newfunc) OSError_new) {
945 assert((PyObject *) type != PyExc_OSError);
946 return 1;
947 }
948 return 0;
949}
950
951static PyObject *
952OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
953{
954 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800955 PyObject *myerrno = NULL, *strerror = NULL;
956 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100957#ifdef MS_WINDOWS
958 PyObject *winerror = NULL;
959#endif
960
Victor Stinner46ef3192013-11-14 22:31:41 +0100961 Py_INCREF(args);
962
Antoine Pitroue0e27352011-12-15 14:31:28 +0100963 if (!oserror_use_init(type)) {
964 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100965 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100966
Larry Hastingsb0827312014-02-09 22:05:19 -0800967 if (oserror_parse_args(&args, &myerrno, &strerror,
968 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100969#ifdef MS_WINDOWS
970 , &winerror
971#endif
972 ))
973 goto error;
974
975 if (myerrno && PyLong_Check(myerrno) &&
976 errnomap && (PyObject *) type == PyExc_OSError) {
977 PyObject *newtype;
978 newtype = PyDict_GetItem(errnomap, myerrno);
979 if (newtype) {
980 assert(PyType_Check(newtype));
981 type = (PyTypeObject *) newtype;
982 }
983 else if (PyErr_Occurred())
984 goto error;
985 }
986 }
987
988 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
989 if (!self)
990 goto error;
991
992 self->dict = NULL;
993 self->traceback = self->cause = self->context = NULL;
994 self->written = -1;
995
996 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800997 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100998#ifdef MS_WINDOWS
999 , winerror
1000#endif
1001 ))
1002 goto error;
1003 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +02001004 else {
1005 self->args = PyTuple_New(0);
1006 if (self->args == NULL)
1007 goto error;
1008 }
Antoine Pitroue0e27352011-12-15 14:31:28 +01001009
Victor Stinner46ef3192013-11-14 22:31:41 +01001010 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011 return (PyObject *) self;
1012
1013error:
1014 Py_XDECREF(args);
1015 Py_XDECREF(self);
1016 return NULL;
1017}
1018
1019static int
Antoine Pitroue0e27352011-12-15 14:31:28 +01001020OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001021{
Larry Hastingsb0827312014-02-09 22:05:19 -08001022 PyObject *myerrno = NULL, *strerror = NULL;
1023 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001024#ifdef MS_WINDOWS
1025 PyObject *winerror = NULL;
1026#endif
1027
1028 if (!oserror_use_init(Py_TYPE(self)))
1029 /* Everything already done in OSError_new */
1030 return 0;
1031
1032 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
1033 return -1;
1034
1035 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -08001036 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001037#ifdef MS_WINDOWS
1038 , &winerror
1039#endif
1040 ))
1041 goto error;
1042
Larry Hastingsb0827312014-02-09 22:05:19 -08001043 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +01001044#ifdef MS_WINDOWS
1045 , winerror
1046#endif
1047 ))
1048 goto error;
1049
Thomas Wouters477c8d52006-05-27 19:21:47 +00001050 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +01001051
1052error:
Serhiy Storchaka37665722016-08-20 21:22:03 +03001053 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +01001054 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055}
1056
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001057static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001058OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001059{
1060 Py_CLEAR(self->myerrno);
1061 Py_CLEAR(self->strerror);
1062 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001063 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001064#ifdef MS_WINDOWS
1065 Py_CLEAR(self->winerror);
1066#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001067 return BaseException_clear((PyBaseExceptionObject *)self);
1068}
1069
1070static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001072{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001075 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001076}
1077
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001078static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001079OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001080 void *arg)
1081{
1082 Py_VISIT(self->myerrno);
1083 Py_VISIT(self->strerror);
1084 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001085 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001086#ifdef MS_WINDOWS
1087 Py_VISIT(self->winerror);
1088#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001089 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1090}
1091
1092static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001093OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001094{
Larry Hastingsb0827312014-02-09 22:05:19 -08001095#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001096#ifdef MS_WINDOWS
1097 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001098 if (self->winerror && self->filename) {
1099 if (self->filename2) {
1100 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1101 OR_NONE(self->winerror),
1102 OR_NONE(self->strerror),
1103 self->filename,
1104 self->filename2);
1105 } else {
1106 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1107 OR_NONE(self->winerror),
1108 OR_NONE(self->strerror),
1109 self->filename);
1110 }
1111 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001112 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001113 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001114 self->winerror ? self->winerror: Py_None,
1115 self->strerror ? self->strerror: Py_None);
1116#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001117 if (self->filename) {
1118 if (self->filename2) {
1119 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1120 OR_NONE(self->myerrno),
1121 OR_NONE(self->strerror),
1122 self->filename,
1123 self->filename2);
1124 } else {
1125 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1126 OR_NONE(self->myerrno),
1127 OR_NONE(self->strerror),
1128 self->filename);
1129 }
1130 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001131 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001132 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001133 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001134 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135}
1136
Thomas Wouters477c8d52006-05-27 19:21:47 +00001137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301138OSError_reduce(PyOSErrorObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001139{
1140 PyObject *args = self->args;
1141 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001142
Thomas Wouters477c8d52006-05-27 19:21:47 +00001143 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001144 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001145 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001146 Py_ssize_t size = self->filename2 ? 5 : 3;
1147 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001148 if (!args)
1149 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001150
1151 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001152 Py_INCREF(tmp);
1153 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001154
1155 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 Py_INCREF(tmp);
1157 PyTuple_SET_ITEM(args, 1, tmp);
1158
1159 Py_INCREF(self->filename);
1160 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001161
1162 if (self->filename2) {
1163 /*
1164 * This tuple is essentially used as OSError(*args).
1165 * So, to recreate filename2, we need to pass in
1166 * winerror as well.
1167 */
1168 Py_INCREF(Py_None);
1169 PyTuple_SET_ITEM(args, 3, Py_None);
1170
1171 /* filename2 */
1172 Py_INCREF(self->filename2);
1173 PyTuple_SET_ITEM(args, 4, self->filename2);
1174 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001175 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001176 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001177
1178 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001179 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001180 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001181 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001182 Py_DECREF(args);
1183 return res;
1184}
1185
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001186static PyObject *
1187OSError_written_get(PyOSErrorObject *self, void *context)
1188{
1189 if (self->written == -1) {
1190 PyErr_SetString(PyExc_AttributeError, "characters_written");
1191 return NULL;
1192 }
1193 return PyLong_FromSsize_t(self->written);
1194}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001195
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001196static int
1197OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1198{
Serhiy Storchakae2af34f2018-12-17 16:43:14 +02001199 if (arg == NULL) {
1200 if (self->written == -1) {
1201 PyErr_SetString(PyExc_AttributeError, "characters_written");
1202 return -1;
1203 }
1204 self->written = -1;
1205 return 0;
1206 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001207 Py_ssize_t n;
1208 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1209 if (n == -1 && PyErr_Occurred())
1210 return -1;
1211 self->written = n;
1212 return 0;
1213}
1214
1215static PyMemberDef OSError_members[] = {
1216 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1217 PyDoc_STR("POSIX exception code")},
1218 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1219 PyDoc_STR("exception strerror")},
1220 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1221 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001222 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1223 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001224#ifdef MS_WINDOWS
1225 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1226 PyDoc_STR("Win32 exception code")},
1227#endif
1228 {NULL} /* Sentinel */
1229};
1230
1231static PyMethodDef OSError_methods[] = {
1232 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001233 {NULL}
1234};
1235
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001236static PyGetSetDef OSError_getset[] = {
1237 {"characters_written", (getter) OSError_written_get,
1238 (setter) OSError_written_set, NULL},
1239 {NULL}
1240};
1241
1242
1243ComplexExtendsException(PyExc_Exception, OSError,
1244 OSError, OSError_new,
1245 OSError_methods, OSError_members, OSError_getset,
1246 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001247 "Base class for I/O related errors.");
1248
1249
1250/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001251 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001252 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001253MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1254 "I/O operation would block.");
1255MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1256 "Connection error.");
1257MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1258 "Child process error.");
1259MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1260 "Broken pipe.");
1261MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1262 "Connection aborted.");
1263MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1264 "Connection refused.");
1265MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1266 "Connection reset.");
1267MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1268 "File already exists.");
1269MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1270 "File not found.");
1271MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1272 "Operation doesn't work on directories.");
1273MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1274 "Operation only works on directories.");
1275MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1276 "Interrupted by signal.");
1277MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1278 "Not enough permissions.");
1279MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1280 "Process not found.");
1281MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1282 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001283
1284/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001285 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001286 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001287SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001288 "Read beyond end of file.");
1289
1290
1291/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001292 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001293 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001294SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295 "Unspecified run-time error.");
1296
Yury Selivanovf488fb42015-07-03 01:04:23 -04001297/*
1298 * RecursionError extends RuntimeError
1299 */
1300SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1301 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001302
1303/*
1304 * NotImplementedError extends RuntimeError
1305 */
1306SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1307 "Method or function hasn't been implemented yet.");
1308
1309/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001310 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001312SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313 "Name not found globally.");
1314
1315/*
1316 * UnboundLocalError extends NameError
1317 */
1318SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1319 "Local name referenced but not bound to a value.");
1320
1321/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001322 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001323 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001324SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001325 "Attribute not found.");
1326
1327
1328/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001329 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001330 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001331
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001332/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001333static int _report_missing_parentheses(PySyntaxErrorObject *self);
1334
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335static int
1336SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1337{
1338 PyObject *info = NULL;
1339 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1340
1341 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1342 return -1;
1343
1344 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001345 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001346 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347 }
1348 if (lenargs == 2) {
1349 info = PyTuple_GET_ITEM(args, 1);
1350 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001351 if (!info)
1352 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001354 if (PyTuple_GET_SIZE(info) != 4) {
1355 /* not a very good error message, but it's what Python 2.4 gives */
1356 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1357 Py_DECREF(info);
1358 return -1;
1359 }
1360
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001361 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001362 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001363
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001364 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001365 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001367 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001368 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001369
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001370 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001371 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001372
1373 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001374
Martijn Pieters772d8092017-08-22 21:16:23 +01001375 /*
1376 * Issue #21669: Custom error for 'print' & 'exec' as statements
1377 *
1378 * Only applies to SyntaxError instances, not to subclasses such
1379 * as TabError or IndentationError (see issue #31161)
1380 */
1381 if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError &&
1382 self->text && PyUnicode_Check(self->text) &&
1383 _report_missing_parentheses(self) < 0) {
1384 return -1;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001385 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 }
1387 return 0;
1388}
1389
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001390static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391SyntaxError_clear(PySyntaxErrorObject *self)
1392{
1393 Py_CLEAR(self->msg);
1394 Py_CLEAR(self->filename);
1395 Py_CLEAR(self->lineno);
1396 Py_CLEAR(self->offset);
1397 Py_CLEAR(self->text);
1398 Py_CLEAR(self->print_file_and_line);
1399 return BaseException_clear((PyBaseExceptionObject *)self);
1400}
1401
1402static void
1403SyntaxError_dealloc(PySyntaxErrorObject *self)
1404{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001406 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001407 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001408}
1409
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001410static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001411SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1412{
1413 Py_VISIT(self->msg);
1414 Py_VISIT(self->filename);
1415 Py_VISIT(self->lineno);
1416 Py_VISIT(self->offset);
1417 Py_VISIT(self->text);
1418 Py_VISIT(self->print_file_and_line);
1419 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1420}
1421
1422/* This is called "my_basename" instead of just "basename" to avoid name
1423 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1424 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001425static PyObject*
1426my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001427{
Victor Stinner6237daf2010-04-28 17:26:19 +00001428 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001429 int kind;
1430 void *data;
1431
1432 if (PyUnicode_READY(name))
1433 return NULL;
1434 kind = PyUnicode_KIND(name);
1435 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001436 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001437 offset = 0;
1438 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001439 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001440 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001441 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001442 if (offset != 0)
1443 return PyUnicode_Substring(name, offset, size);
1444 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001445 Py_INCREF(name);
1446 return name;
1447 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001448}
1449
1450
1451static PyObject *
1452SyntaxError_str(PySyntaxErrorObject *self)
1453{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001454 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001455 PyObject *filename;
1456 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001457 /* Below, we always ignore overflow errors, just printing -1.
1458 Still, we cannot allow an OverflowError to be raised, so
1459 we need to call PyLong_AsLongAndOverflow. */
1460 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001461
1462 /* XXX -- do all the additional formatting with filename and
1463 lineno here */
1464
Neal Norwitzed2b7392007-08-26 04:51:10 +00001465 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001466 filename = my_basename(self->filename);
1467 if (filename == NULL)
1468 return NULL;
1469 } else {
1470 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001471 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001472 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001473
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001474 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001475 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001476
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001477 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001478 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001479 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001480 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001482 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001483 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001484 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001485 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001486 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001487 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001488 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001489 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001490 Py_XDECREF(filename);
1491 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001492}
1493
1494static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001495 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1496 PyDoc_STR("exception msg")},
1497 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1498 PyDoc_STR("exception filename")},
1499 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1500 PyDoc_STR("exception lineno")},
1501 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1502 PyDoc_STR("exception offset")},
1503 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1504 PyDoc_STR("exception text")},
1505 {"print_file_and_line", T_OBJECT,
1506 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1507 PyDoc_STR("exception print_file_and_line")},
1508 {NULL} /* Sentinel */
1509};
1510
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001511ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001512 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001513 SyntaxError_str, "Invalid syntax.");
1514
1515
1516/*
1517 * IndentationError extends SyntaxError
1518 */
1519MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1520 "Improper indentation.");
1521
1522
1523/*
1524 * TabError extends IndentationError
1525 */
1526MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1527 "Improper mixture of spaces and tabs.");
1528
1529
1530/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001531 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001532 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001533SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001534 "Base class for lookup errors.");
1535
1536
1537/*
1538 * IndexError extends LookupError
1539 */
1540SimpleExtendsException(PyExc_LookupError, IndexError,
1541 "Sequence index out of range.");
1542
1543
1544/*
1545 * KeyError extends LookupError
1546 */
1547static PyObject *
1548KeyError_str(PyBaseExceptionObject *self)
1549{
1550 /* If args is a tuple of exactly one item, apply repr to args[0].
1551 This is done so that e.g. the exception raised by {}[''] prints
1552 KeyError: ''
1553 rather than the confusing
1554 KeyError
1555 alone. The downside is that if KeyError is raised with an explanatory
1556 string, that string will be displayed in quotes. Too bad.
1557 If args is anything else, use the default BaseException__str__().
1558 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001559 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001560 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561 }
1562 return BaseException_str(self);
1563}
1564
1565ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001566 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001567
1568
1569/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001570 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001571 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001572SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001573 "Inappropriate argument value (of correct type).");
1574
1575/*
1576 * UnicodeError extends ValueError
1577 */
1578
1579SimpleExtendsException(PyExc_ValueError, UnicodeError,
1580 "Unicode related error.");
1581
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001583get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001584{
1585 if (!attr) {
1586 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1587 return NULL;
1588 }
1589
Christian Heimes72b710a2008-05-26 13:28:38 +00001590 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001591 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1592 return NULL;
1593 }
1594 Py_INCREF(attr);
1595 return attr;
1596}
1597
1598static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001599get_unicode(PyObject *attr, const char *name)
1600{
1601 if (!attr) {
1602 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1603 return NULL;
1604 }
1605
1606 if (!PyUnicode_Check(attr)) {
1607 PyErr_Format(PyExc_TypeError,
1608 "%.200s attribute must be unicode", name);
1609 return NULL;
1610 }
1611 Py_INCREF(attr);
1612 return attr;
1613}
1614
Walter Dörwaldd2034312007-05-18 16:29:38 +00001615static int
1616set_unicodefromstring(PyObject **attr, const char *value)
1617{
1618 PyObject *obj = PyUnicode_FromString(value);
1619 if (!obj)
1620 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001621 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001622 return 0;
1623}
1624
Thomas Wouters477c8d52006-05-27 19:21:47 +00001625PyObject *
1626PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1627{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001628 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629}
1630
1631PyObject *
1632PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1633{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001634 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001635}
1636
1637PyObject *
1638PyUnicodeEncodeError_GetObject(PyObject *exc)
1639{
1640 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1641}
1642
1643PyObject *
1644PyUnicodeDecodeError_GetObject(PyObject *exc)
1645{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001646 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001647}
1648
1649PyObject *
1650PyUnicodeTranslateError_GetObject(PyObject *exc)
1651{
1652 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1653}
1654
1655int
1656PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1657{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001658 Py_ssize_t size;
1659 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1660 "object");
1661 if (!obj)
1662 return -1;
1663 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001664 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001665 if (*start<0)
1666 *start = 0; /*XXX check for values <0*/
1667 if (*start>=size)
1668 *start = size-1;
1669 Py_DECREF(obj);
1670 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001671}
1672
1673
1674int
1675PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1676{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001677 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001678 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001679 if (!obj)
1680 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001681 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001682 *start = ((PyUnicodeErrorObject *)exc)->start;
1683 if (*start<0)
1684 *start = 0;
1685 if (*start>=size)
1686 *start = size-1;
1687 Py_DECREF(obj);
1688 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001689}
1690
1691
1692int
1693PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1694{
1695 return PyUnicodeEncodeError_GetStart(exc, start);
1696}
1697
1698
1699int
1700PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1701{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001702 ((PyUnicodeErrorObject *)exc)->start = start;
1703 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704}
1705
1706
1707int
1708PyUnicodeDecodeError_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
1716PyUnicodeTranslateError_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
1724PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1725{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001726 Py_ssize_t size;
1727 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1728 "object");
1729 if (!obj)
1730 return -1;
1731 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001732 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001733 if (*end<1)
1734 *end = 1;
1735 if (*end>size)
1736 *end = size;
1737 Py_DECREF(obj);
1738 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001739}
1740
1741
1742int
1743PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1744{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001745 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001746 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001747 if (!obj)
1748 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001749 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001750 *end = ((PyUnicodeErrorObject *)exc)->end;
1751 if (*end<1)
1752 *end = 1;
1753 if (*end>size)
1754 *end = size;
1755 Py_DECREF(obj);
1756 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001757}
1758
1759
1760int
1761PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1762{
1763 return PyUnicodeEncodeError_GetEnd(exc, start);
1764}
1765
1766
1767int
1768PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1769{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001770 ((PyUnicodeErrorObject *)exc)->end = end;
1771 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772}
1773
1774
1775int
1776PyUnicodeDecodeError_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
1784PyUnicodeTranslateError_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
1790PyObject *
1791PyUnicodeEncodeError_GetReason(PyObject *exc)
1792{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001793 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001794}
1795
1796
1797PyObject *
1798PyUnicodeDecodeError_GetReason(PyObject *exc)
1799{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001800 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001801}
1802
1803
1804PyObject *
1805PyUnicodeTranslateError_GetReason(PyObject *exc)
1806{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001807 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808}
1809
1810
1811int
1812PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1813{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001814 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1815 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816}
1817
1818
1819int
1820PyUnicodeDecodeError_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
1828PyUnicodeTranslateError_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
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836UnicodeError_clear(PyUnicodeErrorObject *self)
1837{
1838 Py_CLEAR(self->encoding);
1839 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001840 Py_CLEAR(self->reason);
1841 return BaseException_clear((PyBaseExceptionObject *)self);
1842}
1843
1844static void
1845UnicodeError_dealloc(PyUnicodeErrorObject *self)
1846{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001847 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001849 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001850}
1851
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001852static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1854{
1855 Py_VISIT(self->encoding);
1856 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001857 Py_VISIT(self->reason);
1858 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1859}
1860
1861static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001862 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1863 PyDoc_STR("exception encoding")},
1864 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1865 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001866 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001867 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001868 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001869 PyDoc_STR("exception end")},
1870 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1871 PyDoc_STR("exception reason")},
1872 {NULL} /* Sentinel */
1873};
1874
1875
1876/*
1877 * UnicodeEncodeError extends UnicodeError
1878 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001879
1880static int
1881UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1882{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001883 PyUnicodeErrorObject *err;
1884
Thomas Wouters477c8d52006-05-27 19:21:47 +00001885 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1886 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001887
1888 err = (PyUnicodeErrorObject *)self;
1889
1890 Py_CLEAR(err->encoding);
1891 Py_CLEAR(err->object);
1892 Py_CLEAR(err->reason);
1893
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001894 if (!PyArg_ParseTuple(args, "UUnnU",
1895 &err->encoding, &err->object,
1896 &err->start, &err->end, &err->reason)) {
1897 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001898 return -1;
1899 }
1900
Guido van Rossum98297ee2007-11-06 21:34:58 +00001901 Py_INCREF(err->encoding);
1902 Py_INCREF(err->object);
1903 Py_INCREF(err->reason);
1904
1905 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001906}
1907
1908static PyObject *
1909UnicodeEncodeError_str(PyObject *self)
1910{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001911 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001912 PyObject *result = NULL;
1913 PyObject *reason_str = NULL;
1914 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001915
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001916 if (!uself->object)
1917 /* Not properly initialized. */
1918 return PyUnicode_FromString("");
1919
Eric Smith0facd772010-02-24 15:42:29 +00001920 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001921 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001922 reason_str = PyObject_Str(uself->reason);
1923 if (reason_str == NULL)
1924 goto done;
1925 encoding_str = PyObject_Str(uself->encoding);
1926 if (encoding_str == NULL)
1927 goto done;
1928
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001929 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1930 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001931 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001932 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001933 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001934 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001935 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001936 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001937 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001938 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001939 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001940 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001941 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001942 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001943 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944 }
Eric Smith0facd772010-02-24 15:42:29 +00001945 else {
1946 result = PyUnicode_FromFormat(
1947 "'%U' codec can't encode characters in position %zd-%zd: %U",
1948 encoding_str,
1949 uself->start,
1950 uself->end-1,
1951 reason_str);
1952 }
1953done:
1954 Py_XDECREF(reason_str);
1955 Py_XDECREF(encoding_str);
1956 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957}
1958
1959static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001960 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001961 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962 sizeof(PyUnicodeErrorObject), 0,
1963 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1964 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1965 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001966 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1967 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001969 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970};
1971PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1972
1973PyObject *
1974PyUnicodeEncodeError_Create(
1975 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1976 Py_ssize_t start, Py_ssize_t end, const char *reason)
1977{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001978 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001979 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001980}
1981
1982
1983/*
1984 * UnicodeDecodeError extends UnicodeError
1985 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001986
1987static int
1988UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1989{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001990 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001991
Thomas Wouters477c8d52006-05-27 19:21:47 +00001992 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1993 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001994
1995 ude = (PyUnicodeErrorObject *)self;
1996
1997 Py_CLEAR(ude->encoding);
1998 Py_CLEAR(ude->object);
1999 Py_CLEAR(ude->reason);
2000
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002001 if (!PyArg_ParseTuple(args, "UOnnU",
2002 &ude->encoding, &ude->object,
2003 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002004 ude->encoding = ude->object = ude->reason = NULL;
2005 return -1;
2006 }
2007
Guido van Rossum98297ee2007-11-06 21:34:58 +00002008 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002009 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002010 Py_INCREF(ude->reason);
2011
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002012 if (!PyBytes_Check(ude->object)) {
2013 Py_buffer view;
2014 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
2015 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03002016 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002017 PyBuffer_Release(&view);
2018 if (!ude->object)
2019 goto error;
2020 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002021 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002022
2023error:
2024 Py_CLEAR(ude->encoding);
2025 Py_CLEAR(ude->object);
2026 Py_CLEAR(ude->reason);
2027 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028}
2029
2030static PyObject *
2031UnicodeDecodeError_str(PyObject *self)
2032{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002033 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002034 PyObject *result = NULL;
2035 PyObject *reason_str = NULL;
2036 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002037
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002038 if (!uself->object)
2039 /* Not properly initialized. */
2040 return PyUnicode_FromString("");
2041
Eric Smith0facd772010-02-24 15:42:29 +00002042 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00002043 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002044 reason_str = PyObject_Str(uself->reason);
2045 if (reason_str == NULL)
2046 goto done;
2047 encoding_str = PyObject_Str(uself->encoding);
2048 if (encoding_str == NULL)
2049 goto done;
2050
2051 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002052 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00002053 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002054 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00002055 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002056 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002057 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002058 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002059 }
Eric Smith0facd772010-02-24 15:42:29 +00002060 else {
2061 result = PyUnicode_FromFormat(
2062 "'%U' codec can't decode bytes in position %zd-%zd: %U",
2063 encoding_str,
2064 uself->start,
2065 uself->end-1,
2066 reason_str
2067 );
2068 }
2069done:
2070 Py_XDECREF(reason_str);
2071 Py_XDECREF(encoding_str);
2072 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002073}
2074
2075static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002076 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002077 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002078 sizeof(PyUnicodeErrorObject), 0,
2079 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2080 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2081 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002082 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2083 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002084 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002085 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002086};
2087PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2088
2089PyObject *
2090PyUnicodeDecodeError_Create(
2091 const char *encoding, const char *object, Py_ssize_t length,
2092 Py_ssize_t start, Py_ssize_t end, const char *reason)
2093{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002094 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002095 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002096}
2097
2098
2099/*
2100 * UnicodeTranslateError extends UnicodeError
2101 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002102
2103static int
2104UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2105 PyObject *kwds)
2106{
2107 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2108 return -1;
2109
2110 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002111 Py_CLEAR(self->reason);
2112
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002113 if (!PyArg_ParseTuple(args, "UnnU",
2114 &self->object,
2115 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002116 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002117 return -1;
2118 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002119
Thomas Wouters477c8d52006-05-27 19:21:47 +00002120 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002121 Py_INCREF(self->reason);
2122
2123 return 0;
2124}
2125
2126
2127static PyObject *
2128UnicodeTranslateError_str(PyObject *self)
2129{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002130 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002131 PyObject *result = NULL;
2132 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002133
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002134 if (!uself->object)
2135 /* Not properly initialized. */
2136 return PyUnicode_FromString("");
2137
Eric Smith0facd772010-02-24 15:42:29 +00002138 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002139 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002140 reason_str = PyObject_Str(uself->reason);
2141 if (reason_str == NULL)
2142 goto done;
2143
Victor Stinner53b33e72011-11-21 01:17:27 +01002144 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2145 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002146 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002147 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002148 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002149 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002150 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002151 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002152 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002153 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002154 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002155 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002156 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002157 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002158 );
Eric Smith0facd772010-02-24 15:42:29 +00002159 } else {
2160 result = PyUnicode_FromFormat(
2161 "can't translate characters in position %zd-%zd: %U",
2162 uself->start,
2163 uself->end-1,
2164 reason_str
2165 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002166 }
Eric Smith0facd772010-02-24 15:42:29 +00002167done:
2168 Py_XDECREF(reason_str);
2169 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002170}
2171
2172static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002173 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002174 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002175 sizeof(PyUnicodeErrorObject), 0,
2176 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2177 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2178 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002179 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002180 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2181 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002182 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002183};
2184PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2185
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002186/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002187PyObject *
2188PyUnicodeTranslateError_Create(
2189 const Py_UNICODE *object, Py_ssize_t length,
2190 Py_ssize_t start, Py_ssize_t end, const char *reason)
2191{
2192 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002193 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002194}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002195
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002196PyObject *
2197_PyUnicodeTranslateError_Create(
2198 PyObject *object,
2199 Py_ssize_t start, Py_ssize_t end, const char *reason)
2200{
Victor Stinner69598d42014-04-04 20:59:44 +02002201 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002202 object, start, end, reason);
2203}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002204
2205/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002206 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002207 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002208SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002209 "Assertion failed.");
2210
2211
2212/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002213 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002214 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002215SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002216 "Base class for arithmetic errors.");
2217
2218
2219/*
2220 * FloatingPointError extends ArithmeticError
2221 */
2222SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2223 "Floating point operation failed.");
2224
2225
2226/*
2227 * OverflowError extends ArithmeticError
2228 */
2229SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2230 "Result too large to be represented.");
2231
2232
2233/*
2234 * ZeroDivisionError extends ArithmeticError
2235 */
2236SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2237 "Second argument to a division or modulo operation was zero.");
2238
2239
2240/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002241 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002242 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002243SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002244 "Internal error in the Python interpreter.\n"
2245 "\n"
2246 "Please report this to the Python maintainer, along with the traceback,\n"
2247 "the Python version, and the hardware/OS platform and version.");
2248
2249
2250/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002251 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002252 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002253SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002254 "Weak ref proxy used after referent went away.");
2255
2256
2257/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002258 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002259 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002260
2261#define MEMERRORS_SAVE 16
2262static PyBaseExceptionObject *memerrors_freelist = NULL;
2263static int memerrors_numfree = 0;
2264
2265static PyObject *
2266MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2267{
2268 PyBaseExceptionObject *self;
2269
2270 if (type != (PyTypeObject *) PyExc_MemoryError)
2271 return BaseException_new(type, args, kwds);
2272 if (memerrors_freelist == NULL)
2273 return BaseException_new(type, args, kwds);
2274 /* Fetch object from freelist and revive it */
2275 self = memerrors_freelist;
2276 self->args = PyTuple_New(0);
2277 /* This shouldn't happen since the empty tuple is persistent */
2278 if (self->args == NULL)
2279 return NULL;
2280 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2281 memerrors_numfree--;
2282 self->dict = NULL;
2283 _Py_NewReference((PyObject *)self);
2284 _PyObject_GC_TRACK(self);
2285 return (PyObject *)self;
2286}
2287
2288static void
2289MemoryError_dealloc(PyBaseExceptionObject *self)
2290{
2291 _PyObject_GC_UNTRACK(self);
2292 BaseException_clear(self);
2293 if (memerrors_numfree >= MEMERRORS_SAVE)
2294 Py_TYPE(self)->tp_free((PyObject *)self);
2295 else {
2296 self->dict = (PyObject *) memerrors_freelist;
2297 memerrors_freelist = self;
2298 memerrors_numfree++;
2299 }
2300}
2301
2302static void
2303preallocate_memerrors(void)
2304{
2305 /* We create enough MemoryErrors and then decref them, which will fill
2306 up the freelist. */
2307 int i;
2308 PyObject *errors[MEMERRORS_SAVE];
2309 for (i = 0; i < MEMERRORS_SAVE; i++) {
2310 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2311 NULL, NULL);
2312 if (!errors[i])
2313 Py_FatalError("Could not preallocate MemoryError object");
2314 }
2315 for (i = 0; i < MEMERRORS_SAVE; i++) {
2316 Py_DECREF(errors[i]);
2317 }
2318}
2319
2320static void
2321free_preallocated_memerrors(void)
2322{
2323 while (memerrors_freelist != NULL) {
2324 PyObject *self = (PyObject *) memerrors_freelist;
2325 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2326 Py_TYPE(self)->tp_free((PyObject *)self);
2327 }
2328}
2329
2330
2331static PyTypeObject _PyExc_MemoryError = {
2332 PyVarObject_HEAD_INIT(NULL, 0)
2333 "MemoryError",
2334 sizeof(PyBaseExceptionObject),
2335 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2336 0, 0, 0, 0, 0, 0, 0,
2337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2338 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2339 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2340 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2341 (initproc)BaseException_init, 0, MemoryError_new
2342};
2343PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2344
Thomas Wouters477c8d52006-05-27 19:21:47 +00002345
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002346/*
2347 * BufferError extends Exception
2348 */
2349SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2350
Thomas Wouters477c8d52006-05-27 19:21:47 +00002351
2352/* Warning category docstrings */
2353
2354/*
2355 * Warning extends Exception
2356 */
2357SimpleExtendsException(PyExc_Exception, Warning,
2358 "Base class for warning categories.");
2359
2360
2361/*
2362 * UserWarning extends Warning
2363 */
2364SimpleExtendsException(PyExc_Warning, UserWarning,
2365 "Base class for warnings generated by user code.");
2366
2367
2368/*
2369 * DeprecationWarning extends Warning
2370 */
2371SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2372 "Base class for warnings about deprecated features.");
2373
2374
2375/*
2376 * PendingDeprecationWarning extends Warning
2377 */
2378SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2379 "Base class for warnings about features which will be deprecated\n"
2380 "in the future.");
2381
2382
2383/*
2384 * SyntaxWarning extends Warning
2385 */
2386SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2387 "Base class for warnings about dubious syntax.");
2388
2389
2390/*
2391 * RuntimeWarning extends Warning
2392 */
2393SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2394 "Base class for warnings about dubious runtime behavior.");
2395
2396
2397/*
2398 * FutureWarning extends Warning
2399 */
2400SimpleExtendsException(PyExc_Warning, FutureWarning,
2401 "Base class for warnings about constructs that will change semantically\n"
2402 "in the future.");
2403
2404
2405/*
2406 * ImportWarning extends Warning
2407 */
2408SimpleExtendsException(PyExc_Warning, ImportWarning,
2409 "Base class for warnings about probable mistakes in module imports");
2410
2411
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002412/*
2413 * UnicodeWarning extends Warning
2414 */
2415SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2416 "Base class for warnings about Unicode related problems, mostly\n"
2417 "related to conversion problems.");
2418
Georg Brandl08be72d2010-10-24 15:11:22 +00002419
Guido van Rossum98297ee2007-11-06 21:34:58 +00002420/*
2421 * BytesWarning extends Warning
2422 */
2423SimpleExtendsException(PyExc_Warning, BytesWarning,
2424 "Base class for warnings about bytes and buffer related problems, mostly\n"
2425 "related to conversion from str or comparing to str.");
2426
2427
Georg Brandl08be72d2010-10-24 15:11:22 +00002428/*
2429 * ResourceWarning extends Warning
2430 */
2431SimpleExtendsException(PyExc_Warning, ResourceWarning,
2432 "Base class for warnings about resource usage.");
2433
2434
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002435
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002436#define PRE_INIT(TYPE) \
2437 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2438 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2439 Py_FatalError("exceptions bootstrapping error."); \
2440 Py_INCREF(PyExc_ ## TYPE); \
2441 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002442
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002443#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002444 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2445 Py_FatalError("Module dictionary insertion problem.");
2446
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002447#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002448 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002449 PyExc_ ## NAME = PyExc_ ## TYPE; \
2450 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2451 Py_FatalError("Module dictionary insertion problem.");
2452
2453#define ADD_ERRNO(TYPE, CODE) { \
2454 PyObject *_code = PyLong_FromLong(CODE); \
2455 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2456 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2457 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002458 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002459 }
2460
2461#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002462#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002463/* The following constants were added to errno.h in VS2010 but have
2464 preferred WSA equivalents. */
2465#undef EADDRINUSE
2466#undef EADDRNOTAVAIL
2467#undef EAFNOSUPPORT
2468#undef EALREADY
2469#undef ECONNABORTED
2470#undef ECONNREFUSED
2471#undef ECONNRESET
2472#undef EDESTADDRREQ
2473#undef EHOSTUNREACH
2474#undef EINPROGRESS
2475#undef EISCONN
2476#undef ELOOP
2477#undef EMSGSIZE
2478#undef ENETDOWN
2479#undef ENETRESET
2480#undef ENETUNREACH
2481#undef ENOBUFS
2482#undef ENOPROTOOPT
2483#undef ENOTCONN
2484#undef ENOTSOCK
2485#undef EOPNOTSUPP
2486#undef EPROTONOSUPPORT
2487#undef EPROTOTYPE
2488#undef ETIMEDOUT
2489#undef EWOULDBLOCK
2490
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002491#if defined(WSAEALREADY) && !defined(EALREADY)
2492#define EALREADY WSAEALREADY
2493#endif
2494#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2495#define ECONNABORTED WSAECONNABORTED
2496#endif
2497#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2498#define ECONNREFUSED WSAECONNREFUSED
2499#endif
2500#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2501#define ECONNRESET WSAECONNRESET
2502#endif
2503#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2504#define EINPROGRESS WSAEINPROGRESS
2505#endif
2506#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2507#define ESHUTDOWN WSAESHUTDOWN
2508#endif
2509#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2510#define ETIMEDOUT WSAETIMEDOUT
2511#endif
2512#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2513#define EWOULDBLOCK WSAEWOULDBLOCK
2514#endif
2515#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002516
Martin v. Löwis1a214512008-06-11 05:26:20 +00002517void
Brett Cannonfd074152012-04-14 14:10:13 -04002518_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002519{
Brett Cannonfd074152012-04-14 14:10:13 -04002520 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002521
2522 PRE_INIT(BaseException)
2523 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002524 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002525 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526 PRE_INIT(StopIteration)
2527 PRE_INIT(GeneratorExit)
2528 PRE_INIT(SystemExit)
2529 PRE_INIT(KeyboardInterrupt)
2530 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002531 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002533 PRE_INIT(EOFError)
2534 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002535 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536 PRE_INIT(NotImplementedError)
2537 PRE_INIT(NameError)
2538 PRE_INIT(UnboundLocalError)
2539 PRE_INIT(AttributeError)
2540 PRE_INIT(SyntaxError)
2541 PRE_INIT(IndentationError)
2542 PRE_INIT(TabError)
2543 PRE_INIT(LookupError)
2544 PRE_INIT(IndexError)
2545 PRE_INIT(KeyError)
2546 PRE_INIT(ValueError)
2547 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002548 PRE_INIT(UnicodeEncodeError)
2549 PRE_INIT(UnicodeDecodeError)
2550 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002551 PRE_INIT(AssertionError)
2552 PRE_INIT(ArithmeticError)
2553 PRE_INIT(FloatingPointError)
2554 PRE_INIT(OverflowError)
2555 PRE_INIT(ZeroDivisionError)
2556 PRE_INIT(SystemError)
2557 PRE_INIT(ReferenceError)
2558 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002559 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560 PRE_INIT(Warning)
2561 PRE_INIT(UserWarning)
2562 PRE_INIT(DeprecationWarning)
2563 PRE_INIT(PendingDeprecationWarning)
2564 PRE_INIT(SyntaxWarning)
2565 PRE_INIT(RuntimeWarning)
2566 PRE_INIT(FutureWarning)
2567 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002568 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002569 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002570 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002571
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002572 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002573 PRE_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002574
Louie Luc4318542017-03-29 13:28:15 +08002575 PRE_INIT(BlockingIOError)
2576 PRE_INIT(BrokenPipeError)
2577 PRE_INIT(ChildProcessError)
2578 PRE_INIT(ConnectionAbortedError)
2579 PRE_INIT(ConnectionRefusedError)
2580 PRE_INIT(ConnectionResetError)
2581 PRE_INIT(FileExistsError)
2582 PRE_INIT(FileNotFoundError)
2583 PRE_INIT(IsADirectoryError)
2584 PRE_INIT(NotADirectoryError)
2585 PRE_INIT(InterruptedError)
2586 PRE_INIT(PermissionError)
2587 PRE_INIT(ProcessLookupError)
2588 PRE_INIT(TimeoutError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002589
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590 bdict = PyModule_GetDict(bltinmod);
2591 if (bdict == NULL)
2592 Py_FatalError("exceptions bootstrapping error.");
2593
2594 POST_INIT(BaseException)
2595 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002596 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002597 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002598 POST_INIT(StopIteration)
2599 POST_INIT(GeneratorExit)
2600 POST_INIT(SystemExit)
2601 POST_INIT(KeyboardInterrupt)
2602 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002603 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002604 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002605 INIT_ALIAS(EnvironmentError, OSError)
2606 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002607#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002608 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002610 POST_INIT(EOFError)
2611 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002612 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613 POST_INIT(NotImplementedError)
2614 POST_INIT(NameError)
2615 POST_INIT(UnboundLocalError)
2616 POST_INIT(AttributeError)
2617 POST_INIT(SyntaxError)
2618 POST_INIT(IndentationError)
2619 POST_INIT(TabError)
2620 POST_INIT(LookupError)
2621 POST_INIT(IndexError)
2622 POST_INIT(KeyError)
2623 POST_INIT(ValueError)
2624 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002625 POST_INIT(UnicodeEncodeError)
2626 POST_INIT(UnicodeDecodeError)
2627 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002628 POST_INIT(AssertionError)
2629 POST_INIT(ArithmeticError)
2630 POST_INIT(FloatingPointError)
2631 POST_INIT(OverflowError)
2632 POST_INIT(ZeroDivisionError)
2633 POST_INIT(SystemError)
2634 POST_INIT(ReferenceError)
2635 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002636 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002637 POST_INIT(Warning)
2638 POST_INIT(UserWarning)
2639 POST_INIT(DeprecationWarning)
2640 POST_INIT(PendingDeprecationWarning)
2641 POST_INIT(SyntaxWarning)
2642 POST_INIT(RuntimeWarning)
2643 POST_INIT(FutureWarning)
2644 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002645 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002646 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002647 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002648
Antoine Pitrouac456a12012-01-18 21:35:21 +01002649 if (!errnomap) {
2650 errnomap = PyDict_New();
2651 if (!errnomap)
2652 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2653 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002654
2655 /* OSError subclasses */
Louie Luc4318542017-03-29 13:28:15 +08002656 POST_INIT(ConnectionError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002657
Louie Luc4318542017-03-29 13:28:15 +08002658 POST_INIT(BlockingIOError)
2659 ADD_ERRNO(BlockingIOError, EAGAIN)
2660 ADD_ERRNO(BlockingIOError, EALREADY)
2661 ADD_ERRNO(BlockingIOError, EINPROGRESS)
2662 ADD_ERRNO(BlockingIOError, EWOULDBLOCK)
2663 POST_INIT(BrokenPipeError)
2664 ADD_ERRNO(BrokenPipeError, EPIPE)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002665#ifdef ESHUTDOWN
Louie Luc4318542017-03-29 13:28:15 +08002666 ADD_ERRNO(BrokenPipeError, ESHUTDOWN)
Berker Peksaga787e5f2016-07-30 14:14:12 +03002667#endif
Louie Luc4318542017-03-29 13:28:15 +08002668 POST_INIT(ChildProcessError)
2669 ADD_ERRNO(ChildProcessError, ECHILD)
2670 POST_INIT(ConnectionAbortedError)
2671 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED)
2672 POST_INIT(ConnectionRefusedError)
2673 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED)
2674 POST_INIT(ConnectionResetError)
2675 ADD_ERRNO(ConnectionResetError, ECONNRESET)
2676 POST_INIT(FileExistsError)
2677 ADD_ERRNO(FileExistsError, EEXIST)
2678 POST_INIT(FileNotFoundError)
2679 ADD_ERRNO(FileNotFoundError, ENOENT)
2680 POST_INIT(IsADirectoryError)
2681 ADD_ERRNO(IsADirectoryError, EISDIR)
2682 POST_INIT(NotADirectoryError)
2683 ADD_ERRNO(NotADirectoryError, ENOTDIR)
2684 POST_INIT(InterruptedError)
2685 ADD_ERRNO(InterruptedError, EINTR)
2686 POST_INIT(PermissionError)
2687 ADD_ERRNO(PermissionError, EACCES)
2688 ADD_ERRNO(PermissionError, EPERM)
2689 POST_INIT(ProcessLookupError)
2690 ADD_ERRNO(ProcessLookupError, ESRCH)
2691 POST_INIT(TimeoutError)
2692 ADD_ERRNO(TimeoutError, ETIMEDOUT)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002693
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002694 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002695}
2696
2697void
2698_PyExc_Fini(void)
2699{
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002700 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002701 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002702}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002703
2704/* Helper to do the equivalent of "raise X from Y" in C, but always using
2705 * the current exception rather than passing one in.
2706 *
2707 * We currently limit this to *only* exceptions that use the BaseException
2708 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2709 * those correctly without losing data and without losing backwards
2710 * compatibility.
2711 *
2712 * We also aim to rule out *all* exceptions that might be storing additional
2713 * state, whether by having a size difference relative to BaseException,
2714 * additional arguments passed in during construction or by having a
2715 * non-empty instance dict.
2716 *
2717 * We need to be very careful with what we wrap, since changing types to
2718 * a broader exception type would be backwards incompatible for
2719 * existing codecs, and with different init or new method implementations
2720 * may either not support instantiation with PyErr_Format or lose
2721 * information when instantiated that way.
2722 *
2723 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2724 * fact that exceptions are expected to support pickling. If more builtin
2725 * exceptions (e.g. AttributeError) start to be converted to rich
2726 * exceptions with additional attributes, that's probably a better approach
2727 * to pursue over adding special cases for particular stateful subclasses.
2728 *
2729 * Returns a borrowed reference to the new exception (if any), NULL if the
2730 * existing exception was left in place.
2731 */
2732PyObject *
2733_PyErr_TrySetFromCause(const char *format, ...)
2734{
2735 PyObject* msg_prefix;
2736 PyObject *exc, *val, *tb;
2737 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002738 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002739 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002740 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002741 PyObject *new_exc, *new_val, *new_tb;
2742 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002743 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002744
Nick Coghlan8b097b42013-11-13 23:49:21 +10002745 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002746 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002747 /* Ensure type info indicates no extra state is stored at the C level
2748 * and that the type can be reinstantiated using PyErr_Format
2749 */
2750 caught_type_size = caught_type->tp_basicsize;
2751 base_exc_size = _PyExc_BaseException.tp_basicsize;
2752 same_basic_size = (
2753 caught_type_size == base_exc_size ||
2754 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002755 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002756 )
2757 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002758 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002759 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002760 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002761 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002762 /* We can't be sure we can wrap this safely, since it may contain
2763 * more state than just the exception type. Accordingly, we just
2764 * leave it alone.
2765 */
2766 PyErr_Restore(exc, val, tb);
2767 return NULL;
2768 }
2769
2770 /* Check the args are empty or contain a single string */
2771 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002772 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002773 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002774 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002775 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002776 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002777 /* More than 1 arg, or the one arg we do have isn't a string
2778 */
2779 PyErr_Restore(exc, val, tb);
2780 return NULL;
2781 }
2782
2783 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002784 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002785 if (dictptr != NULL && *dictptr != NULL &&
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002786 PyDict_GET_SIZE(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002787 /* While we could potentially copy a non-empty instance dictionary
2788 * to the replacement exception, for now we take the more
2789 * conservative path of leaving exceptions with attributes set
2790 * alone.
2791 */
2792 PyErr_Restore(exc, val, tb);
2793 return NULL;
2794 }
2795
2796 /* For exceptions that we can wrap safely, we chain the original
2797 * exception to a new one of the exact same type with an
2798 * error message that mentions the additional details and the
2799 * original exception.
2800 *
2801 * It would be nice to wrap OSError and various other exception
2802 * types as well, but that's quite a bit trickier due to the extra
2803 * state potentially stored on OSError instances.
2804 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002805 /* Ensure the traceback is set correctly on the existing exception */
2806 if (tb != NULL) {
2807 PyException_SetTraceback(val, tb);
2808 Py_DECREF(tb);
2809 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002810
Christian Heimes507eabd2013-11-14 01:39:35 +01002811#ifdef HAVE_STDARG_PROTOTYPES
2812 va_start(vargs, format);
2813#else
2814 va_start(vargs);
2815#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002816 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002817 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002818 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002819 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002820 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002821 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002822 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002823
2824 PyErr_Format(exc, "%U (%s: %S)",
2825 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002826 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002827 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002828 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2829 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2830 PyException_SetCause(new_val, val);
2831 PyErr_Restore(new_exc, new_val, new_tb);
2832 return new_val;
2833}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002834
2835
2836/* To help with migration from Python 2, SyntaxError.__init__ applies some
2837 * heuristics to try to report a more meaningful exception when print and
2838 * exec are used like statements.
2839 *
2840 * The heuristics are currently expected to detect the following cases:
2841 * - top level statement
2842 * - statement in a nested suite
2843 * - trailing section of a one line complex statement
2844 *
2845 * They're currently known not to trigger:
2846 * - after a semi-colon
2847 *
2848 * The error message can be a bit odd in cases where the "arguments" are
2849 * completely illegal syntactically, but that isn't worth the hassle of
2850 * fixing.
2851 *
2852 * We also can't do anything about cases that are legal Python 3 syntax
2853 * but mean something entirely different from what they did in Python 2
2854 * (omitting the arguments entirely, printing items preceded by a unary plus
2855 * or minus, using the stream redirection syntax).
2856 */
2857
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302858
2859// Static helper for setting legacy print error message
2860static int
2861_set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
2862{
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302863 // PRINT_OFFSET is to remove the `print ` prefix from the data.
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302864 const int PRINT_OFFSET = 6;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302865 const int STRIP_BOTH = 2;
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302866 Py_ssize_t start_pos = start + PRINT_OFFSET;
2867 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2868 Py_UCS4 semicolon = ';';
2869 Py_ssize_t end_pos = PyUnicode_FindChar(self->text, semicolon,
2870 start_pos, text_len, 1);
2871 if (end_pos < -1) {
2872 return -1;
2873 } else if (end_pos == -1) {
2874 end_pos = text_len;
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302875 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302876
2877 PyObject *data = PyUnicode_Substring(self->text, start_pos, end_pos);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302878 if (data == NULL) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302879 return -1;
2880 }
Nitish Chandra43c0f1a2018-01-28 16:26:02 +05302881
2882 PyObject *strip_sep_obj = PyUnicode_FromString(" \t\r\n");
2883 if (strip_sep_obj == NULL) {
2884 Py_DECREF(data);
2885 return -1;
2886 }
2887
Sanyam Khuranad57f26c2018-01-20 08:42:22 +05302888 PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302889 Py_DECREF(data);
2890 Py_DECREF(strip_sep_obj);
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302891 if (new_data == NULL) {
2892 return -1;
2893 }
2894 // gets the modified text_len after stripping `print `
2895 text_len = PyUnicode_GET_LENGTH(new_data);
2896 const char *maybe_end_arg = "";
2897 if (text_len > 0 && PyUnicode_READ_CHAR(new_data, text_len-1) == ',') {
2898 maybe_end_arg = " end=\" \"";
2899 }
2900 PyObject *error_msg = PyUnicode_FromFormat(
2901 "Missing parentheses in call to 'print'. Did you mean print(%U%s)?",
2902 new_data, maybe_end_arg
2903 );
2904 Py_DECREF(new_data);
2905 if (error_msg == NULL)
2906 return -1;
2907
2908 Py_XSETREF(self->msg, error_msg);
2909 return 1;
2910}
2911
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002912static int
2913_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2914{
2915 /* Return values:
2916 * -1: an error occurred
2917 * 0: nothing happened
2918 * 1: the check triggered & the error message was changed
2919 */
2920 static PyObject *print_prefix = NULL;
2921 static PyObject *exec_prefix = NULL;
Zackery Spytza4b48f12018-10-12 02:20:59 -06002922 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match;
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002923 int kind = PyUnicode_KIND(self->text);
2924 void *data = PyUnicode_DATA(self->text);
2925
2926 /* Ignore leading whitespace */
2927 while (start < text_len) {
2928 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2929 if (!Py_UNICODE_ISSPACE(ch))
2930 break;
2931 start++;
2932 }
2933 /* Checking against an empty or whitespace-only part of the string */
2934 if (start == text_len) {
2935 return 0;
2936 }
2937
2938 /* Check for legacy print statements */
2939 if (print_prefix == NULL) {
2940 print_prefix = PyUnicode_InternFromString("print ");
2941 if (print_prefix == NULL) {
2942 return -1;
2943 }
2944 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002945 match = PyUnicode_Tailmatch(self->text, print_prefix,
2946 start, text_len, -1);
2947 if (match == -1) {
2948 return -1;
2949 }
2950 if (match) {
Sanyam Khurana3a7f0352017-06-20 19:01:32 +05302951 return _set_legacy_print_statement_msg(self, start);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002952 }
2953
2954 /* Check for legacy exec statements */
2955 if (exec_prefix == NULL) {
2956 exec_prefix = PyUnicode_InternFromString("exec ");
2957 if (exec_prefix == NULL) {
2958 return -1;
2959 }
2960 }
Zackery Spytza4b48f12018-10-12 02:20:59 -06002961 match = PyUnicode_Tailmatch(self->text, exec_prefix, start, text_len, -1);
2962 if (match == -1) {
2963 return -1;
2964 }
2965 if (match) {
2966 PyObject *msg = PyUnicode_FromString("Missing parentheses in call "
2967 "to 'exec'");
2968 if (msg == NULL) {
2969 return -1;
2970 }
2971 Py_XSETREF(self->msg, msg);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002972 return 1;
2973 }
2974 /* Fall back to the default error message */
2975 return 0;
2976}
2977
2978static int
2979_report_missing_parentheses(PySyntaxErrorObject *self)
2980{
2981 Py_UCS4 left_paren = 40;
2982 Py_ssize_t left_paren_index;
2983 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2984 int legacy_check_result = 0;
2985
2986 /* Skip entirely if there is an opening parenthesis */
2987 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2988 0, text_len, 1);
2989 if (left_paren_index < -1) {
2990 return -1;
2991 }
2992 if (left_paren_index != -1) {
2993 /* Use default error message for any line with an opening paren */
2994 return 0;
2995 }
2996 /* Handle the simple statement case */
2997 legacy_check_result = _check_for_legacy_statements(self, 0);
2998 if (legacy_check_result < 0) {
2999 return -1;
3000
3001 }
3002 if (legacy_check_result == 0) {
3003 /* Handle the one-line complex statement case */
3004 Py_UCS4 colon = 58;
3005 Py_ssize_t colon_index;
3006 colon_index = PyUnicode_FindChar(self->text, colon,
3007 0, text_len, 1);
3008 if (colon_index < -1) {
3009 return -1;
3010 }
3011 if (colon_index >= 0 && colon_index < text_len) {
3012 /* Check again, starting from just after the colon */
3013 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
3014 return -1;
3015 }
3016 }
3017 }
3018 return 0;
3019}