blob: 1667cd9b66a87fac3063f0e068cdf0f9a5a222b1 [file] [log] [blame]
Barry Warsaw675ac282000-05-26 19:05:16 +00001/* This module provides the suite of standard class-based exceptions for
2 * Python's builtin module. This is a complete C implementation of what,
3 * in Python 1.5.2, was contained in the exceptions.py module. The problem
4 * there was that if exceptions.py could not be imported for some reason,
5 * the entire interpreter would abort.
6 *
7 * By moving the exceptions into C and statically linking, we can guarantee
8 * that the standard exceptions will always be available.
9 *
10 * history:
11 * 98-08-19 fl created (for pyexe)
12 * 00-02-08 fl updated for 1.5.2
13 * 26-May-2000 baw vetted for Python 1.6
14 *
15 * written by Fredrik Lundh
16 * modifications, additions, cleanups, and proofreading by Barry Warsaw
17 *
18 * Copyright (c) 1998-2000 by Secret Labs AB. All rights reserved.
19 */
20
21#include "Python.h"
Fred Drake185a29b2000-08-15 16:20:36 +000022#include "osdefs.h"
Barry Warsaw675ac282000-05-26 19:05:16 +000023
Tim Petersbf26e072000-07-12 04:02:10 +000024/* Caution: MS Visual C++ 6 errors if a single string literal exceeds
25 * 2Kb. So the module docstring has been broken roughly in half, using
26 * compile-time literal concatenation.
27 */
Skip Montanaro995895f2002-03-28 20:57:51 +000028
29/* NOTE: If the exception class hierarchy changes, don't forget to update
30 * Doc/lib/libexcs.tex!
31 */
32
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000033PyDoc_STRVAR(module__doc__,
Barry Warsaw675ac282000-05-26 19:05:16 +000034"Python's standard exception class hierarchy.\n\
35\n\
36Before Python 1.5, the standard exceptions were all simple string objects.\n\
37In Python 1.5, the standard exceptions were converted to classes organized\n\
38into a relatively flat hierarchy. String-based standard exceptions were\n\
39optional, or used as a fallback if some problem occurred while importing\n\
40the exception module. With Python 1.6, optional string-based standard\n\
41exceptions were removed (along with the -X command line flag).\n\
42\n\
43The class exceptions were implemented in such a way as to be almost\n\
44completely backward compatible. Some tricky uses of IOError could\n\
45potentially have broken, but by Python 1.6, all of these should have\n\
46been fixed. As of Python 1.6, the class-based standard exceptions are\n\
47now implemented in C, and are guaranteed to exist in the Python\n\
48interpreter.\n\
49\n\
50Here is a rundown of the class hierarchy. The classes found here are\n\
51inserted into both the exceptions module and the `built-in' module. It is\n\
52recommended that user defined class based exceptions be derived from the\n\
Tim Petersbf26e072000-07-12 04:02:10 +000053`Exception' class, although this is currently not enforced.\n"
54 /* keep string pieces "small" */
55"\n\
Barry Warsaw675ac282000-05-26 19:05:16 +000056Exception\n\
57 |\n\
58 +-- SystemExit\n\
Guido van Rossum59d1d2b2001-04-20 19:13:02 +000059 +-- StopIteration\n\
Barry Warsaw675ac282000-05-26 19:05:16 +000060 +-- StandardError\n\
Barry Warsaw9667ed22001-01-23 16:08:34 +000061 | |\n\
62 | +-- KeyboardInterrupt\n\
63 | +-- ImportError\n\
64 | +-- EnvironmentError\n\
65 | | |\n\
66 | | +-- IOError\n\
67 | | +-- OSError\n\
68 | | |\n\
69 | | +-- WindowsError\n\
70 | |\n\
71 | +-- EOFError\n\
72 | +-- RuntimeError\n\
73 | | |\n\
74 | | +-- NotImplementedError\n\
75 | |\n\
76 | +-- NameError\n\
77 | | |\n\
78 | | +-- UnboundLocalError\n\
79 | |\n\
80 | +-- AttributeError\n\
81 | +-- SyntaxError\n\
82 | | |\n\
83 | | +-- IndentationError\n\
84 | | |\n\
85 | | +-- TabError\n\
86 | |\n\
87 | +-- TypeError\n\
88 | +-- AssertionError\n\
89 | +-- LookupError\n\
90 | | |\n\
91 | | +-- IndexError\n\
92 | | +-- KeyError\n\
93 | |\n\
94 | +-- ArithmeticError\n\
95 | | |\n\
96 | | +-- OverflowError\n\
97 | | +-- ZeroDivisionError\n\
98 | | +-- FloatingPointError\n\
99 | |\n\
100 | +-- ValueError\n\
101 | | |\n\
102 | | +-- UnicodeError\n\
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000103 | | |\n\
104 | | +-- UnicodeEncodeError\n\
105 | | +-- UnicodeDecodeError\n\
106 | | +-- UnicodeTranslateError\n\
Barry Warsaw9667ed22001-01-23 16:08:34 +0000107 | |\n\
Fred Drakebb9fa212001-10-05 21:50:08 +0000108 | +-- ReferenceError\n\
Barry Warsaw9667ed22001-01-23 16:08:34 +0000109 | +-- SystemError\n\
110 | +-- MemoryError\n\
111 |\n\
112 +---Warning\n\
Barry Warsaw675ac282000-05-26 19:05:16 +0000113 |\n\
Barry Warsaw9667ed22001-01-23 16:08:34 +0000114 +-- UserWarning\n\
115 +-- DeprecationWarning\n\
Neal Norwitzd68f5172002-05-29 15:54:55 +0000116 +-- PendingDeprecationWarning\n\
Barry Warsaw9667ed22001-01-23 16:08:34 +0000117 +-- SyntaxWarning\n\
Guido van Rossumae347b32001-08-23 02:56:07 +0000118 +-- OverflowWarning\n\
Barry Warsaw9f007392002-08-14 15:51:29 +0000119 +-- RuntimeWarning\n\
120 +-- FutureWarning"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000121);
Barry Warsaw675ac282000-05-26 19:05:16 +0000122
123
124/* Helper function for populating a dictionary with method wrappers. */
125static int
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000126populate_methods(PyObject *klass, PyObject *dict, PyMethodDef *methods)
Barry Warsaw675ac282000-05-26 19:05:16 +0000127{
128 if (!methods)
129 return 0;
130
131 while (methods->ml_name) {
132 /* get a wrapper for the built-in function */
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000133 PyObject *func = PyCFunction_New(methods, NULL);
134 PyObject *meth;
Barry Warsaw675ac282000-05-26 19:05:16 +0000135 int status;
136
137 if (!func)
138 return -1;
139
140 /* turn the function into an unbound method */
141 if (!(meth = PyMethod_New(func, NULL, klass))) {
142 Py_DECREF(func);
143 return -1;
144 }
Barry Warsaw9667ed22001-01-23 16:08:34 +0000145
Barry Warsaw675ac282000-05-26 19:05:16 +0000146 /* add method to dictionary */
147 status = PyDict_SetItemString(dict, methods->ml_name, meth);
148 Py_DECREF(meth);
149 Py_DECREF(func);
150
151 /* stop now if an error occurred, otherwise do the next method */
152 if (status)
153 return status;
154
155 methods++;
156 }
157 return 0;
158}
159
Barry Warsaw9667ed22001-01-23 16:08:34 +0000160
Barry Warsaw675ac282000-05-26 19:05:16 +0000161
162/* This function is used to create all subsequent exception classes. */
163static int
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000164make_class(PyObject **klass, PyObject *base,
165 char *name, PyMethodDef *methods,
166 char *docstr)
Barry Warsaw675ac282000-05-26 19:05:16 +0000167{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000168 PyObject *dict = PyDict_New();
169 PyObject *str = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000170 int status = -1;
171
172 if (!dict)
173 return -1;
174
175 /* If an error occurs from here on, goto finally instead of explicitly
176 * returning NULL.
177 */
178
179 if (docstr) {
180 if (!(str = PyString_FromString(docstr)))
181 goto finally;
182 if (PyDict_SetItemString(dict, "__doc__", str))
183 goto finally;
184 }
185
186 if (!(*klass = PyErr_NewException(name, base, dict)))
187 goto finally;
188
189 if (populate_methods(*klass, dict, methods)) {
190 Py_DECREF(*klass);
191 *klass = NULL;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000192 goto finally;
Barry Warsaw675ac282000-05-26 19:05:16 +0000193 }
194
195 status = 0;
196
197 finally:
198 Py_XDECREF(dict);
199 Py_XDECREF(str);
200 return status;
201}
202
203
204/* Use this for *args signatures, otherwise just use PyArg_ParseTuple() */
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000205static PyObject *
206get_self(PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000207{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000208 PyObject *self = PyTuple_GetItem(args, 0);
Barry Warsaw675ac282000-05-26 19:05:16 +0000209 if (!self) {
Thomas Wouters7e474022000-07-16 12:04:32 +0000210 /* Watch out for being called to early in the bootstrapping process */
Barry Warsaw675ac282000-05-26 19:05:16 +0000211 if (PyExc_TypeError) {
212 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000213 "unbound method must be called with instance as first argument");
Barry Warsaw675ac282000-05-26 19:05:16 +0000214 }
215 return NULL;
216 }
217 return self;
218}
219
220
221
222/* Notes on bootstrapping the exception classes.
223 *
224 * First thing we create is the base class for all exceptions, called
225 * appropriately enough: Exception. Creation of this class makes no
Jeremy Hylton4e542a32000-06-30 04:59:59 +0000226 * assumptions about the existence of any other exception class -- except
Barry Warsaw675ac282000-05-26 19:05:16 +0000227 * for TypeError, which can conditionally exist.
228 *
229 * Next, StandardError is created (which is quite simple) followed by
230 * TypeError, because the instantiation of other exceptions can potentially
231 * throw a TypeError. Once these exceptions are created, all the others
232 * can be created in any order. See the static exctable below for the
233 * explicit bootstrap order.
234 *
235 * All classes after Exception can be created using PyErr_NewException().
236 */
237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000238PyDoc_STRVAR(Exception__doc__, "Common base class for all exceptions.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000239
240
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000241static PyObject *
242Exception__init__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000243{
244 int status;
245
246 if (!(self = get_self(args)))
247 return NULL;
248
249 /* set args attribute */
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000250 /* XXX size is only a hint */
251 args = PySequence_GetSlice(args, 1, PySequence_Size(args));
Barry Warsaw675ac282000-05-26 19:05:16 +0000252 if (!args)
253 return NULL;
254 status = PyObject_SetAttrString(self, "args", args);
255 Py_DECREF(args);
256 if (status < 0)
257 return NULL;
258
259 Py_INCREF(Py_None);
260 return Py_None;
261}
262
263
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000264static PyObject *
265Exception__str__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000266{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000267 PyObject *out;
Barry Warsaw675ac282000-05-26 19:05:16 +0000268
Fred Drake1aba5772000-08-15 15:46:16 +0000269 if (!PyArg_ParseTuple(args, "O:__str__", &self))
Barry Warsaw675ac282000-05-26 19:05:16 +0000270 return NULL;
271
272 args = PyObject_GetAttrString(self, "args");
273 if (!args)
274 return NULL;
275
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000276 switch (PySequence_Size(args)) {
Barry Warsaw675ac282000-05-26 19:05:16 +0000277 case 0:
278 out = PyString_FromString("");
279 break;
280 case 1:
Barry Warsawb7816552000-07-09 22:27:10 +0000281 {
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000282 PyObject *tmp = PySequence_GetItem(args, 0);
Barry Warsawb7816552000-07-09 22:27:10 +0000283 if (tmp) {
Barry Warsaw675ac282000-05-26 19:05:16 +0000284 out = PyObject_Str(tmp);
Barry Warsawb7816552000-07-09 22:27:10 +0000285 Py_DECREF(tmp);
286 }
287 else
288 out = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000289 break;
Barry Warsawb7816552000-07-09 22:27:10 +0000290 }
Barry Warsaw675ac282000-05-26 19:05:16 +0000291 default:
292 out = PyObject_Str(args);
293 break;
294 }
295
296 Py_DECREF(args);
297 return out;
298}
299
300
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000301static PyObject *
302Exception__getitem__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000303{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000304 PyObject *out;
305 PyObject *index;
Barry Warsaw675ac282000-05-26 19:05:16 +0000306
Fred Drake1aba5772000-08-15 15:46:16 +0000307 if (!PyArg_ParseTuple(args, "OO:__getitem__", &self, &index))
Barry Warsaw675ac282000-05-26 19:05:16 +0000308 return NULL;
309
310 args = PyObject_GetAttrString(self, "args");
311 if (!args)
312 return NULL;
313
314 out = PyObject_GetItem(args, index);
315 Py_DECREF(args);
316 return out;
317}
318
319
320static PyMethodDef
321Exception_methods[] = {
322 /* methods for the Exception class */
Jeremy Hylton4e542a32000-06-30 04:59:59 +0000323 { "__getitem__", Exception__getitem__, METH_VARARGS},
324 { "__str__", Exception__str__, METH_VARARGS},
325 { "__init__", Exception__init__, METH_VARARGS},
Barry Warsaw675ac282000-05-26 19:05:16 +0000326 { NULL, NULL }
327};
328
329
330static int
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000331make_Exception(char *modulename)
Barry Warsaw675ac282000-05-26 19:05:16 +0000332{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000333 PyObject *dict = PyDict_New();
334 PyObject *str = NULL;
335 PyObject *name = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000336 int status = -1;
337
338 if (!dict)
339 return -1;
340
341 /* If an error occurs from here on, goto finally instead of explicitly
342 * returning NULL.
343 */
344
345 if (!(str = PyString_FromString(modulename)))
346 goto finally;
347 if (PyDict_SetItemString(dict, "__module__", str))
348 goto finally;
349 Py_DECREF(str);
350 if (!(str = PyString_FromString(Exception__doc__)))
351 goto finally;
352 if (PyDict_SetItemString(dict, "__doc__", str))
353 goto finally;
354
355 if (!(name = PyString_FromString("Exception")))
356 goto finally;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000357
Barry Warsaw675ac282000-05-26 19:05:16 +0000358 if (!(PyExc_Exception = PyClass_New(NULL, dict, name)))
359 goto finally;
360
361 /* Now populate the dictionary with the method suite */
362 if (populate_methods(PyExc_Exception, dict, Exception_methods))
363 /* Don't need to reclaim PyExc_Exception here because that'll
364 * happen during interpreter shutdown.
365 */
366 goto finally;
367
368 status = 0;
369
370 finally:
371 Py_XDECREF(dict);
372 Py_XDECREF(str);
373 Py_XDECREF(name);
374 return status;
375}
376
377
378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000379PyDoc_STRVAR(StandardError__doc__,
380"Base class for all standard Python exceptions.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000382PyDoc_STRVAR(TypeError__doc__, "Inappropriate argument type.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000384PyDoc_STRVAR(StopIteration__doc__, "Signal the end from iterator.next().");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +0000385
Barry Warsaw675ac282000-05-26 19:05:16 +0000386
387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000388PyDoc_STRVAR(SystemExit__doc__, "Request to exit from the interpreter.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000389
390
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000391static PyObject *
392SystemExit__init__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000393{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000394 PyObject *code;
Barry Warsaw675ac282000-05-26 19:05:16 +0000395 int status;
396
397 if (!(self = get_self(args)))
398 return NULL;
399
400 /* Set args attribute. */
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000401 if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args))))
Barry Warsaw675ac282000-05-26 19:05:16 +0000402 return NULL;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000403
Barry Warsaw675ac282000-05-26 19:05:16 +0000404 status = PyObject_SetAttrString(self, "args", args);
405 if (status < 0) {
406 Py_DECREF(args);
407 return NULL;
408 }
409
410 /* set code attribute */
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000411 switch (PySequence_Size(args)) {
Barry Warsaw675ac282000-05-26 19:05:16 +0000412 case 0:
413 Py_INCREF(Py_None);
414 code = Py_None;
415 break;
416 case 1:
417 code = PySequence_GetItem(args, 0);
418 break;
419 default:
420 Py_INCREF(args);
421 code = args;
422 break;
423 }
424
425 status = PyObject_SetAttrString(self, "code", code);
426 Py_DECREF(code);
427 Py_DECREF(args);
428 if (status < 0)
429 return NULL;
430
431 Py_INCREF(Py_None);
432 return Py_None;
433}
434
435
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000436static PyMethodDef SystemExit_methods[] = {
Jeremy Hylton4e542a32000-06-30 04:59:59 +0000437 { "__init__", SystemExit__init__, METH_VARARGS},
Barry Warsaw675ac282000-05-26 19:05:16 +0000438 {NULL, NULL}
439};
440
441
442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000443PyDoc_STRVAR(KeyboardInterrupt__doc__, "Program interrupted by user.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000444
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000445PyDoc_STRVAR(ImportError__doc__,
446"Import can't find module, or can't find name in module.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000447
448
449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000450PyDoc_STRVAR(EnvironmentError__doc__, "Base class for I/O related errors.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000451
452
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000453static PyObject *
454EnvironmentError__init__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000455{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000456 PyObject *item0 = NULL;
457 PyObject *item1 = NULL;
458 PyObject *item2 = NULL;
459 PyObject *subslice = NULL;
460 PyObject *rtnval = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000461
462 if (!(self = get_self(args)))
463 return NULL;
464
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000465 if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args))))
Barry Warsaw675ac282000-05-26 19:05:16 +0000466 return NULL;
467
468 if (PyObject_SetAttrString(self, "args", args) ||
469 PyObject_SetAttrString(self, "errno", Py_None) ||
470 PyObject_SetAttrString(self, "strerror", Py_None) ||
471 PyObject_SetAttrString(self, "filename", Py_None))
472 {
473 goto finally;
474 }
475
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000476 switch (PySequence_Size(args)) {
Barry Warsaw675ac282000-05-26 19:05:16 +0000477 case 3:
Barry Warsaw7dfeb422000-07-09 04:56:25 +0000478 /* Where a function has a single filename, such as open() or some
479 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
480 * called, giving a third argument which is the filename. But, so
481 * that old code using in-place unpacking doesn't break, e.g.:
Barry Warsaw9667ed22001-01-23 16:08:34 +0000482 *
Barry Warsaw675ac282000-05-26 19:05:16 +0000483 * except IOError, (errno, strerror):
Barry Warsaw9667ed22001-01-23 16:08:34 +0000484 *
Barry Warsaw675ac282000-05-26 19:05:16 +0000485 * we hack args so that it only contains two items. This also
486 * means we need our own __str__() which prints out the filename
487 * when it was supplied.
488 */
489 item0 = PySequence_GetItem(args, 0);
490 item1 = PySequence_GetItem(args, 1);
491 item2 = PySequence_GetItem(args, 2);
492 if (!item0 || !item1 || !item2)
493 goto finally;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000494
Barry Warsaw675ac282000-05-26 19:05:16 +0000495 if (PyObject_SetAttrString(self, "errno", item0) ||
496 PyObject_SetAttrString(self, "strerror", item1) ||
497 PyObject_SetAttrString(self, "filename", item2))
498 {
499 goto finally;
500 }
501
502 subslice = PySequence_GetSlice(args, 0, 2);
503 if (!subslice || PyObject_SetAttrString(self, "args", subslice))
504 goto finally;
Barry Warsaw7dfeb422000-07-09 04:56:25 +0000505 break;
Barry Warsaw675ac282000-05-26 19:05:16 +0000506
507 case 2:
Barry Warsaw7dfeb422000-07-09 04:56:25 +0000508 /* Used when PyErr_SetFromErrno() is called and no filename
509 * argument is given.
510 */
Barry Warsaw675ac282000-05-26 19:05:16 +0000511 item0 = PySequence_GetItem(args, 0);
512 item1 = PySequence_GetItem(args, 1);
513 if (!item0 || !item1)
514 goto finally;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000515
Barry Warsaw675ac282000-05-26 19:05:16 +0000516 if (PyObject_SetAttrString(self, "errno", item0) ||
517 PyObject_SetAttrString(self, "strerror", item1))
518 {
519 goto finally;
520 }
Barry Warsaw7dfeb422000-07-09 04:56:25 +0000521 break;
Barry Warsaw675ac282000-05-26 19:05:16 +0000522 }
523
524 Py_INCREF(Py_None);
525 rtnval = Py_None;
526
527 finally:
528 Py_DECREF(args);
529 Py_XDECREF(item0);
530 Py_XDECREF(item1);
531 Py_XDECREF(item2);
532 Py_XDECREF(subslice);
533 return rtnval;
534}
535
536
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000537static PyObject *
538EnvironmentError__str__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000539{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000540 PyObject *originalself = self;
541 PyObject *filename;
542 PyObject *serrno;
543 PyObject *strerror;
544 PyObject *rtnval = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000545
Fred Drake1aba5772000-08-15 15:46:16 +0000546 if (!PyArg_ParseTuple(args, "O:__str__", &self))
Barry Warsaw675ac282000-05-26 19:05:16 +0000547 return NULL;
Barry Warsaw9667ed22001-01-23 16:08:34 +0000548
Barry Warsaw675ac282000-05-26 19:05:16 +0000549 filename = PyObject_GetAttrString(self, "filename");
550 serrno = PyObject_GetAttrString(self, "errno");
551 strerror = PyObject_GetAttrString(self, "strerror");
552 if (!filename || !serrno || !strerror)
553 goto finally;
554
555 if (filename != Py_None) {
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000556 PyObject *fmt = PyString_FromString("[Errno %s] %s: %s");
557 PyObject *repr = PyObject_Repr(filename);
558 PyObject *tuple = PyTuple_New(3);
Barry Warsaw675ac282000-05-26 19:05:16 +0000559
560 if (!fmt || !repr || !tuple) {
561 Py_XDECREF(fmt);
562 Py_XDECREF(repr);
563 Py_XDECREF(tuple);
564 goto finally;
565 }
566
567 PyTuple_SET_ITEM(tuple, 0, serrno);
568 PyTuple_SET_ITEM(tuple, 1, strerror);
569 PyTuple_SET_ITEM(tuple, 2, repr);
570
571 rtnval = PyString_Format(fmt, tuple);
572
573 Py_DECREF(fmt);
574 Py_DECREF(tuple);
575 /* already freed because tuple owned only reference */
576 serrno = NULL;
577 strerror = NULL;
578 }
579 else if (PyObject_IsTrue(serrno) && PyObject_IsTrue(strerror)) {
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000580 PyObject *fmt = PyString_FromString("[Errno %s] %s");
581 PyObject *tuple = PyTuple_New(2);
Barry Warsaw675ac282000-05-26 19:05:16 +0000582
583 if (!fmt || !tuple) {
584 Py_XDECREF(fmt);
585 Py_XDECREF(tuple);
586 goto finally;
587 }
588
589 PyTuple_SET_ITEM(tuple, 0, serrno);
590 PyTuple_SET_ITEM(tuple, 1, strerror);
Barry Warsaw9667ed22001-01-23 16:08:34 +0000591
Barry Warsaw675ac282000-05-26 19:05:16 +0000592 rtnval = PyString_Format(fmt, tuple);
593
594 Py_DECREF(fmt);
595 Py_DECREF(tuple);
596 /* already freed because tuple owned only reference */
597 serrno = NULL;
598 strerror = NULL;
599 }
600 else
601 /* The original Python code said:
602 *
603 * return StandardError.__str__(self)
604 *
605 * but there is no StandardError__str__() function; we happen to
606 * know that's just a pass through to Exception__str__().
607 */
608 rtnval = Exception__str__(originalself, args);
609
610 finally:
611 Py_XDECREF(filename);
612 Py_XDECREF(serrno);
613 Py_XDECREF(strerror);
614 return rtnval;
615}
616
617
618static
619PyMethodDef EnvironmentError_methods[] = {
Jeremy Hylton4e542a32000-06-30 04:59:59 +0000620 {"__init__", EnvironmentError__init__, METH_VARARGS},
621 {"__str__", EnvironmentError__str__, METH_VARARGS},
Barry Warsaw675ac282000-05-26 19:05:16 +0000622 {NULL, NULL}
623};
624
625
626
627
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000628PyDoc_STRVAR(IOError__doc__, "I/O operation failed.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000629
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000630PyDoc_STRVAR(OSError__doc__, "OS system call failed.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000631
632#ifdef MS_WINDOWS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000633PyDoc_STRVAR(WindowsError__doc__, "MS-Windows OS system call failed.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000634#endif /* MS_WINDOWS */
635
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000636PyDoc_STRVAR(EOFError__doc__, "Read beyond end of file.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000637
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000638PyDoc_STRVAR(RuntimeError__doc__, "Unspecified run-time error.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000640PyDoc_STRVAR(NotImplementedError__doc__,
641"Method or function hasn't been implemented yet.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000643PyDoc_STRVAR(NameError__doc__, "Name not found globally.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000645PyDoc_STRVAR(UnboundLocalError__doc__,
646"Local name referenced but not bound to a value.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000648PyDoc_STRVAR(AttributeError__doc__, "Attribute not found.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000649
650
651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000652PyDoc_STRVAR(SyntaxError__doc__, "Invalid syntax.");
Barry Warsaw675ac282000-05-26 19:05:16 +0000653
654
655static int
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000656SyntaxError__classinit__(PyObject *klass)
Barry Warsaw675ac282000-05-26 19:05:16 +0000657{
Barry Warsaw87bec352000-08-18 05:05:37 +0000658 int retval = 0;
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000659 PyObject *emptystring = PyString_FromString("");
Barry Warsaw675ac282000-05-26 19:05:16 +0000660
661 /* Additional class-creation time initializations */
662 if (!emptystring ||
663 PyObject_SetAttrString(klass, "msg", emptystring) ||
664 PyObject_SetAttrString(klass, "filename", Py_None) ||
665 PyObject_SetAttrString(klass, "lineno", Py_None) ||
666 PyObject_SetAttrString(klass, "offset", Py_None) ||
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000667 PyObject_SetAttrString(klass, "text", Py_None) ||
668 PyObject_SetAttrString(klass, "print_file_and_line", Py_None))
Barry Warsaw675ac282000-05-26 19:05:16 +0000669 {
Barry Warsaw87bec352000-08-18 05:05:37 +0000670 retval = -1;
Barry Warsaw675ac282000-05-26 19:05:16 +0000671 }
Barry Warsaw87bec352000-08-18 05:05:37 +0000672 Py_XDECREF(emptystring);
673 return retval;
Barry Warsaw675ac282000-05-26 19:05:16 +0000674}
675
676
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000677static PyObject *
678SyntaxError__init__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000679{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000680 PyObject *rtnval = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000681 int lenargs;
682
683 if (!(self = get_self(args)))
684 return NULL;
685
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000686 if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args))))
Barry Warsaw675ac282000-05-26 19:05:16 +0000687 return NULL;
688
689 if (PyObject_SetAttrString(self, "args", args))
690 goto finally;
691
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000692 lenargs = PySequence_Size(args);
Barry Warsaw675ac282000-05-26 19:05:16 +0000693 if (lenargs >= 1) {
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000694 PyObject *item0 = PySequence_GetItem(args, 0);
Barry Warsaw675ac282000-05-26 19:05:16 +0000695 int status;
696
697 if (!item0)
698 goto finally;
699 status = PyObject_SetAttrString(self, "msg", item0);
700 Py_DECREF(item0);
701 if (status)
702 goto finally;
703 }
704 if (lenargs == 2) {
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000705 PyObject *info = PySequence_GetItem(args, 1);
Fred Drake9da7f3b2001-02-28 21:52:10 +0000706 PyObject *filename = NULL, *lineno = NULL;
707 PyObject *offset = NULL, *text = NULL;
Barry Warsaw675ac282000-05-26 19:05:16 +0000708 int status = 1;
709
710 if (!info)
711 goto finally;
712
713 filename = PySequence_GetItem(info, 0);
Fred Drake9da7f3b2001-02-28 21:52:10 +0000714 if (filename != NULL) {
715 lineno = PySequence_GetItem(info, 1);
716 if (lineno != NULL) {
717 offset = PySequence_GetItem(info, 2);
718 if (offset != NULL) {
719 text = PySequence_GetItem(info, 3);
720 if (text != NULL) {
721 status =
722 PyObject_SetAttrString(self, "filename", filename)
723 || PyObject_SetAttrString(self, "lineno", lineno)
724 || PyObject_SetAttrString(self, "offset", offset)
725 || PyObject_SetAttrString(self, "text", text);
726 Py_DECREF(text);
727 }
728 Py_DECREF(offset);
729 }
730 Py_DECREF(lineno);
731 }
732 Py_DECREF(filename);
Barry Warsaw675ac282000-05-26 19:05:16 +0000733 }
Fred Drake9da7f3b2001-02-28 21:52:10 +0000734 Py_DECREF(info);
Barry Warsaw675ac282000-05-26 19:05:16 +0000735
736 if (status)
737 goto finally;
738 }
739 Py_INCREF(Py_None);
740 rtnval = Py_None;
741
742 finally:
743 Py_DECREF(args);
744 return rtnval;
745}
746
747
Fred Drake185a29b2000-08-15 16:20:36 +0000748/* This is called "my_basename" instead of just "basename" to avoid name
749 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
750 defined, and Python does define that. */
751static char *
752my_basename(char *name)
753{
754 char *cp = name;
755 char *result = name;
756
757 if (name == NULL)
758 return "???";
759 while (*cp != '\0') {
760 if (*cp == SEP)
761 result = cp + 1;
762 ++cp;
763 }
764 return result;
765}
766
767
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000768static PyObject *
769SyntaxError__str__(PyObject *self, PyObject *args)
Barry Warsaw675ac282000-05-26 19:05:16 +0000770{
Thomas Wouters0452d1f2000-07-22 18:45:06 +0000771 PyObject *msg;
772 PyObject *str;
Fred Drake1aba5772000-08-15 15:46:16 +0000773 PyObject *filename, *lineno, *result;
Barry Warsaw675ac282000-05-26 19:05:16 +0000774
Fred Drake1aba5772000-08-15 15:46:16 +0000775 if (!PyArg_ParseTuple(args, "O:__str__", &self))
Barry Warsaw675ac282000-05-26 19:05:16 +0000776 return NULL;
777
778 if (!(msg = PyObject_GetAttrString(self, "msg")))
779 return NULL;
Fred Drake1aba5772000-08-15 15:46:16 +0000780
Barry Warsaw675ac282000-05-26 19:05:16 +0000781 str = PyObject_Str(msg);
782 Py_DECREF(msg);
Fred Drake1aba5772000-08-15 15:46:16 +0000783 result = str;
784
785 /* XXX -- do all the additional formatting with filename and
786 lineno here */
787
788 if (PyString_Check(str)) {
789 int have_filename = 0;
790 int have_lineno = 0;
791 char *buffer = NULL;
792
Barry Warsaw77c9f502000-08-16 19:43:17 +0000793 if ((filename = PyObject_GetAttrString(self, "filename")) != NULL)
Fred Drake1aba5772000-08-15 15:46:16 +0000794 have_filename = PyString_Check(filename);
795 else
796 PyErr_Clear();
Barry Warsaw77c9f502000-08-16 19:43:17 +0000797
798 if ((lineno = PyObject_GetAttrString(self, "lineno")) != NULL)
Fred Drake1aba5772000-08-15 15:46:16 +0000799 have_lineno = PyInt_Check(lineno);
800 else
801 PyErr_Clear();
802
803 if (have_filename || have_lineno) {
Barry Warsaw77c9f502000-08-16 19:43:17 +0000804 int bufsize = PyString_GET_SIZE(str) + 64;
805 if (have_filename)
806 bufsize += PyString_GET_SIZE(filename);
Fred Drake1aba5772000-08-15 15:46:16 +0000807
Jeremy Hylton05bd7872001-11-28 20:24:33 +0000808 buffer = PyMem_MALLOC(bufsize);
Fred Drake1aba5772000-08-15 15:46:16 +0000809 if (buffer != NULL) {
810 if (have_filename && have_lineno)
Jeremy Hylton05bd7872001-11-28 20:24:33 +0000811 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
812 PyString_AS_STRING(str),
813 my_basename(PyString_AS_STRING(filename)),
814 PyInt_AsLong(lineno));
Fred Drake1aba5772000-08-15 15:46:16 +0000815 else if (have_filename)
Jeremy Hylton05bd7872001-11-28 20:24:33 +0000816 PyOS_snprintf(buffer, bufsize, "%s (%s)",
817 PyString_AS_STRING(str),
818 my_basename(PyString_AS_STRING(filename)));
Fred Drake1aba5772000-08-15 15:46:16 +0000819 else if (have_lineno)
Jeremy Hylton05bd7872001-11-28 20:24:33 +0000820 PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
821 PyString_AS_STRING(str),
822 PyInt_AsLong(lineno));
Barry Warsaw77c9f502000-08-16 19:43:17 +0000823
Fred Drake1aba5772000-08-15 15:46:16 +0000824 result = PyString_FromString(buffer);
Barry Warsaw77c9f502000-08-16 19:43:17 +0000825 PyMem_FREE(buffer);
826
Fred Drake1aba5772000-08-15 15:46:16 +0000827 if (result == NULL)
828 result = str;
829 else
830 Py_DECREF(str);
831 }
832 }
833 Py_XDECREF(filename);
834 Py_XDECREF(lineno);
835 }
836 return result;
Barry Warsaw675ac282000-05-26 19:05:16 +0000837}
838
839
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000840static PyMethodDef SyntaxError_methods[] = {
Jeremy Hylton4e542a32000-06-30 04:59:59 +0000841 {"__init__", SyntaxError__init__, METH_VARARGS},
842 {"__str__", SyntaxError__str__, METH_VARARGS},
Barry Warsaw675ac282000-05-26 19:05:16 +0000843 {NULL, NULL}
844};
845
846
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000847static
848int get_int(PyObject *exc, const char *name, int *value)
849{
850 PyObject *attr = PyObject_GetAttrString(exc, (char *)name);
851
852 if (!attr)
853 return -1;
854 if (!PyInt_Check(attr)) {
855 PyErr_Format(PyExc_TypeError, "%s attribute must be int", name);
856 Py_DECREF(attr);
857 return -1;
858 }
859 *value = PyInt_AS_LONG(attr);
860 Py_DECREF(attr);
861 return 0;
862}
863
864
865static
866int set_int(PyObject *exc, const char *name, int value)
867{
868 PyObject *obj = PyInt_FromLong(value);
869 int result;
870
871 if (!obj)
872 return -1;
873 result = PyObject_SetAttrString(exc, (char *)name, obj);
874 Py_DECREF(obj);
875 return result;
876}
877
878
879static
880PyObject *get_string(PyObject *exc, const char *name)
881{
882 PyObject *attr = PyObject_GetAttrString(exc, (char *)name);
883
884 if (!attr)
885 return NULL;
886 if (!PyString_Check(attr)) {
887 PyErr_Format(PyExc_TypeError, "%s attribute must be str", name);
888 Py_DECREF(attr);
889 return NULL;
890 }
891 return attr;
892}
893
894
895static
896int set_string(PyObject *exc, const char *name, const char *value)
897{
898 PyObject *obj = PyString_FromString(value);
899 int result;
900
901 if (!obj)
902 return -1;
903 result = PyObject_SetAttrString(exc, (char *)name, obj);
904 Py_DECREF(obj);
905 return result;
906}
907
908
909static
910PyObject *get_unicode(PyObject *exc, const char *name)
911{
912 PyObject *attr = PyObject_GetAttrString(exc, (char *)name);
913
914 if (!attr)
915 return NULL;
916 if (!PyUnicode_Check(attr)) {
917 PyErr_Format(PyExc_TypeError, "%s attribute must be unicode", name);
918 Py_DECREF(attr);
919 return NULL;
920 }
921 return attr;
922}
923
924PyObject * PyUnicodeEncodeError_GetEncoding(PyObject *exc)
925{
926 return get_string(exc, "encoding");
927}
928
929PyObject * PyUnicodeDecodeError_GetEncoding(PyObject *exc)
930{
931 return get_string(exc, "encoding");
932}
933
934PyObject * PyUnicodeTranslateError_GetEncoding(PyObject *exc)
935{
936 return get_string(exc, "encoding");
937}
938
939PyObject *PyUnicodeEncodeError_GetObject(PyObject *exc)
940{
941 return get_unicode(exc, "object");
942}
943
944PyObject *PyUnicodeDecodeError_GetObject(PyObject *exc)
945{
946 return get_string(exc, "object");
947}
948
949PyObject *PyUnicodeTranslateError_GetObject(PyObject *exc)
950{
951 return get_unicode(exc, "object");
952}
953
954int PyUnicodeEncodeError_GetStart(PyObject *exc, int *start)
955{
956 if (!get_int(exc, "start", start)) {
957 PyObject *object = PyUnicodeEncodeError_GetObject(exc);
958 int size;
959 if (!object)
960 return -1;
961 size = PyUnicode_GET_SIZE(object);
962 if (*start<0)
963 *start = 0;
964 if (*start>=size)
965 *start = size-1;
966 Py_DECREF(object);
967 return 0;
968 }
969 return -1;
970}
971
972
973int PyUnicodeDecodeError_GetStart(PyObject *exc, int *start)
974{
975 if (!get_int(exc, "start", start)) {
976 PyObject *object = PyUnicodeDecodeError_GetObject(exc);
977 int size;
978 if (!object)
979 return -1;
980 size = PyString_GET_SIZE(object);
981 if (*start<0)
982 *start = 0;
983 if (*start>=size)
984 *start = size-1;
985 Py_DECREF(object);
986 return 0;
987 }
988 return -1;
989}
990
991
992int PyUnicodeTranslateError_GetStart(PyObject *exc, int *start)
993{
994 return PyUnicodeEncodeError_GetStart(exc, start);
995}
996
997
998int PyUnicodeEncodeError_SetStart(PyObject *exc, int start)
999{
1000 return set_int(exc, "start", start);
1001}
1002
1003
1004int PyUnicodeDecodeError_SetStart(PyObject *exc, int start)
1005{
1006 return set_int(exc, "start", start);
1007}
1008
1009
1010int PyUnicodeTranslateError_SetStart(PyObject *exc, int start)
1011{
1012 return set_int(exc, "start", start);
1013}
1014
1015
1016int PyUnicodeEncodeError_GetEnd(PyObject *exc, int *end)
1017{
1018 if (!get_int(exc, "end", end)) {
1019 PyObject *object = PyUnicodeEncodeError_GetObject(exc);
1020 int size;
1021 if (!object)
1022 return -1;
1023 size = PyUnicode_GET_SIZE(object);
1024 if (*end<1)
1025 *end = 1;
1026 if (*end>size)
1027 *end = size;
1028 Py_DECREF(object);
1029 return 0;
1030 }
1031 return -1;
1032}
1033
1034
1035int PyUnicodeDecodeError_GetEnd(PyObject *exc, int *end)
1036{
1037 if (!get_int(exc, "end", end)) {
1038 PyObject *object = PyUnicodeDecodeError_GetObject(exc);
1039 int size;
1040 if (!object)
1041 return -1;
1042 size = PyString_GET_SIZE(object);
1043 if (*end<1)
1044 *end = 1;
1045 if (*end>size)
1046 *end = size;
1047 Py_DECREF(object);
1048 return 0;
1049 }
1050 return -1;
1051}
1052
1053
1054int PyUnicodeTranslateError_GetEnd(PyObject *exc, int *start)
1055{
1056 return PyUnicodeEncodeError_GetEnd(exc, start);
1057}
1058
1059
1060int PyUnicodeEncodeError_SetEnd(PyObject *exc, int end)
1061{
1062 return set_int(exc, "end", end);
1063}
1064
1065
1066int PyUnicodeDecodeError_SetEnd(PyObject *exc, int end)
1067{
1068 return set_int(exc, "end", end);
1069}
1070
1071
1072int PyUnicodeTranslateError_SetEnd(PyObject *exc, int end)
1073{
1074 return set_int(exc, "end", end);
1075}
1076
1077
1078PyObject *PyUnicodeEncodeError_GetReason(PyObject *exc)
1079{
1080 return get_string(exc, "reason");
1081}
1082
1083
1084PyObject *PyUnicodeDecodeError_GetReason(PyObject *exc)
1085{
1086 return get_string(exc, "reason");
1087}
1088
1089
1090PyObject *PyUnicodeTranslateError_GetReason(PyObject *exc)
1091{
1092 return get_string(exc, "reason");
1093}
1094
1095
1096int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1097{
1098 return set_string(exc, "reason", reason);
1099}
1100
1101
1102int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1103{
1104 return set_string(exc, "reason", reason);
1105}
1106
1107
1108int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1109{
1110 return set_string(exc, "reason", reason);
1111}
1112
1113
1114static PyObject *
1115UnicodeError__init__(PyObject *self, PyObject *args, PyTypeObject *objecttype)
1116{
1117 PyObject *rtnval = NULL;
1118 PyObject *encoding;
1119 PyObject *object;
1120 PyObject *start;
1121 PyObject *end;
1122 PyObject *reason;
1123
1124 if (!(self = get_self(args)))
1125 return NULL;
1126
1127 if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args))))
1128 return NULL;
1129
1130 if (!PyArg_ParseTuple(args, "O!O!O!O!O!",
1131 &PyString_Type, &encoding,
1132 objecttype, &object,
1133 &PyInt_Type, &start,
1134 &PyInt_Type, &end,
1135 &PyString_Type, &reason))
1136 return NULL;
1137
1138 if (PyObject_SetAttrString(self, "args", args))
1139 goto finally;
1140
1141 if (PyObject_SetAttrString(self, "encoding", encoding))
1142 goto finally;
1143 if (PyObject_SetAttrString(self, "object", object))
1144 goto finally;
1145 if (PyObject_SetAttrString(self, "start", start))
1146 goto finally;
1147 if (PyObject_SetAttrString(self, "end", end))
1148 goto finally;
1149 if (PyObject_SetAttrString(self, "reason", reason))
1150 goto finally;
1151
1152 Py_INCREF(Py_None);
1153 rtnval = Py_None;
1154
1155 finally:
1156 Py_DECREF(args);
1157 return rtnval;
1158}
1159
1160
1161static PyObject *
1162UnicodeEncodeError__init__(PyObject *self, PyObject *args)
1163{
1164 return UnicodeError__init__(self, args, &PyUnicode_Type);
1165}
1166
1167static PyObject *
1168UnicodeEncodeError__str__(PyObject *self, PyObject *arg)
1169{
1170 PyObject *encodingObj = NULL;
1171 PyObject *objectObj = NULL;
1172 int length;
1173 int start;
1174 int end;
1175 PyObject *reasonObj = NULL;
1176 char buffer[1000];
1177 PyObject *result = NULL;
1178
1179 self = arg;
1180
1181 if (!(encodingObj = PyUnicodeEncodeError_GetEncoding(self)))
1182 goto error;
1183
1184 if (!(objectObj = PyUnicodeEncodeError_GetObject(self)))
1185 goto error;
1186
1187 length = PyUnicode_GET_SIZE(objectObj);
1188
1189 if (PyUnicodeEncodeError_GetStart(self, &start))
1190 goto error;
1191
1192 if (PyUnicodeEncodeError_GetEnd(self, &end))
1193 goto error;
1194
1195 if (!(reasonObj = PyUnicodeEncodeError_GetReason(self)))
1196 goto error;
1197
1198 if (end==start+1) {
1199 PyOS_snprintf(buffer, sizeof(buffer),
1200 "'%.400s' codec can't encode character '\\u%x' in position %d: %.400s",
1201 PyString_AS_STRING(encodingObj),
1202 (int)PyUnicode_AS_UNICODE(objectObj)[start],
1203 start,
1204 PyString_AS_STRING(reasonObj)
1205 );
1206 }
1207 else {
1208 PyOS_snprintf(buffer, sizeof(buffer),
1209 "'%.400s' codec can't encode characters in position %d-%d: %.400s",
1210 PyString_AS_STRING(encodingObj),
1211 start,
1212 end-1,
1213 PyString_AS_STRING(reasonObj)
1214 );
1215 }
1216 result = PyString_FromString(buffer);
1217
1218error:
1219 Py_XDECREF(reasonObj);
1220 Py_XDECREF(objectObj);
1221 Py_XDECREF(encodingObj);
1222 return result;
1223}
1224
1225static PyMethodDef UnicodeEncodeError_methods[] = {
1226 {"__init__", UnicodeEncodeError__init__, METH_VARARGS},
1227 {"__str__", UnicodeEncodeError__str__, METH_O},
1228 {NULL, NULL}
1229};
1230
1231
1232PyObject * PyUnicodeEncodeError_Create(
1233 const char *encoding, const Py_UNICODE *object, int length,
1234 int start, int end, const char *reason)
1235{
1236 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#iis",
1237 encoding, object, length, start, end, reason);
1238}
1239
1240
1241static PyObject *
1242UnicodeDecodeError__init__(PyObject *self, PyObject *args)
1243{
1244 return UnicodeError__init__(self, args, &PyString_Type);
1245}
1246
1247static PyObject *
1248UnicodeDecodeError__str__(PyObject *self, PyObject *arg)
1249{
1250 PyObject *encodingObj = NULL;
1251 PyObject *objectObj = NULL;
1252 int length;
1253 int start;
1254 int end;
1255 PyObject *reasonObj = NULL;
1256 char buffer[1000];
1257 PyObject *result = NULL;
1258
1259 self = arg;
1260
1261 if (!(encodingObj = PyUnicodeDecodeError_GetEncoding(self)))
1262 goto error;
1263
1264 if (!(objectObj = PyUnicodeDecodeError_GetObject(self)))
1265 goto error;
1266
1267 length = PyString_GET_SIZE(objectObj);
1268
1269 if (PyUnicodeDecodeError_GetStart(self, &start))
1270 goto error;
1271
1272 if (PyUnicodeDecodeError_GetEnd(self, &end))
1273 goto error;
1274
1275 if (!(reasonObj = PyUnicodeDecodeError_GetReason(self)))
1276 goto error;
1277
1278 if (end==start+1) {
1279 PyOS_snprintf(buffer, sizeof(buffer),
1280 "'%.400s' codec can't decode byte 0x%x in position %d: %.400s",
1281 PyString_AS_STRING(encodingObj),
1282 ((int)PyString_AS_STRING(objectObj)[start])&0xff,
1283 start,
1284 PyString_AS_STRING(reasonObj)
1285 );
1286 }
1287 else {
1288 PyOS_snprintf(buffer, sizeof(buffer),
1289 "'%.400s' codec can't decode bytes in position %d-%d: %.400s",
1290 PyString_AS_STRING(encodingObj),
1291 start,
1292 end-1,
1293 PyString_AS_STRING(reasonObj)
1294 );
1295 }
1296 result = PyString_FromString(buffer);
1297
1298error:
1299 Py_XDECREF(reasonObj);
1300 Py_XDECREF(objectObj);
1301 Py_XDECREF(encodingObj);
1302 return result;
1303}
1304
1305static PyMethodDef UnicodeDecodeError_methods[] = {
1306 {"__init__", UnicodeDecodeError__init__, METH_VARARGS},
1307 {"__str__", UnicodeDecodeError__str__, METH_O},
1308 {NULL, NULL}
1309};
1310
1311
1312PyObject * PyUnicodeDecodeError_Create(
1313 const char *encoding, const char *object, int length,
1314 int start, int end, const char *reason)
1315{
1316 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#iis",
1317 encoding, object, length, start, end, reason);
1318}
1319
1320
1321static PyObject *
1322UnicodeTranslateError__init__(PyObject *self, PyObject *args)
1323{
1324 PyObject *rtnval = NULL;
1325 PyObject *object;
1326 PyObject *start;
1327 PyObject *end;
1328 PyObject *reason;
1329
1330 if (!(self = get_self(args)))
1331 return NULL;
1332
1333 if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args))))
1334 return NULL;
1335
1336 if (!PyArg_ParseTuple(args, "O!O!O!O!",
1337 &PyUnicode_Type, &object,
1338 &PyInt_Type, &start,
1339 &PyInt_Type, &end,
1340 &PyString_Type, &reason))
1341 goto finally;
1342
1343 if (PyObject_SetAttrString(self, "args", args))
1344 goto finally;
1345
1346 if (PyObject_SetAttrString(self, "object", object))
1347 goto finally;
1348 if (PyObject_SetAttrString(self, "start", start))
1349 goto finally;
1350 if (PyObject_SetAttrString(self, "end", end))
1351 goto finally;
1352 if (PyObject_SetAttrString(self, "reason", reason))
1353 goto finally;
1354
1355 Py_INCREF(Py_None);
1356 rtnval = Py_None;
1357
1358 finally:
1359 Py_DECREF(args);
1360 return rtnval;
1361}
1362
1363
1364static PyObject *
1365UnicodeTranslateError__str__(PyObject *self, PyObject *arg)
1366{
1367 PyObject *objectObj = NULL;
1368 int length;
1369 int start;
1370 int end;
1371 PyObject *reasonObj = NULL;
1372 char buffer[1000];
1373 PyObject *result = NULL;
1374
1375 self = arg;
1376
1377 if (!(objectObj = PyUnicodeTranslateError_GetObject(self)))
1378 goto error;
1379
1380 length = PyUnicode_GET_SIZE(objectObj);
1381
1382 if (PyUnicodeTranslateError_GetStart(self, &start))
1383 goto error;
1384
1385 if (PyUnicodeTranslateError_GetEnd(self, &end))
1386 goto error;
1387
1388 if (!(reasonObj = PyUnicodeTranslateError_GetReason(self)))
1389 goto error;
1390
1391 if (end==start+1) {
1392 PyOS_snprintf(buffer, sizeof(buffer),
1393 "can't translate character '\\u%x' in position %d: %.400s",
1394 (int)PyUnicode_AS_UNICODE(objectObj)[start],
1395 start,
1396 PyString_AS_STRING(reasonObj)
1397 );
1398 }
1399 else {
1400 PyOS_snprintf(buffer, sizeof(buffer),
1401 "can't translate characters in position %d-%d: %.400s",
1402 start,
1403 end-1,
1404 PyString_AS_STRING(reasonObj)
1405 );
1406 }
1407 result = PyString_FromString(buffer);
1408
1409error:
1410 Py_XDECREF(reasonObj);
1411 Py_XDECREF(objectObj);
1412 return result;
1413}
1414
1415static PyMethodDef UnicodeTranslateError_methods[] = {
1416 {"__init__", UnicodeTranslateError__init__, METH_VARARGS},
1417 {"__str__", UnicodeTranslateError__str__, METH_O},
1418 {NULL, NULL}
1419};
1420
1421
1422PyObject * PyUnicodeTranslateError_Create(
1423 const Py_UNICODE *object, int length,
1424 int start, int end, const char *reason)
1425{
1426 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#iis",
1427 object, length, start, end, reason);
1428}
1429
1430
Barry Warsaw675ac282000-05-26 19:05:16 +00001431
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001432/* Exception doc strings */
1433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001434PyDoc_STRVAR(AssertionError__doc__, "Assertion failed.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(LookupError__doc__, "Base class for lookup errors.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438PyDoc_STRVAR(IndexError__doc__, "Sequence index out of range.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001440PyDoc_STRVAR(KeyError__doc__, "Mapping key not found.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442PyDoc_STRVAR(ArithmeticError__doc__, "Base class for arithmetic errors.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001444PyDoc_STRVAR(OverflowError__doc__, "Result too large to be represented.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446PyDoc_STRVAR(ZeroDivisionError__doc__,
1447"Second argument to a division or modulo operation was zero.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001449PyDoc_STRVAR(FloatingPointError__doc__, "Floating point operation failed.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001451PyDoc_STRVAR(ValueError__doc__,
1452"Inappropriate argument value (of correct type).");
Barry Warsaw675ac282000-05-26 19:05:16 +00001453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454PyDoc_STRVAR(UnicodeError__doc__, "Unicode related error.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001455
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001456PyDoc_STRVAR(UnicodeEncodeError__doc__, "Unicode encoding error.");
1457
1458PyDoc_STRVAR(UnicodeDecodeError__doc__, "Unicode decoding error.");
1459
1460PyDoc_STRVAR(UnicodeTranslateError__doc__, "Unicode translation error.");
1461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001462PyDoc_STRVAR(SystemError__doc__,
1463"Internal error in the Python interpreter.\n\
Barry Warsaw675ac282000-05-26 19:05:16 +00001464\n\
1465Please report this to the Python maintainer, along with the traceback,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001466the Python version, and the hardware/OS platform and version.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001468PyDoc_STRVAR(ReferenceError__doc__,
1469"Weak ref proxy used after referent went away.");
Fred Drakebb9fa212001-10-05 21:50:08 +00001470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001471PyDoc_STRVAR(MemoryError__doc__, "Out of memory.");
Barry Warsaw675ac282000-05-26 19:05:16 +00001472
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001473PyDoc_STRVAR(IndentationError__doc__, "Improper indentation.");
Fred Drake85f36392000-07-11 17:53:00 +00001474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001475PyDoc_STRVAR(TabError__doc__, "Improper mixture of spaces and tabs.");
Fred Drake85f36392000-07-11 17:53:00 +00001476
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001477/* Warning category docstrings */
1478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001479PyDoc_STRVAR(Warning__doc__, "Base class for warning categories.");
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481PyDoc_STRVAR(UserWarning__doc__,
1482"Base class for warnings generated by user code.");
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001484PyDoc_STRVAR(DeprecationWarning__doc__,
1485"Base class for warnings about deprecated features.");
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001486
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487PyDoc_STRVAR(PendingDeprecationWarning__doc__,
Neal Norwitzd68f5172002-05-29 15:54:55 +00001488"Base class for warnings about features which will be deprecated "
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001489"in the future.");
Neal Norwitzd68f5172002-05-29 15:54:55 +00001490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001491PyDoc_STRVAR(SyntaxWarning__doc__,
1492"Base class for warnings about dubious syntax.");
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001494PyDoc_STRVAR(OverflowWarning__doc__,
1495"Base class for warnings about numeric overflow.");
Guido van Rossumae347b32001-08-23 02:56:07 +00001496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497PyDoc_STRVAR(RuntimeWarning__doc__,
1498"Base class for warnings about dubious runtime behavior.");
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001499
Barry Warsaw9f007392002-08-14 15:51:29 +00001500PyDoc_STRVAR(FutureWarning__doc__,
1501"Base class for warnings about constructs that will change semantically "
1502"in the future.");
1503
Barry Warsaw675ac282000-05-26 19:05:16 +00001504
1505
1506/* module global functions */
1507static PyMethodDef functions[] = {
1508 /* Sentinel */
1509 {NULL, NULL}
1510};
1511
1512
1513
1514/* Global C API defined exceptions */
1515
1516PyObject *PyExc_Exception;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001517PyObject *PyExc_StopIteration;
Barry Warsaw675ac282000-05-26 19:05:16 +00001518PyObject *PyExc_StandardError;
1519PyObject *PyExc_ArithmeticError;
1520PyObject *PyExc_LookupError;
1521
1522PyObject *PyExc_AssertionError;
1523PyObject *PyExc_AttributeError;
1524PyObject *PyExc_EOFError;
1525PyObject *PyExc_FloatingPointError;
1526PyObject *PyExc_EnvironmentError;
1527PyObject *PyExc_IOError;
1528PyObject *PyExc_OSError;
1529PyObject *PyExc_ImportError;
1530PyObject *PyExc_IndexError;
1531PyObject *PyExc_KeyError;
1532PyObject *PyExc_KeyboardInterrupt;
1533PyObject *PyExc_MemoryError;
1534PyObject *PyExc_NameError;
1535PyObject *PyExc_OverflowError;
1536PyObject *PyExc_RuntimeError;
1537PyObject *PyExc_NotImplementedError;
1538PyObject *PyExc_SyntaxError;
Fred Drake85f36392000-07-11 17:53:00 +00001539PyObject *PyExc_IndentationError;
1540PyObject *PyExc_TabError;
Fred Drakebb9fa212001-10-05 21:50:08 +00001541PyObject *PyExc_ReferenceError;
Barry Warsaw675ac282000-05-26 19:05:16 +00001542PyObject *PyExc_SystemError;
1543PyObject *PyExc_SystemExit;
1544PyObject *PyExc_UnboundLocalError;
1545PyObject *PyExc_UnicodeError;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001546PyObject *PyExc_UnicodeEncodeError;
1547PyObject *PyExc_UnicodeDecodeError;
1548PyObject *PyExc_UnicodeTranslateError;
Barry Warsaw675ac282000-05-26 19:05:16 +00001549PyObject *PyExc_TypeError;
1550PyObject *PyExc_ValueError;
1551PyObject *PyExc_ZeroDivisionError;
1552#ifdef MS_WINDOWS
1553PyObject *PyExc_WindowsError;
1554#endif
1555
1556/* Pre-computed MemoryError instance. Best to create this as early as
1557 * possibly and not wait until a MemoryError is actually raised!
1558 */
1559PyObject *PyExc_MemoryErrorInst;
1560
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001561/* Predefined warning categories */
1562PyObject *PyExc_Warning;
1563PyObject *PyExc_UserWarning;
1564PyObject *PyExc_DeprecationWarning;
Neal Norwitzd68f5172002-05-29 15:54:55 +00001565PyObject *PyExc_PendingDeprecationWarning;
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001566PyObject *PyExc_SyntaxWarning;
Guido van Rossumae347b32001-08-23 02:56:07 +00001567PyObject *PyExc_OverflowWarning;
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001568PyObject *PyExc_RuntimeWarning;
Barry Warsaw9f007392002-08-14 15:51:29 +00001569PyObject *PyExc_FutureWarning;
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001570
Barry Warsaw675ac282000-05-26 19:05:16 +00001571
1572
Thomas Wouters0452d1f2000-07-22 18:45:06 +00001573/* mapping between exception names and their PyObject ** */
1574static struct {
1575 char *name;
1576 PyObject **exc;
1577 PyObject **base; /* NULL == PyExc_StandardError */
1578 char *docstr;
1579 PyMethodDef *methods;
1580 int (*classinit)(PyObject *);
1581} exctable[] = {
Barry Warsaw675ac282000-05-26 19:05:16 +00001582 /*
1583 * The first three classes MUST appear in exactly this order
1584 */
1585 {"Exception", &PyExc_Exception},
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001586 {"StopIteration", &PyExc_StopIteration, &PyExc_Exception,
1587 StopIteration__doc__},
Barry Warsaw675ac282000-05-26 19:05:16 +00001588 {"StandardError", &PyExc_StandardError, &PyExc_Exception,
1589 StandardError__doc__},
1590 {"TypeError", &PyExc_TypeError, 0, TypeError__doc__},
1591 /*
1592 * The rest appear in depth-first order of the hierarchy
1593 */
1594 {"SystemExit", &PyExc_SystemExit, &PyExc_Exception, SystemExit__doc__,
1595 SystemExit_methods},
1596 {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 0, KeyboardInterrupt__doc__},
1597 {"ImportError", &PyExc_ImportError, 0, ImportError__doc__},
1598 {"EnvironmentError", &PyExc_EnvironmentError, 0, EnvironmentError__doc__,
1599 EnvironmentError_methods},
1600 {"IOError", &PyExc_IOError, &PyExc_EnvironmentError, IOError__doc__},
1601 {"OSError", &PyExc_OSError, &PyExc_EnvironmentError, OSError__doc__},
1602#ifdef MS_WINDOWS
Mark Hammond557a0442000-08-15 00:37:32 +00001603 {"WindowsError", &PyExc_WindowsError, &PyExc_OSError,
Barry Warsaw675ac282000-05-26 19:05:16 +00001604 WindowsError__doc__},
1605#endif /* MS_WINDOWS */
1606 {"EOFError", &PyExc_EOFError, 0, EOFError__doc__},
1607 {"RuntimeError", &PyExc_RuntimeError, 0, RuntimeError__doc__},
1608 {"NotImplementedError", &PyExc_NotImplementedError,
1609 &PyExc_RuntimeError, NotImplementedError__doc__},
1610 {"NameError", &PyExc_NameError, 0, NameError__doc__},
1611 {"UnboundLocalError", &PyExc_UnboundLocalError, &PyExc_NameError,
1612 UnboundLocalError__doc__},
1613 {"AttributeError", &PyExc_AttributeError, 0, AttributeError__doc__},
1614 {"SyntaxError", &PyExc_SyntaxError, 0, SyntaxError__doc__,
1615 SyntaxError_methods, SyntaxError__classinit__},
Fred Drake85f36392000-07-11 17:53:00 +00001616 {"IndentationError", &PyExc_IndentationError, &PyExc_SyntaxError,
1617 IndentationError__doc__},
1618 {"TabError", &PyExc_TabError, &PyExc_IndentationError,
1619 TabError__doc__},
Barry Warsaw675ac282000-05-26 19:05:16 +00001620 {"AssertionError", &PyExc_AssertionError, 0, AssertionError__doc__},
1621 {"LookupError", &PyExc_LookupError, 0, LookupError__doc__},
1622 {"IndexError", &PyExc_IndexError, &PyExc_LookupError,
1623 IndexError__doc__},
1624 {"KeyError", &PyExc_KeyError, &PyExc_LookupError,
1625 KeyError__doc__},
1626 {"ArithmeticError", &PyExc_ArithmeticError, 0, ArithmeticError__doc__},
1627 {"OverflowError", &PyExc_OverflowError, &PyExc_ArithmeticError,
1628 OverflowError__doc__},
1629 {"ZeroDivisionError", &PyExc_ZeroDivisionError, &PyExc_ArithmeticError,
1630 ZeroDivisionError__doc__},
1631 {"FloatingPointError", &PyExc_FloatingPointError, &PyExc_ArithmeticError,
1632 FloatingPointError__doc__},
1633 {"ValueError", &PyExc_ValueError, 0, ValueError__doc__},
1634 {"UnicodeError", &PyExc_UnicodeError, &PyExc_ValueError, UnicodeError__doc__},
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001635 {"UnicodeEncodeError", &PyExc_UnicodeEncodeError, &PyExc_UnicodeError,
1636 UnicodeEncodeError__doc__, UnicodeEncodeError_methods},
1637 {"UnicodeDecodeError", &PyExc_UnicodeDecodeError, &PyExc_UnicodeError,
1638 UnicodeDecodeError__doc__, UnicodeDecodeError_methods},
1639 {"UnicodeTranslateError", &PyExc_UnicodeTranslateError, &PyExc_UnicodeError,
1640 UnicodeTranslateError__doc__, UnicodeTranslateError_methods},
Fred Drakebb9fa212001-10-05 21:50:08 +00001641 {"ReferenceError", &PyExc_ReferenceError, 0, ReferenceError__doc__},
Barry Warsaw675ac282000-05-26 19:05:16 +00001642 {"SystemError", &PyExc_SystemError, 0, SystemError__doc__},
1643 {"MemoryError", &PyExc_MemoryError, 0, MemoryError__doc__},
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001644 /* Warning categories */
1645 {"Warning", &PyExc_Warning, &PyExc_Exception, Warning__doc__},
1646 {"UserWarning", &PyExc_UserWarning, &PyExc_Warning, UserWarning__doc__},
1647 {"DeprecationWarning", &PyExc_DeprecationWarning, &PyExc_Warning,
1648 DeprecationWarning__doc__},
Neal Norwitzd68f5172002-05-29 15:54:55 +00001649 {"PendingDeprecationWarning", &PyExc_PendingDeprecationWarning, &PyExc_Warning,
1650 PendingDeprecationWarning__doc__},
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001651 {"SyntaxWarning", &PyExc_SyntaxWarning, &PyExc_Warning, SyntaxWarning__doc__},
Guido van Rossumae347b32001-08-23 02:56:07 +00001652 {"OverflowWarning", &PyExc_OverflowWarning, &PyExc_Warning,
1653 OverflowWarning__doc__},
Guido van Rossumd0977cd2000-12-15 21:58:29 +00001654 {"RuntimeWarning", &PyExc_RuntimeWarning, &PyExc_Warning,
1655 RuntimeWarning__doc__},
Barry Warsaw9f007392002-08-14 15:51:29 +00001656 {"FutureWarning", &PyExc_FutureWarning, &PyExc_Warning,
1657 FutureWarning__doc__},
Barry Warsaw675ac282000-05-26 19:05:16 +00001658 /* Sentinel */
1659 {NULL}
1660};
1661
1662
1663
Mark Hammonda2905272002-07-29 13:42:14 +00001664void
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665_PyExc_Init(void)
Barry Warsaw675ac282000-05-26 19:05:16 +00001666{
Thomas Wouters0452d1f2000-07-22 18:45:06 +00001667 char *modulename = "exceptions";
Barry Warsaw675ac282000-05-26 19:05:16 +00001668 int modnamesz = strlen(modulename);
1669 int i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670 PyObject *me, *mydict, *bltinmod, *bdict, *doc, *args;
Barry Warsaw675ac282000-05-26 19:05:16 +00001671
Tim Peters6d6c1a32001-08-02 04:15:00 +00001672 me = Py_InitModule(modulename, functions);
1673 if (me == NULL)
1674 goto err;
1675 mydict = PyModule_GetDict(me);
1676 if (mydict == NULL)
1677 goto err;
1678 bltinmod = PyImport_ImportModule("__builtin__");
1679 if (bltinmod == NULL)
1680 goto err;
1681 bdict = PyModule_GetDict(bltinmod);
1682 if (bdict == NULL)
1683 goto err;
1684 doc = PyString_FromString(module__doc__);
1685 if (doc == NULL)
1686 goto err;
Barry Warsaw675ac282000-05-26 19:05:16 +00001687
Tim Peters6d6c1a32001-08-02 04:15:00 +00001688 i = PyDict_SetItemString(mydict, "__doc__", doc);
Barry Warsaw8fcaa922000-07-01 04:45:52 +00001689 Py_DECREF(doc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001690 if (i < 0) {
1691 err:
Barry Warsaw675ac282000-05-26 19:05:16 +00001692 Py_FatalError("exceptions bootstrapping error.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001693 return;
1694 }
Barry Warsaw675ac282000-05-26 19:05:16 +00001695
1696 /* This is the base class of all exceptions, so make it first. */
1697 if (make_Exception(modulename) ||
1698 PyDict_SetItemString(mydict, "Exception", PyExc_Exception) ||
1699 PyDict_SetItemString(bdict, "Exception", PyExc_Exception))
1700 {
1701 Py_FatalError("Base class `Exception' could not be created.");
1702 }
Barry Warsaw9667ed22001-01-23 16:08:34 +00001703
Barry Warsaw675ac282000-05-26 19:05:16 +00001704 /* Now we can programmatically create all the remaining exceptions.
1705 * Remember to start the loop at 1 to skip Exceptions.
1706 */
1707 for (i=1; exctable[i].name; i++) {
1708 int status;
Thomas Wouters0452d1f2000-07-22 18:45:06 +00001709 char *cname = PyMem_NEW(char, modnamesz+strlen(exctable[i].name)+2);
1710 PyObject *base;
Barry Warsaw675ac282000-05-26 19:05:16 +00001711
1712 (void)strcpy(cname, modulename);
1713 (void)strcat(cname, ".");
1714 (void)strcat(cname, exctable[i].name);
1715
1716 if (exctable[i].base == 0)
1717 base = PyExc_StandardError;
1718 else
1719 base = *exctable[i].base;
1720
1721 status = make_class(exctable[i].exc, base, cname,
1722 exctable[i].methods,
1723 exctable[i].docstr);
1724
1725 PyMem_DEL(cname);
1726
1727 if (status)
1728 Py_FatalError("Standard exception classes could not be created.");
1729
1730 if (exctable[i].classinit) {
1731 status = (*exctable[i].classinit)(*exctable[i].exc);
1732 if (status)
1733 Py_FatalError("An exception class could not be initialized.");
1734 }
1735
1736 /* Now insert the class into both this module and the __builtin__
1737 * module.
1738 */
1739 if (PyDict_SetItemString(mydict, exctable[i].name, *exctable[i].exc) ||
1740 PyDict_SetItemString(bdict, exctable[i].name, *exctable[i].exc))
1741 {
1742 Py_FatalError("Module dictionary insertion problem.");
1743 }
1744 }
1745
1746 /* Now we need to pre-allocate a MemoryError instance */
1747 args = Py_BuildValue("()");
1748 if (!args ||
1749 !(PyExc_MemoryErrorInst = PyEval_CallObject(PyExc_MemoryError, args)))
1750 {
1751 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
1752 }
1753 Py_DECREF(args);
1754
1755 /* We're done with __builtin__ */
1756 Py_DECREF(bltinmod);
1757}
1758
1759
Mark Hammonda2905272002-07-29 13:42:14 +00001760void
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761_PyExc_Fini(void)
Barry Warsaw675ac282000-05-26 19:05:16 +00001762{
1763 int i;
1764
1765 Py_XDECREF(PyExc_MemoryErrorInst);
1766 PyExc_MemoryErrorInst = NULL;
1767
1768 for (i=0; exctable[i].name; i++) {
Barry Warsaw9667ed22001-01-23 16:08:34 +00001769 /* clear the class's dictionary, freeing up circular references
1770 * between the class and its methods.
1771 */
1772 PyObject* cdict = PyObject_GetAttrString(*exctable[i].exc, "__dict__");
1773 PyDict_Clear(cdict);
1774 Py_DECREF(cdict);
1775
1776 /* Now decref the exception class */
Barry Warsaw675ac282000-05-26 19:05:16 +00001777 Py_XDECREF(*exctable[i].exc);
1778 *exctable[i].exc = NULL;
1779 }
1780}