1 /* 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 7 #define PY_SSIZE_T_CLEAN 8 #include <Python.h> 9 #include "structmember.h" 10 #include "osdefs.h" 11 12 #define EXC_MODULE_NAME "exceptions." 13 14 /* NOTE: If the exception class hierarchy changes, don't forget to update 15 * Lib/test/exception_hierarchy.txt 16 */ 17 18 PyDoc_STRVAR(exceptions_doc, "Python's standard exception class hierarchy.\n\ 19 \n\ 20 Exceptions found here are defined both in the exceptions module and the\n\ 21 built-in namespace. It is recommended that user-defined exceptions\n\ 22 inherit from Exception. See the documentation for the exception\n\ 23 inheritance hierarchy.\n\ 24 "); 25 26 /* 27 * BaseException 28 */ 29 static PyObject * 30 BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 31 { 32 PyBaseExceptionObject *self; 33 34 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0); 35 if (!self) 36 return NULL; 37 /* the dict is created on the fly in PyObject_GenericSetAttr */ 38 self->message = self->dict = NULL; 39 40 self->args = PyTuple_New(0); 41 if (!self->args) { 42 Py_DECREF(self); 43 return NULL; 44 } 45 46 self->message = PyString_FromString(""); 47 if (!self->message) { 48 Py_DECREF(self); 49 return NULL; 50 } 51 52 return (PyObject *)self; 53 } 54 55 static int 56 BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds) 57 { 58 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds)) 59 return -1; 60 61 Py_INCREF(args); 62 Py_SETREF(self->args, args); 63 64 if (PyTuple_GET_SIZE(self->args) == 1) { 65 Py_INCREF(PyTuple_GET_ITEM(self->args, 0)); 66 Py_XSETREF(self->message, PyTuple_GET_ITEM(self->args, 0)); 67 } 68 return 0; 69 } 70 71 static int 72 BaseException_clear(PyBaseExceptionObject *self) 73 { 74 Py_CLEAR(self->dict); 75 Py_CLEAR(self->args); 76 Py_CLEAR(self->message); 77 return 0; 78 } 79 80 static void 81 BaseException_dealloc(PyBaseExceptionObject *self) 82 { 83 _PyObject_GC_UNTRACK(self); 84 BaseException_clear(self); 85 Py_TYPE(self)->tp_free((PyObject *)self); 86 } 87 88 static int 89 BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg) 90 { 91 Py_VISIT(self->dict); 92 Py_VISIT(self->args); 93 Py_VISIT(self->message); 94 return 0; 95 } 96 97 static PyObject * 98 BaseException_str(PyBaseExceptionObject *self) 99 { 100 PyObject *out; 101 102 switch (PyTuple_GET_SIZE(self->args)) { 103 case 0: 104 out = PyString_FromString(""); 105 break; 106 case 1: 107 out = PyObject_Str(PyTuple_GET_ITEM(self->args, 0)); 108 break; 109 default: 110 out = PyObject_Str(self->args); 111 break; 112 } 113 114 return out; 115 } 116 117 #ifdef Py_USING_UNICODE 118 static PyObject * 119 BaseException_unicode(PyBaseExceptionObject *self) 120 { 121 PyObject *out; 122 123 /* issue6108: if __str__ has been overridden in the subclass, unicode() 124 should return the message returned by __str__ as used to happen 125 before this method was implemented. */ 126 if (Py_TYPE(self)->tp_str != (reprfunc)BaseException_str) { 127 PyObject *str; 128 /* Unlike PyObject_Str, tp_str can return unicode (i.e. return the 129 equivalent of unicode(e.__str__()) instead of unicode(str(e))). */ 130 str = Py_TYPE(self)->tp_str((PyObject*)self); 131 if (str == NULL) 132 return NULL; 133 out = PyObject_Unicode(str); 134 Py_DECREF(str); 135 return out; 136 } 137 138 switch (PyTuple_GET_SIZE(self->args)) { 139 case 0: 140 out = PyUnicode_FromString(""); 141 break; 142 case 1: 143 out = PyObject_Unicode(PyTuple_GET_ITEM(self->args, 0)); 144 break; 145 default: 146 out = PyObject_Unicode(self->args); 147 break; 148 } 149 150 return out; 151 } 152 #endif 153 154 static PyObject * 155 BaseException_repr(PyBaseExceptionObject *self) 156 { 157 PyObject *repr_suffix; 158 PyObject *repr; 159 char *name; 160 char *dot; 161 162 repr_suffix = PyObject_Repr(self->args); 163 if (!repr_suffix) 164 return NULL; 165 166 name = (char *)Py_TYPE(self)->tp_name; 167 dot = strrchr(name, '.'); 168 if (dot != NULL) name = dot+1; 169 170 repr = PyString_FromString(name); 171 if (!repr) { 172 Py_DECREF(repr_suffix); 173 return NULL; 174 } 175 176 PyString_ConcatAndDel(&repr, repr_suffix); 177 return repr; 178 } 179 180 /* Pickling support */ 181 static PyObject * 182 BaseException_reduce(PyBaseExceptionObject *self) 183 { 184 if (self->args && self->dict) 185 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict); 186 else 187 return PyTuple_Pack(2, Py_TYPE(self), self->args); 188 } 189 190 /* 191 * Needed for backward compatibility, since exceptions used to store 192 * all their attributes in the __dict__. Code is taken from cPickle's 193 * load_build function. 194 */ 195 static PyObject * 196 BaseException_setstate(PyObject *self, PyObject *state) 197 { 198 PyObject *d_key, *d_value; 199 Py_ssize_t i = 0; 200 201 if (state != Py_None) { 202 if (!PyDict_Check(state)) { 203 PyErr_SetString(PyExc_TypeError, "state is not a dictionary"); 204 return NULL; 205 } 206 while (PyDict_Next(state, &i, &d_key, &d_value)) { 207 if (PyObject_SetAttr(self, d_key, d_value) < 0) 208 return NULL; 209 } 210 } 211 Py_RETURN_NONE; 212 } 213 214 215 static PyMethodDef BaseException_methods[] = { 216 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS }, 217 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O }, 218 #ifdef Py_USING_UNICODE 219 {"__unicode__", (PyCFunction)BaseException_unicode, METH_NOARGS }, 220 #endif 221 {NULL, NULL, 0, NULL}, 222 }; 223 224 225 226 static PyObject * 227 BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index) 228 { 229 if (PyErr_WarnPy3k("__getitem__ not supported for exception " 230 "classes in 3.x; use args attribute", 1) < 0) 231 return NULL; 232 return PySequence_GetItem(self->args, index); 233 } 234 235 static PyObject * 236 BaseException_getslice(PyBaseExceptionObject *self, 237 Py_ssize_t start, Py_ssize_t stop) 238 { 239 if (PyErr_WarnPy3k("__getslice__ not supported for exception " 240 "classes in 3.x; use args attribute", 1) < 0) 241 return NULL; 242 return PySequence_GetSlice(self->args, start, stop); 243 } 244 245 static PySequenceMethods BaseException_as_sequence = { 246 0, /* sq_length; */ 247 0, /* sq_concat; */ 248 0, /* sq_repeat; */ 249 (ssizeargfunc)BaseException_getitem, /* sq_item; */ 250 (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */ 251 0, /* sq_ass_item; */ 252 0, /* sq_ass_slice; */ 253 0, /* sq_contains; */ 254 0, /* sq_inplace_concat; */ 255 0 /* sq_inplace_repeat; */ 256 }; 257 258 static PyObject * 259 BaseException_get_dict(PyBaseExceptionObject *self) 260 { 261 if (self->dict == NULL) { 262 self->dict = PyDict_New(); 263 if (!self->dict) 264 return NULL; 265 } 266 Py_INCREF(self->dict); 267 return self->dict; 268 } 269 270 static int 271 BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val) 272 { 273 if (val == NULL) { 274 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted"); 275 return -1; 276 } 277 if (!PyDict_Check(val)) { 278 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary"); 279 return -1; 280 } 281 Py_INCREF(val); 282 Py_XSETREF(self->dict, val); 283 return 0; 284 } 285 286 static PyObject * 287 BaseException_get_args(PyBaseExceptionObject *self) 288 { 289 if (self->args == NULL) { 290 Py_INCREF(Py_None); 291 return Py_None; 292 } 293 Py_INCREF(self->args); 294 return self->args; 295 } 296 297 static int 298 BaseException_set_args(PyBaseExceptionObject *self, PyObject *val) 299 { 300 PyObject *seq; 301 if (val == NULL) { 302 PyErr_SetString(PyExc_TypeError, "args may not be deleted"); 303 return -1; 304 } 305 seq = PySequence_Tuple(val); 306 if (!seq) 307 return -1; 308 Py_XSETREF(self->args, seq); 309 return 0; 310 } 311 312 static PyObject * 313 BaseException_get_message(PyBaseExceptionObject *self) 314 { 315 PyObject *msg; 316 317 /* if "message" is in self->dict, accessing a user-set message attribute */ 318 if (self->dict && 319 (msg = PyDict_GetItemString(self->dict, "message"))) { 320 Py_INCREF(msg); 321 return msg; 322 } 323 324 if (self->message == NULL) { 325 PyErr_SetString(PyExc_AttributeError, "message attribute was deleted"); 326 return NULL; 327 } 328 329 /* accessing the deprecated "builtin" message attribute of Exception */ 330 if (PyErr_WarnEx(PyExc_DeprecationWarning, 331 "BaseException.message has been deprecated as " 332 "of Python 2.6", 1) < 0) 333 return NULL; 334 335 Py_INCREF(self->message); 336 return self->message; 337 } 338 339 static int 340 BaseException_set_message(PyBaseExceptionObject *self, PyObject *val) 341 { 342 /* if val is NULL, delete the message attribute */ 343 if (val == NULL) { 344 if (self->dict && PyDict_GetItemString(self->dict, "message")) { 345 if (PyDict_DelItemString(self->dict, "message") < 0) 346 return -1; 347 } 348 Py_CLEAR(self->message); 349 return 0; 350 } 351 352 /* else set it in __dict__, but may need to create the dict first */ 353 if (self->dict == NULL) { 354 self->dict = PyDict_New(); 355 if (!self->dict) 356 return -1; 357 } 358 return PyDict_SetItemString(self->dict, "message", val); 359 } 360 361 static PyGetSetDef BaseException_getset[] = { 362 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict}, 363 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args}, 364 {"message", (getter)BaseException_get_message, 365 (setter)BaseException_set_message}, 366 {NULL}, 367 }; 368 369 370 static PyTypeObject _PyExc_BaseException = { 371 PyObject_HEAD_INIT(NULL) 372 0, /*ob_size*/ 373 EXC_MODULE_NAME "BaseException", /*tp_name*/ 374 sizeof(PyBaseExceptionObject), /*tp_basicsize*/ 375 0, /*tp_itemsize*/ 376 (destructor)BaseException_dealloc, /*tp_dealloc*/ 377 0, /*tp_print*/ 378 0, /*tp_getattr*/ 379 0, /*tp_setattr*/ 380 0, /* tp_compare; */ 381 (reprfunc)BaseException_repr, /*tp_repr*/ 382 0, /*tp_as_number*/ 383 &BaseException_as_sequence, /*tp_as_sequence*/ 384 0, /*tp_as_mapping*/ 385 0, /*tp_hash */ 386 0, /*tp_call*/ 387 (reprfunc)BaseException_str, /*tp_str*/ 388 PyObject_GenericGetAttr, /*tp_getattro*/ 389 PyObject_GenericSetAttr, /*tp_setattro*/ 390 0, /*tp_as_buffer*/ 391 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | 392 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/ 393 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */ 394 (traverseproc)BaseException_traverse, /* tp_traverse */ 395 (inquiry)BaseException_clear, /* tp_clear */ 396 0, /* tp_richcompare */ 397 0, /* tp_weaklistoffset */ 398 0, /* tp_iter */ 399 0, /* tp_iternext */ 400 BaseException_methods, /* tp_methods */ 401 0, /* tp_members */ 402 BaseException_getset, /* tp_getset */ 403 0, /* tp_base */ 404 0, /* tp_dict */ 405 0, /* tp_descr_get */ 406 0, /* tp_descr_set */ 407 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */ 408 (initproc)BaseException_init, /* tp_init */ 409 0, /* tp_alloc */ 410 BaseException_new, /* tp_new */ 411 }; 412 /* the CPython API expects exceptions to be (PyObject *) - both a hold-over 413 from the previous implmentation and also allowing Python objects to be used 414 in the API */ 415 PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException; 416 417 /* note these macros omit the last semicolon so the macro invocation may 418 * include it and not look strange. 419 */ 420 #define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \ 421 static PyTypeObject _PyExc_ ## EXCNAME = { \ 422 PyObject_HEAD_INIT(NULL) \ 423 0, \ 424 EXC_MODULE_NAME # EXCNAME, \ 425 sizeof(PyBaseExceptionObject), \ 426 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \ 427 0, 0, 0, 0, 0, 0, 0, \ 428 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \ 429 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \ 430 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \ 431 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \ 432 (initproc)BaseException_init, 0, BaseException_new,\ 433 }; \ 434 PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME 435 436 #define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \ 437 static PyTypeObject _PyExc_ ## EXCNAME = { \ 438 PyObject_HEAD_INIT(NULL) \ 439 0, \ 440 EXC_MODULE_NAME # EXCNAME, \ 441 sizeof(Py ## EXCSTORE ## Object), \ 442 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 443 0, 0, 0, 0, 0, \ 444 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \ 445 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \ 446 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \ 447 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \ 448 (initproc)EXCSTORE ## _init, 0, BaseException_new,\ 449 }; \ 450 PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME 451 452 #define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \ 453 static PyTypeObject _PyExc_ ## EXCNAME = { \ 454 PyObject_HEAD_INIT(NULL) \ 455 0, \ 456 EXC_MODULE_NAME # EXCNAME, \ 457 sizeof(Py ## EXCSTORE ## Object), 0, \ 458 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 459 (reprfunc)EXCSTR, 0, 0, 0, \ 460 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \ 461 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \ 462 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \ 463 EXCMEMBERS, 0, &_ ## EXCBASE, \ 464 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \ 465 (initproc)EXCSTORE ## _init, 0, BaseException_new,\ 466 }; \ 467 PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME 468 469 470 /* 471 * Exception extends BaseException 472 */ 473 SimpleExtendsException(PyExc_BaseException, Exception, 474 "Common base class for all non-exit exceptions."); 475 476 477 /* 478 * StandardError extends Exception 479 */ 480 SimpleExtendsException(PyExc_Exception, StandardError, 481 "Base class for all standard Python exceptions that do not represent\n" 482 "interpreter exiting."); 483 484 485 /* 486 * TypeError extends StandardError 487 */ 488 SimpleExtendsException(PyExc_StandardError, TypeError, 489 "Inappropriate argument type."); 490 491 492 /* 493 * StopIteration extends Exception 494 */ 495 SimpleExtendsException(PyExc_Exception, StopIteration, 496 "Signal the end from iterator.next()."); 497 498 499 /* 500 * GeneratorExit extends BaseException 501 */ 502 SimpleExtendsException(PyExc_BaseException, GeneratorExit, 503 "Request that a generator exit."); 504 505 506 /* 507 * SystemExit extends BaseException 508 */ 509 510 static int 511 SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds) 512 { 513 Py_ssize_t size = PyTuple_GET_SIZE(args); 514 515 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 516 return -1; 517 518 if (size == 0) 519 return 0; 520 if (size == 1) { 521 Py_INCREF(PyTuple_GET_ITEM(args, 0)); 522 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0)); 523 } 524 else { /* size > 1 */ 525 Py_INCREF(args); 526 Py_XSETREF(self->code, args); 527 } 528 return 0; 529 } 530 531 static int 532 SystemExit_clear(PySystemExitObject *self) 533 { 534 Py_CLEAR(self->code); 535 return BaseException_clear((PyBaseExceptionObject *)self); 536 } 537 538 static void 539 SystemExit_dealloc(PySystemExitObject *self) 540 { 541 _PyObject_GC_UNTRACK(self); 542 SystemExit_clear(self); 543 Py_TYPE(self)->tp_free((PyObject *)self); 544 } 545 546 static int 547 SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg) 548 { 549 Py_VISIT(self->code); 550 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); 551 } 552 553 static PyMemberDef SystemExit_members[] = { 554 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0, 555 PyDoc_STR("exception code")}, 556 {NULL} /* Sentinel */ 557 }; 558 559 ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit, 560 SystemExit_dealloc, 0, SystemExit_members, 0, 561 "Request to exit from the interpreter."); 562 563 /* 564 * KeyboardInterrupt extends BaseException 565 */ 566 SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt, 567 "Program interrupted by user."); 568 569 570 /* 571 * ImportError extends StandardError 572 */ 573 SimpleExtendsException(PyExc_StandardError, ImportError, 574 "Import can't find module, or can't find name in module."); 575 576 577 /* 578 * EnvironmentError extends StandardError 579 */ 580 581 /* Where a function has a single filename, such as open() or some 582 * of the os module functions, PyErr_SetFromErrnoWithFilename() is 583 * called, giving a third argument which is the filename. But, so 584 * that old code using in-place unpacking doesn't break, e.g.: 585 * 586 * except IOError, (errno, strerror): 587 * 588 * we hack args so that it only contains two items. This also 589 * means we need our own __str__() which prints out the filename 590 * when it was supplied. 591 */ 592 static int 593 EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args, 594 PyObject *kwds) 595 { 596 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL; 597 PyObject *subslice = NULL; 598 599 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 600 return -1; 601 602 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) { 603 return 0; 604 } 605 606 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3, 607 &myerrno, &strerror, &filename)) { 608 return -1; 609 } 610 Py_INCREF(myerrno); 611 Py_XSETREF(self->myerrno, myerrno); 612 613 Py_INCREF(strerror); 614 Py_XSETREF(self->strerror, strerror); 615 616 /* self->filename will remain Py_None otherwise */ 617 if (filename != NULL) { 618 Py_INCREF(filename); 619 Py_XSETREF(self->filename, filename); 620 621 subslice = PyTuple_GetSlice(args, 0, 2); 622 if (!subslice) 623 return -1; 624 625 Py_SETREF(self->args, subslice); 626 } 627 return 0; 628 } 629 630 static int 631 EnvironmentError_clear(PyEnvironmentErrorObject *self) 632 { 633 Py_CLEAR(self->myerrno); 634 Py_CLEAR(self->strerror); 635 Py_CLEAR(self->filename); 636 return BaseException_clear((PyBaseExceptionObject *)self); 637 } 638 639 static void 640 EnvironmentError_dealloc(PyEnvironmentErrorObject *self) 641 { 642 _PyObject_GC_UNTRACK(self); 643 EnvironmentError_clear(self); 644 Py_TYPE(self)->tp_free((PyObject *)self); 645 } 646 647 static int 648 EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit, 649 void *arg) 650 { 651 Py_VISIT(self->myerrno); 652 Py_VISIT(self->strerror); 653 Py_VISIT(self->filename); 654 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); 655 } 656 657 static PyObject * 658 EnvironmentError_str(PyEnvironmentErrorObject *self) 659 { 660 PyObject *rtnval = NULL; 661 662 if (self->filename) { 663 PyObject *fmt; 664 PyObject *repr; 665 PyObject *tuple; 666 667 fmt = PyString_FromString("[Errno %s] %s: %s"); 668 if (!fmt) 669 return NULL; 670 671 repr = PyObject_Repr(self->filename); 672 if (!repr) { 673 Py_DECREF(fmt); 674 return NULL; 675 } 676 tuple = PyTuple_New(3); 677 if (!tuple) { 678 Py_DECREF(repr); 679 Py_DECREF(fmt); 680 return NULL; 681 } 682 683 if (self->myerrno) { 684 Py_INCREF(self->myerrno); 685 PyTuple_SET_ITEM(tuple, 0, self->myerrno); 686 } 687 else { 688 Py_INCREF(Py_None); 689 PyTuple_SET_ITEM(tuple, 0, Py_None); 690 } 691 if (self->strerror) { 692 Py_INCREF(self->strerror); 693 PyTuple_SET_ITEM(tuple, 1, self->strerror); 694 } 695 else { 696 Py_INCREF(Py_None); 697 PyTuple_SET_ITEM(tuple, 1, Py_None); 698 } 699 700 PyTuple_SET_ITEM(tuple, 2, repr); 701 702 rtnval = PyString_Format(fmt, tuple); 703 704 Py_DECREF(fmt); 705 Py_DECREF(tuple); 706 } 707 else if (self->myerrno && self->strerror) { 708 PyObject *fmt; 709 PyObject *tuple; 710 711 fmt = PyString_FromString("[Errno %s] %s"); 712 if (!fmt) 713 return NULL; 714 715 tuple = PyTuple_New(2); 716 if (!tuple) { 717 Py_DECREF(fmt); 718 return NULL; 719 } 720 721 if (self->myerrno) { 722 Py_INCREF(self->myerrno); 723 PyTuple_SET_ITEM(tuple, 0, self->myerrno); 724 } 725 else { 726 Py_INCREF(Py_None); 727 PyTuple_SET_ITEM(tuple, 0, Py_None); 728 } 729 if (self->strerror) { 730 Py_INCREF(self->strerror); 731 PyTuple_SET_ITEM(tuple, 1, self->strerror); 732 } 733 else { 734 Py_INCREF(Py_None); 735 PyTuple_SET_ITEM(tuple, 1, Py_None); 736 } 737 738 rtnval = PyString_Format(fmt, tuple); 739 740 Py_DECREF(fmt); 741 Py_DECREF(tuple); 742 } 743 else 744 rtnval = BaseException_str((PyBaseExceptionObject *)self); 745 746 return rtnval; 747 } 748 749 static PyMemberDef EnvironmentError_members[] = { 750 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0, 751 PyDoc_STR("exception errno")}, 752 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0, 753 PyDoc_STR("exception strerror")}, 754 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0, 755 PyDoc_STR("exception filename")}, 756 {NULL} /* Sentinel */ 757 }; 758 759 760 static PyObject * 761 EnvironmentError_reduce(PyEnvironmentErrorObject *self) 762 { 763 PyObject *args = self->args; 764 PyObject *res = NULL, *tmp; 765 766 /* self->args is only the first two real arguments if there was a 767 * file name given to EnvironmentError. */ 768 if (PyTuple_GET_SIZE(args) == 2 && self->filename) { 769 args = PyTuple_New(3); 770 if (!args) 771 return NULL; 772 773 tmp = PyTuple_GET_ITEM(self->args, 0); 774 Py_INCREF(tmp); 775 PyTuple_SET_ITEM(args, 0, tmp); 776 777 tmp = PyTuple_GET_ITEM(self->args, 1); 778 Py_INCREF(tmp); 779 PyTuple_SET_ITEM(args, 1, tmp); 780 781 Py_INCREF(self->filename); 782 PyTuple_SET_ITEM(args, 2, self->filename); 783 } else 784 Py_INCREF(args); 785 786 if (self->dict) 787 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict); 788 else 789 res = PyTuple_Pack(2, Py_TYPE(self), args); 790 Py_DECREF(args); 791 return res; 792 } 793 794 795 static PyMethodDef EnvironmentError_methods[] = { 796 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS}, 797 {NULL} 798 }; 799 800 ComplexExtendsException(PyExc_StandardError, EnvironmentError, 801 EnvironmentError, EnvironmentError_dealloc, 802 EnvironmentError_methods, EnvironmentError_members, 803 EnvironmentError_str, 804 "Base class for I/O related errors."); 805 806 807 /* 808 * IOError extends EnvironmentError 809 */ 810 MiddlingExtendsException(PyExc_EnvironmentError, IOError, 811 EnvironmentError, "I/O operation failed."); 812 813 814 /* 815 * OSError extends EnvironmentError 816 */ 817 MiddlingExtendsException(PyExc_EnvironmentError, OSError, 818 EnvironmentError, "OS system call failed."); 819 820 821 /* 822 * WindowsError extends OSError 823 */ 824 #ifdef MS_WINDOWS 825 #include "errmap.h" 826 827 static int 828 WindowsError_clear(PyWindowsErrorObject *self) 829 { 830 Py_CLEAR(self->myerrno); 831 Py_CLEAR(self->strerror); 832 Py_CLEAR(self->filename); 833 Py_CLEAR(self->winerror); 834 return BaseException_clear((PyBaseExceptionObject *)self); 835 } 836 837 static void 838 WindowsError_dealloc(PyWindowsErrorObject *self) 839 { 840 _PyObject_GC_UNTRACK(self); 841 WindowsError_clear(self); 842 Py_TYPE(self)->tp_free((PyObject *)self); 843 } 844 845 static int 846 WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg) 847 { 848 Py_VISIT(self->myerrno); 849 Py_VISIT(self->strerror); 850 Py_VISIT(self->filename); 851 Py_VISIT(self->winerror); 852 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); 853 } 854 855 static int 856 WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds) 857 { 858 PyObject *o_errcode = NULL; 859 long errcode; 860 long posix_errno; 861 862 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds) 863 == -1) 864 return -1; 865 866 if (self->myerrno == NULL) 867 return 0; 868 869 /* Set errno to the POSIX errno, and winerror to the Win32 870 error code. */ 871 errcode = PyInt_AsLong(self->myerrno); 872 if (errcode == -1 && PyErr_Occurred()) 873 return -1; 874 posix_errno = winerror_to_errno(errcode); 875 876 Py_XSETREF(self->winerror, self->myerrno); 877 878 o_errcode = PyInt_FromLong(posix_errno); 879 if (!o_errcode) 880 return -1; 881 882 self->myerrno = o_errcode; 883 884 return 0; 885 } 886 887 888 static PyObject * 889 WindowsError_str(PyWindowsErrorObject *self) 890 { 891 PyObject *rtnval = NULL; 892 893 if (self->filename) { 894 PyObject *fmt; 895 PyObject *repr; 896 PyObject *tuple; 897 898 fmt = PyString_FromString("[Error %s] %s: %s"); 899 if (!fmt) 900 return NULL; 901 902 repr = PyObject_Repr(self->filename); 903 if (!repr) { 904 Py_DECREF(fmt); 905 return NULL; 906 } 907 tuple = PyTuple_New(3); 908 if (!tuple) { 909 Py_DECREF(repr); 910 Py_DECREF(fmt); 911 return NULL; 912 } 913 914 if (self->winerror) { 915 Py_INCREF(self->winerror); 916 PyTuple_SET_ITEM(tuple, 0, self->winerror); 917 } 918 else { 919 Py_INCREF(Py_None); 920 PyTuple_SET_ITEM(tuple, 0, Py_None); 921 } 922 if (self->strerror) { 923 Py_INCREF(self->strerror); 924 PyTuple_SET_ITEM(tuple, 1, self->strerror); 925 } 926 else { 927 Py_INCREF(Py_None); 928 PyTuple_SET_ITEM(tuple, 1, Py_None); 929 } 930 931 PyTuple_SET_ITEM(tuple, 2, repr); 932 933 rtnval = PyString_Format(fmt, tuple); 934 935 Py_DECREF(fmt); 936 Py_DECREF(tuple); 937 } 938 else if (self->winerror && self->strerror) { 939 PyObject *fmt; 940 PyObject *tuple; 941 942 fmt = PyString_FromString("[Error %s] %s"); 943 if (!fmt) 944 return NULL; 945 946 tuple = PyTuple_New(2); 947 if (!tuple) { 948 Py_DECREF(fmt); 949 return NULL; 950 } 951 952 if (self->winerror) { 953 Py_INCREF(self->winerror); 954 PyTuple_SET_ITEM(tuple, 0, self->winerror); 955 } 956 else { 957 Py_INCREF(Py_None); 958 PyTuple_SET_ITEM(tuple, 0, Py_None); 959 } 960 if (self->strerror) { 961 Py_INCREF(self->strerror); 962 PyTuple_SET_ITEM(tuple, 1, self->strerror); 963 } 964 else { 965 Py_INCREF(Py_None); 966 PyTuple_SET_ITEM(tuple, 1, Py_None); 967 } 968 969 rtnval = PyString_Format(fmt, tuple); 970 971 Py_DECREF(fmt); 972 Py_DECREF(tuple); 973 } 974 else 975 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self); 976 977 return rtnval; 978 } 979 980 static PyMemberDef WindowsError_members[] = { 981 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0, 982 PyDoc_STR("POSIX exception code")}, 983 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0, 984 PyDoc_STR("exception strerror")}, 985 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0, 986 PyDoc_STR("exception filename")}, 987 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0, 988 PyDoc_STR("Win32 exception code")}, 989 {NULL} /* Sentinel */ 990 }; 991 992 ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError, 993 WindowsError_dealloc, 0, WindowsError_members, 994 WindowsError_str, "MS-Windows OS system call failed."); 995 996 #endif /* MS_WINDOWS */ 997 998 999 /* 1000 * VMSError extends OSError (I think) 1001 */ 1002 #ifdef __VMS 1003 MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError, 1004 "OpenVMS OS system call failed."); 1005 #endif 1006 1007 1008 /* 1009 * EOFError extends StandardError 1010 */ 1011 SimpleExtendsException(PyExc_StandardError, EOFError, 1012 "Read beyond end of file."); 1013 1014 1015 /* 1016 * RuntimeError extends StandardError 1017 */ 1018 SimpleExtendsException(PyExc_StandardError, RuntimeError, 1019 "Unspecified run-time error."); 1020 1021 1022 /* 1023 * NotImplementedError extends RuntimeError 1024 */ 1025 SimpleExtendsException(PyExc_RuntimeError, NotImplementedError, 1026 "Method or function hasn't been implemented yet."); 1027 1028 /* 1029 * NameError extends StandardError 1030 */ 1031 SimpleExtendsException(PyExc_StandardError, NameError, 1032 "Name not found globally."); 1033 1034 /* 1035 * UnboundLocalError extends NameError 1036 */ 1037 SimpleExtendsException(PyExc_NameError, UnboundLocalError, 1038 "Local name referenced but not bound to a value."); 1039 1040 /* 1041 * AttributeError extends StandardError 1042 */ 1043 SimpleExtendsException(PyExc_StandardError, AttributeError, 1044 "Attribute not found."); 1045 1046 1047 /* 1048 * SyntaxError extends StandardError 1049 */ 1050 1051 static int 1052 SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds) 1053 { 1054 PyObject *info = NULL; 1055 Py_ssize_t lenargs = PyTuple_GET_SIZE(args); 1056 1057 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 1058 return -1; 1059 1060 if (lenargs >= 1) { 1061 Py_INCREF(PyTuple_GET_ITEM(args, 0)); 1062 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0)); 1063 } 1064 if (lenargs == 2) { 1065 info = PyTuple_GET_ITEM(args, 1); 1066 info = PySequence_Tuple(info); 1067 if (!info) 1068 return -1; 1069 1070 if (PyTuple_GET_SIZE(info) != 4) { 1071 /* not a very good error message, but it's what Python 2.4 gives */ 1072 PyErr_SetString(PyExc_IndexError, "tuple index out of range"); 1073 Py_DECREF(info); 1074 return -1; 1075 } 1076 1077 Py_INCREF(PyTuple_GET_ITEM(info, 0)); 1078 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0)); 1079 1080 Py_INCREF(PyTuple_GET_ITEM(info, 1)); 1081 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1)); 1082 1083 Py_INCREF(PyTuple_GET_ITEM(info, 2)); 1084 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2)); 1085 1086 Py_INCREF(PyTuple_GET_ITEM(info, 3)); 1087 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3)); 1088 1089 Py_DECREF(info); 1090 } 1091 return 0; 1092 } 1093 1094 static int 1095 SyntaxError_clear(PySyntaxErrorObject *self) 1096 { 1097 Py_CLEAR(self->msg); 1098 Py_CLEAR(self->filename); 1099 Py_CLEAR(self->lineno); 1100 Py_CLEAR(self->offset); 1101 Py_CLEAR(self->text); 1102 Py_CLEAR(self->print_file_and_line); 1103 return BaseException_clear((PyBaseExceptionObject *)self); 1104 } 1105 1106 static void 1107 SyntaxError_dealloc(PySyntaxErrorObject *self) 1108 { 1109 _PyObject_GC_UNTRACK(self); 1110 SyntaxError_clear(self); 1111 Py_TYPE(self)->tp_free((PyObject *)self); 1112 } 1113 1114 static int 1115 SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg) 1116 { 1117 Py_VISIT(self->msg); 1118 Py_VISIT(self->filename); 1119 Py_VISIT(self->lineno); 1120 Py_VISIT(self->offset); 1121 Py_VISIT(self->text); 1122 Py_VISIT(self->print_file_and_line); 1123 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); 1124 } 1125 1126 /* This is called "my_basename" instead of just "basename" to avoid name 1127 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is 1128 defined, and Python does define that. */ 1129 static char * 1130 my_basename(char *name) 1131 { 1132 char *cp = name; 1133 char *result = name; 1134 1135 if (name == NULL) 1136 return "???"; 1137 while (*cp != '\0') { 1138 if (*cp == SEP) 1139 result = cp + 1; 1140 ++cp; 1141 } 1142 return result; 1143 } 1144 1145 1146 static PyObject * 1147 SyntaxError_str(PySyntaxErrorObject *self) 1148 { 1149 PyObject *str; 1150 PyObject *result; 1151 int have_filename = 0; 1152 int have_lineno = 0; 1153 char *buffer = NULL; 1154 Py_ssize_t bufsize; 1155 1156 if (self->msg) 1157 str = PyObject_Str(self->msg); 1158 else 1159 str = PyObject_Str(Py_None); 1160 if (!str) 1161 return NULL; 1162 /* Don't fiddle with non-string return (shouldn't happen anyway) */ 1163 if (!PyString_Check(str)) 1164 return str; 1165 1166 /* XXX -- do all the additional formatting with filename and 1167 lineno here */ 1168 1169 have_filename = (self->filename != NULL) && 1170 PyString_Check(self->filename); 1171 have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno); 1172 1173 if (!have_filename && !have_lineno) 1174 return str; 1175 1176 bufsize = PyString_GET_SIZE(str) + 64; 1177 if (have_filename) 1178 bufsize += PyString_GET_SIZE(self->filename); 1179 1180 buffer = PyMem_MALLOC(bufsize); 1181 if (buffer == NULL) 1182 return str; 1183 1184 if (have_filename && have_lineno) 1185 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)", 1186 PyString_AS_STRING(str), 1187 my_basename(PyString_AS_STRING(self->filename)), 1188 PyInt_AsLong(self->lineno)); 1189 else if (have_filename) 1190 PyOS_snprintf(buffer, bufsize, "%s (%s)", 1191 PyString_AS_STRING(str), 1192 my_basename(PyString_AS_STRING(self->filename))); 1193 else /* only have_lineno */ 1194 PyOS_snprintf(buffer, bufsize, "%s (line %ld)", 1195 PyString_AS_STRING(str), 1196 PyInt_AsLong(self->lineno)); 1197 1198 result = PyString_FromString(buffer); 1199 PyMem_FREE(buffer); 1200 1201 if (result == NULL) 1202 result = str; 1203 else 1204 Py_DECREF(str); 1205 return result; 1206 } 1207 1208 static PyMemberDef SyntaxError_members[] = { 1209 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0, 1210 PyDoc_STR("exception msg")}, 1211 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0, 1212 PyDoc_STR("exception filename")}, 1213 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0, 1214 PyDoc_STR("exception lineno")}, 1215 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0, 1216 PyDoc_STR("exception offset")}, 1217 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0, 1218 PyDoc_STR("exception text")}, 1219 {"print_file_and_line", T_OBJECT, 1220 offsetof(PySyntaxErrorObject, print_file_and_line), 0, 1221 PyDoc_STR("exception print_file_and_line")}, 1222 {NULL} /* Sentinel */ 1223 }; 1224 1225 ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError, 1226 SyntaxError_dealloc, 0, SyntaxError_members, 1227 SyntaxError_str, "Invalid syntax."); 1228 1229 1230 /* 1231 * IndentationError extends SyntaxError 1232 */ 1233 MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError, 1234 "Improper indentation."); 1235 1236 1237 /* 1238 * TabError extends IndentationError 1239 */ 1240 MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError, 1241 "Improper mixture of spaces and tabs."); 1242 1243 1244 /* 1245 * LookupError extends StandardError 1246 */ 1247 SimpleExtendsException(PyExc_StandardError, LookupError, 1248 "Base class for lookup errors."); 1249 1250 1251 /* 1252 * IndexError extends LookupError 1253 */ 1254 SimpleExtendsException(PyExc_LookupError, IndexError, 1255 "Sequence index out of range."); 1256 1257 1258 /* 1259 * KeyError extends LookupError 1260 */ 1261 static PyObject * 1262 KeyError_str(PyBaseExceptionObject *self) 1263 { 1264 /* If args is a tuple of exactly one item, apply repr to args[0]. 1265 This is done so that e.g. the exception raised by {}[''] prints 1266 KeyError: '' 1267 rather than the confusing 1268 KeyError 1269 alone. The downside is that if KeyError is raised with an explanatory 1270 string, that string will be displayed in quotes. Too bad. 1271 If args is anything else, use the default BaseException__str__(). 1272 */ 1273 if (PyTuple_GET_SIZE(self->args) == 1) { 1274 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0)); 1275 } 1276 return BaseException_str(self); 1277 } 1278 1279 ComplexExtendsException(PyExc_LookupError, KeyError, BaseException, 1280 0, 0, 0, KeyError_str, "Mapping key not found."); 1281 1282 1283 /* 1284 * ValueError extends StandardError 1285 */ 1286 SimpleExtendsException(PyExc_StandardError, ValueError, 1287 "Inappropriate argument value (of correct type)."); 1288 1289 /* 1290 * UnicodeError extends ValueError 1291 */ 1292 1293 SimpleExtendsException(PyExc_ValueError, UnicodeError, 1294 "Unicode related error."); 1295 1296 #ifdef Py_USING_UNICODE 1297 static PyObject * 1298 get_string(PyObject *attr, const char *name) 1299 { 1300 if (!attr) { 1301 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name); 1302 return NULL; 1303 } 1304 1305 if (!PyString_Check(attr)) { 1306 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name); 1307 return NULL; 1308 } 1309 Py_INCREF(attr); 1310 return attr; 1311 } 1312 1313 1314 static int 1315 set_string(PyObject **attr, const char *value) 1316 { 1317 PyObject *obj = PyString_FromString(value); 1318 if (!obj) 1319 return -1; 1320 Py_XSETREF(*attr, obj); 1321 return 0; 1322 } 1323 1324 1325 static PyObject * 1326 get_unicode(PyObject *attr, const char *name) 1327 { 1328 if (!attr) { 1329 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name); 1330 return NULL; 1331 } 1332 1333 if (!PyUnicode_Check(attr)) { 1334 PyErr_Format(PyExc_TypeError, 1335 "%.200s attribute must be unicode", name); 1336 return NULL; 1337 } 1338 Py_INCREF(attr); 1339 return attr; 1340 } 1341 1342 PyObject * 1343 PyUnicodeEncodeError_GetEncoding(PyObject *exc) 1344 { 1345 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding"); 1346 } 1347 1348 PyObject * 1349 PyUnicodeDecodeError_GetEncoding(PyObject *exc) 1350 { 1351 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding"); 1352 } 1353 1354 PyObject * 1355 PyUnicodeEncodeError_GetObject(PyObject *exc) 1356 { 1357 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object"); 1358 } 1359 1360 PyObject * 1361 PyUnicodeDecodeError_GetObject(PyObject *exc) 1362 { 1363 return get_string(((PyUnicodeErrorObject *)exc)->object, "object"); 1364 } 1365 1366 PyObject * 1367 PyUnicodeTranslateError_GetObject(PyObject *exc) 1368 { 1369 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object"); 1370 } 1371 1372 int 1373 PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start) 1374 { 1375 Py_ssize_t size; 1376 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object, 1377 "object"); 1378 if (!obj) 1379 return -1; 1380 *start = ((PyUnicodeErrorObject *)exc)->start; 1381 size = PyUnicode_GET_SIZE(obj); 1382 if (*start<0) 1383 *start = 0; /*XXX check for values <0*/ 1384 if (*start>=size) 1385 *start = size-1; 1386 Py_DECREF(obj); 1387 return 0; 1388 } 1389 1390 1391 int 1392 PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start) 1393 { 1394 Py_ssize_t size; 1395 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, 1396 "object"); 1397 if (!obj) 1398 return -1; 1399 size = PyString_GET_SIZE(obj); 1400 *start = ((PyUnicodeErrorObject *)exc)->start; 1401 if (*start<0) 1402 *start = 0; 1403 if (*start>=size) 1404 *start = size-1; 1405 Py_DECREF(obj); 1406 return 0; 1407 } 1408 1409 1410 int 1411 PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start) 1412 { 1413 return PyUnicodeEncodeError_GetStart(exc, start); 1414 } 1415 1416 1417 int 1418 PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start) 1419 { 1420 ((PyUnicodeErrorObject *)exc)->start = start; 1421 return 0; 1422 } 1423 1424 1425 int 1426 PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start) 1427 { 1428 ((PyUnicodeErrorObject *)exc)->start = start; 1429 return 0; 1430 } 1431 1432 1433 int 1434 PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start) 1435 { 1436 ((PyUnicodeErrorObject *)exc)->start = start; 1437 return 0; 1438 } 1439 1440 1441 int 1442 PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end) 1443 { 1444 Py_ssize_t size; 1445 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object, 1446 "object"); 1447 if (!obj) 1448 return -1; 1449 *end = ((PyUnicodeErrorObject *)exc)->end; 1450 size = PyUnicode_GET_SIZE(obj); 1451 if (*end<1) 1452 *end = 1; 1453 if (*end>size) 1454 *end = size; 1455 Py_DECREF(obj); 1456 return 0; 1457 } 1458 1459 1460 int 1461 PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end) 1462 { 1463 Py_ssize_t size; 1464 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, 1465 "object"); 1466 if (!obj) 1467 return -1; 1468 *end = ((PyUnicodeErrorObject *)exc)->end; 1469 size = PyString_GET_SIZE(obj); 1470 if (*end<1) 1471 *end = 1; 1472 if (*end>size) 1473 *end = size; 1474 Py_DECREF(obj); 1475 return 0; 1476 } 1477 1478 1479 int 1480 PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start) 1481 { 1482 return PyUnicodeEncodeError_GetEnd(exc, start); 1483 } 1484 1485 1486 int 1487 PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end) 1488 { 1489 ((PyUnicodeErrorObject *)exc)->end = end; 1490 return 0; 1491 } 1492 1493 1494 int 1495 PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end) 1496 { 1497 ((PyUnicodeErrorObject *)exc)->end = end; 1498 return 0; 1499 } 1500 1501 1502 int 1503 PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end) 1504 { 1505 ((PyUnicodeErrorObject *)exc)->end = end; 1506 return 0; 1507 } 1508 1509 PyObject * 1510 PyUnicodeEncodeError_GetReason(PyObject *exc) 1511 { 1512 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason"); 1513 } 1514 1515 1516 PyObject * 1517 PyUnicodeDecodeError_GetReason(PyObject *exc) 1518 { 1519 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason"); 1520 } 1521 1522 1523 PyObject * 1524 PyUnicodeTranslateError_GetReason(PyObject *exc) 1525 { 1526 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason"); 1527 } 1528 1529 1530 int 1531 PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason) 1532 { 1533 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason); 1534 } 1535 1536 1537 int 1538 PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason) 1539 { 1540 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason); 1541 } 1542 1543 1544 int 1545 PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason) 1546 { 1547 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason); 1548 } 1549 1550 1551 static int 1552 UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds, 1553 PyTypeObject *objecttype) 1554 { 1555 Py_CLEAR(self->encoding); 1556 Py_CLEAR(self->object); 1557 Py_CLEAR(self->reason); 1558 1559 if (!PyArg_ParseTuple(args, "O!O!nnO!", 1560 &PyString_Type, &self->encoding, 1561 objecttype, &self->object, 1562 &self->start, 1563 &self->end, 1564 &PyString_Type, &self->reason)) { 1565 self->encoding = self->object = self->reason = NULL; 1566 return -1; 1567 } 1568 1569 Py_INCREF(self->encoding); 1570 Py_INCREF(self->object); 1571 Py_INCREF(self->reason); 1572 1573 return 0; 1574 } 1575 1576 static int 1577 UnicodeError_clear(PyUnicodeErrorObject *self) 1578 { 1579 Py_CLEAR(self->encoding); 1580 Py_CLEAR(self->object); 1581 Py_CLEAR(self->reason); 1582 return BaseException_clear((PyBaseExceptionObject *)self); 1583 } 1584 1585 static void 1586 UnicodeError_dealloc(PyUnicodeErrorObject *self) 1587 { 1588 _PyObject_GC_UNTRACK(self); 1589 UnicodeError_clear(self); 1590 Py_TYPE(self)->tp_free((PyObject *)self); 1591 } 1592 1593 static int 1594 UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg) 1595 { 1596 Py_VISIT(self->encoding); 1597 Py_VISIT(self->object); 1598 Py_VISIT(self->reason); 1599 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); 1600 } 1601 1602 static PyMemberDef UnicodeError_members[] = { 1603 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0, 1604 PyDoc_STR("exception encoding")}, 1605 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0, 1606 PyDoc_STR("exception object")}, 1607 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0, 1608 PyDoc_STR("exception start")}, 1609 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0, 1610 PyDoc_STR("exception end")}, 1611 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0, 1612 PyDoc_STR("exception reason")}, 1613 {NULL} /* Sentinel */ 1614 }; 1615 1616 1617 /* 1618 * UnicodeEncodeError extends UnicodeError 1619 */ 1620 1621 static int 1622 UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds) 1623 { 1624 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 1625 return -1; 1626 return UnicodeError_init((PyUnicodeErrorObject *)self, args, 1627 kwds, &PyUnicode_Type); 1628 } 1629 1630 static PyObject * 1631 UnicodeEncodeError_str(PyObject *self) 1632 { 1633 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; 1634 PyObject *result = NULL; 1635 PyObject *reason_str = NULL; 1636 PyObject *encoding_str = NULL; 1637 1638 if (!uself->object) 1639 /* Not properly initialized. */ 1640 return PyUnicode_FromString(""); 1641 1642 /* Get reason and encoding as strings, which they might not be if 1643 they've been modified after we were constructed. */ 1644 reason_str = PyObject_Str(uself->reason); 1645 if (reason_str == NULL) 1646 goto done; 1647 encoding_str = PyObject_Str(uself->encoding); 1648 if (encoding_str == NULL) 1649 goto done; 1650 1651 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) { 1652 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start]; 1653 char badchar_str[20]; 1654 if (badchar <= 0xff) 1655 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar); 1656 else if (badchar <= 0xffff) 1657 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar); 1658 else 1659 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar); 1660 result = PyString_FromFormat( 1661 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s", 1662 PyString_AS_STRING(encoding_str), 1663 badchar_str, 1664 uself->start, 1665 PyString_AS_STRING(reason_str)); 1666 } 1667 else { 1668 result = PyString_FromFormat( 1669 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s", 1670 PyString_AS_STRING(encoding_str), 1671 uself->start, 1672 uself->end-1, 1673 PyString_AS_STRING(reason_str)); 1674 } 1675 done: 1676 Py_XDECREF(reason_str); 1677 Py_XDECREF(encoding_str); 1678 return result; 1679 } 1680 1681 static PyTypeObject _PyExc_UnicodeEncodeError = { 1682 PyObject_HEAD_INIT(NULL) 1683 0, 1684 EXC_MODULE_NAME "UnicodeEncodeError", 1685 sizeof(PyUnicodeErrorObject), 0, 1686 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1687 (reprfunc)UnicodeEncodeError_str, 0, 0, 0, 1688 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 1689 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse, 1690 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members, 1691 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict), 1692 (initproc)UnicodeEncodeError_init, 0, BaseException_new, 1693 }; 1694 PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError; 1695 1696 PyObject * 1697 PyUnicodeEncodeError_Create( 1698 const char *encoding, const Py_UNICODE *object, Py_ssize_t length, 1699 Py_ssize_t start, Py_ssize_t end, const char *reason) 1700 { 1701 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns", 1702 encoding, object, length, start, end, reason); 1703 } 1704 1705 1706 /* 1707 * UnicodeDecodeError extends UnicodeError 1708 */ 1709 1710 static int 1711 UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds) 1712 { 1713 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 1714 return -1; 1715 return UnicodeError_init((PyUnicodeErrorObject *)self, args, 1716 kwds, &PyString_Type); 1717 } 1718 1719 static PyObject * 1720 UnicodeDecodeError_str(PyObject *self) 1721 { 1722 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; 1723 PyObject *result = NULL; 1724 PyObject *reason_str = NULL; 1725 PyObject *encoding_str = NULL; 1726 1727 if (!uself->object) 1728 /* Not properly initialized. */ 1729 return PyUnicode_FromString(""); 1730 1731 /* Get reason and encoding as strings, which they might not be if 1732 they've been modified after we were constructed. */ 1733 reason_str = PyObject_Str(uself->reason); 1734 if (reason_str == NULL) 1735 goto done; 1736 encoding_str = PyObject_Str(uself->encoding); 1737 if (encoding_str == NULL) 1738 goto done; 1739 1740 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) { 1741 /* FromFormat does not support %02x, so format that separately */ 1742 char byte[4]; 1743 PyOS_snprintf(byte, sizeof(byte), "%02x", 1744 ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff); 1745 result = PyString_FromFormat( 1746 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s", 1747 PyString_AS_STRING(encoding_str), 1748 byte, 1749 uself->start, 1750 PyString_AS_STRING(reason_str)); 1751 } 1752 else { 1753 result = PyString_FromFormat( 1754 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s", 1755 PyString_AS_STRING(encoding_str), 1756 uself->start, 1757 uself->end-1, 1758 PyString_AS_STRING(reason_str)); 1759 } 1760 done: 1761 Py_XDECREF(reason_str); 1762 Py_XDECREF(encoding_str); 1763 return result; 1764 } 1765 1766 static PyTypeObject _PyExc_UnicodeDecodeError = { 1767 PyObject_HEAD_INIT(NULL) 1768 0, 1769 EXC_MODULE_NAME "UnicodeDecodeError", 1770 sizeof(PyUnicodeErrorObject), 0, 1771 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1772 (reprfunc)UnicodeDecodeError_str, 0, 0, 0, 1773 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 1774 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse, 1775 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members, 1776 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict), 1777 (initproc)UnicodeDecodeError_init, 0, BaseException_new, 1778 }; 1779 PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError; 1780 1781 PyObject * 1782 PyUnicodeDecodeError_Create( 1783 const char *encoding, const char *object, Py_ssize_t length, 1784 Py_ssize_t start, Py_ssize_t end, const char *reason) 1785 { 1786 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns", 1787 encoding, object, length, start, end, reason); 1788 } 1789 1790 1791 /* 1792 * UnicodeTranslateError extends UnicodeError 1793 */ 1794 1795 static int 1796 UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args, 1797 PyObject *kwds) 1798 { 1799 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) 1800 return -1; 1801 1802 Py_CLEAR(self->object); 1803 Py_CLEAR(self->reason); 1804 1805 if (!PyArg_ParseTuple(args, "O!nnO!", 1806 &PyUnicode_Type, &self->object, 1807 &self->start, 1808 &self->end, 1809 &PyString_Type, &self->reason)) { 1810 self->object = self->reason = NULL; 1811 return -1; 1812 } 1813 1814 Py_INCREF(self->object); 1815 Py_INCREF(self->reason); 1816 1817 return 0; 1818 } 1819 1820 1821 static PyObject * 1822 UnicodeTranslateError_str(PyObject *self) 1823 { 1824 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; 1825 PyObject *result = NULL; 1826 PyObject *reason_str = NULL; 1827 1828 if (!uself->object) 1829 /* Not properly initialized. */ 1830 return PyUnicode_FromString(""); 1831 1832 /* Get reason as a string, which it might not be if it's been 1833 modified after we were constructed. */ 1834 reason_str = PyObject_Str(uself->reason); 1835 if (reason_str == NULL) 1836 goto done; 1837 1838 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) { 1839 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start]; 1840 char badchar_str[20]; 1841 if (badchar <= 0xff) 1842 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar); 1843 else if (badchar <= 0xffff) 1844 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar); 1845 else 1846 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar); 1847 result = PyString_FromFormat( 1848 "can't translate character u'\\%s' in position %zd: %.400s", 1849 badchar_str, 1850 uself->start, 1851 PyString_AS_STRING(reason_str)); 1852 } else { 1853 result = PyString_FromFormat( 1854 "can't translate characters in position %zd-%zd: %.400s", 1855 uself->start, 1856 uself->end-1, 1857 PyString_AS_STRING(reason_str)); 1858 } 1859 done: 1860 Py_XDECREF(reason_str); 1861 return result; 1862 } 1863 1864 static PyTypeObject _PyExc_UnicodeTranslateError = { 1865 PyObject_HEAD_INIT(NULL) 1866 0, 1867 EXC_MODULE_NAME "UnicodeTranslateError", 1868 sizeof(PyUnicodeErrorObject), 0, 1869 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1870 (reprfunc)UnicodeTranslateError_str, 0, 0, 0, 1871 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 1872 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse, 1873 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members, 1874 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict), 1875 (initproc)UnicodeTranslateError_init, 0, BaseException_new, 1876 }; 1877 PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError; 1878 1879 PyObject * 1880 PyUnicodeTranslateError_Create( 1881 const Py_UNICODE *object, Py_ssize_t length, 1882 Py_ssize_t start, Py_ssize_t end, const char *reason) 1883 { 1884 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns", 1885 object, length, start, end, reason); 1886 } 1887 #endif 1888 1889 1890 /* 1891 * AssertionError extends StandardError 1892 */ 1893 SimpleExtendsException(PyExc_StandardError, AssertionError, 1894 "Assertion failed."); 1895 1896 1897 /* 1898 * ArithmeticError extends StandardError 1899 */ 1900 SimpleExtendsException(PyExc_StandardError, ArithmeticError, 1901 "Base class for arithmetic errors."); 1902 1903 1904 /* 1905 * FloatingPointError extends ArithmeticError 1906 */ 1907 SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError, 1908 "Floating point operation failed."); 1909 1910 1911 /* 1912 * OverflowError extends ArithmeticError 1913 */ 1914 SimpleExtendsException(PyExc_ArithmeticError, OverflowError, 1915 "Result too large to be represented."); 1916 1917 1918 /* 1919 * ZeroDivisionError extends ArithmeticError 1920 */ 1921 SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError, 1922 "Second argument to a division or modulo operation was zero."); 1923 1924 1925 /* 1926 * SystemError extends StandardError 1927 */ 1928 SimpleExtendsException(PyExc_StandardError, SystemError, 1929 "Internal error in the Python interpreter.\n" 1930 "\n" 1931 "Please report this to the Python maintainer, along with the traceback,\n" 1932 "the Python version, and the hardware/OS platform and version."); 1933 1934 1935 /* 1936 * ReferenceError extends StandardError 1937 */ 1938 SimpleExtendsException(PyExc_StandardError, ReferenceError, 1939 "Weak ref proxy used after referent went away."); 1940 1941 1942 /* 1943 * MemoryError extends StandardError 1944 */ 1945 SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory."); 1946 1947 /* 1948 * BufferError extends StandardError 1949 */ 1950 SimpleExtendsException(PyExc_StandardError, BufferError, "Buffer error."); 1951 1952 1953 /* Warning category docstrings */ 1954 1955 /* 1956 * Warning extends Exception 1957 */ 1958 SimpleExtendsException(PyExc_Exception, Warning, 1959 "Base class for warning categories."); 1960 1961 1962 /* 1963 * UserWarning extends Warning 1964 */ 1965 SimpleExtendsException(PyExc_Warning, UserWarning, 1966 "Base class for warnings generated by user code."); 1967 1968 1969 /* 1970 * DeprecationWarning extends Warning 1971 */ 1972 SimpleExtendsException(PyExc_Warning, DeprecationWarning, 1973 "Base class for warnings about deprecated features."); 1974 1975 1976 /* 1977 * PendingDeprecationWarning extends Warning 1978 */ 1979 SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning, 1980 "Base class for warnings about features which will be deprecated\n" 1981 "in the future."); 1982 1983 1984 /* 1985 * SyntaxWarning extends Warning 1986 */ 1987 SimpleExtendsException(PyExc_Warning, SyntaxWarning, 1988 "Base class for warnings about dubious syntax."); 1989 1990 1991 /* 1992 * RuntimeWarning extends Warning 1993 */ 1994 SimpleExtendsException(PyExc_Warning, RuntimeWarning, 1995 "Base class for warnings about dubious runtime behavior."); 1996 1997 1998 /* 1999 * FutureWarning extends Warning 2000 */ 2001 SimpleExtendsException(PyExc_Warning, FutureWarning, 2002 "Base class for warnings about constructs that will change semantically\n" 2003 "in the future."); 2004 2005 2006 /* 2007 * ImportWarning extends Warning 2008 */ 2009 SimpleExtendsException(PyExc_Warning, ImportWarning, 2010 "Base class for warnings about probable mistakes in module imports"); 2011 2012 2013 /* 2014 * UnicodeWarning extends Warning 2015 */ 2016 SimpleExtendsException(PyExc_Warning, UnicodeWarning, 2017 "Base class for warnings about Unicode related problems, mostly\n" 2018 "related to conversion problems."); 2019 2020 /* 2021 * BytesWarning extends Warning 2022 */ 2023 SimpleExtendsException(PyExc_Warning, BytesWarning, 2024 "Base class for warnings about bytes and buffer related problems, mostly\n" 2025 "related to conversion from str or comparing to str."); 2026 2027 /* Pre-computed MemoryError instance. Best to create this as early as 2028 * possible and not wait until a MemoryError is actually raised! 2029 */ 2030 PyObject *PyExc_MemoryErrorInst=NULL; 2031 2032 /* Pre-computed RuntimeError instance for when recursion depth is reached. 2033 Meant to be used when normalizing the exception for exceeding the recursion 2034 depth will cause its own infinite recursion. 2035 */ 2036 PyObject *PyExc_RecursionErrorInst = NULL; 2037 2038 /* module global functions */ 2039 static PyMethodDef functions[] = { 2040 /* Sentinel */ 2041 {NULL, NULL} 2042 }; 2043 2044 #define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \ 2045 Py_FatalError("exceptions bootstrapping error."); 2046 2047 #define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \ 2048 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \ 2049 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \ 2050 Py_FatalError("Module dictionary insertion problem."); 2051 2052 2053 PyMODINIT_FUNC 2054 _PyExc_Init(void) 2055 { 2056 PyObject *m, *bltinmod, *bdict; 2057 2058 PRE_INIT(BaseException) 2059 PRE_INIT(Exception) 2060 PRE_INIT(StandardError) 2061 PRE_INIT(TypeError) 2062 PRE_INIT(StopIteration) 2063 PRE_INIT(GeneratorExit) 2064 PRE_INIT(SystemExit) 2065 PRE_INIT(KeyboardInterrupt) 2066 PRE_INIT(ImportError) 2067 PRE_INIT(EnvironmentError) 2068 PRE_INIT(IOError) 2069 PRE_INIT(OSError) 2070 #ifdef MS_WINDOWS 2071 PRE_INIT(WindowsError) 2072 #endif 2073 #ifdef __VMS 2074 PRE_INIT(VMSError) 2075 #endif 2076 PRE_INIT(EOFError) 2077 PRE_INIT(RuntimeError) 2078 PRE_INIT(NotImplementedError) 2079 PRE_INIT(NameError) 2080 PRE_INIT(UnboundLocalError) 2081 PRE_INIT(AttributeError) 2082 PRE_INIT(SyntaxError) 2083 PRE_INIT(IndentationError) 2084 PRE_INIT(TabError) 2085 PRE_INIT(LookupError) 2086 PRE_INIT(IndexError) 2087 PRE_INIT(KeyError) 2088 PRE_INIT(ValueError) 2089 PRE_INIT(UnicodeError) 2090 #ifdef Py_USING_UNICODE 2091 PRE_INIT(UnicodeEncodeError) 2092 PRE_INIT(UnicodeDecodeError) 2093 PRE_INIT(UnicodeTranslateError) 2094 #endif 2095 PRE_INIT(AssertionError) 2096 PRE_INIT(ArithmeticError) 2097 PRE_INIT(FloatingPointError) 2098 PRE_INIT(OverflowError) 2099 PRE_INIT(ZeroDivisionError) 2100 PRE_INIT(SystemError) 2101 PRE_INIT(ReferenceError) 2102 PRE_INIT(MemoryError) 2103 PRE_INIT(BufferError) 2104 PRE_INIT(Warning) 2105 PRE_INIT(UserWarning) 2106 PRE_INIT(DeprecationWarning) 2107 PRE_INIT(PendingDeprecationWarning) 2108 PRE_INIT(SyntaxWarning) 2109 PRE_INIT(RuntimeWarning) 2110 PRE_INIT(FutureWarning) 2111 PRE_INIT(ImportWarning) 2112 PRE_INIT(UnicodeWarning) 2113 PRE_INIT(BytesWarning) 2114 2115 m = Py_InitModule4("exceptions", functions, exceptions_doc, 2116 (PyObject *)NULL, PYTHON_API_VERSION); 2117 if (m == NULL) 2118 return; 2119 2120 bltinmod = PyImport_ImportModule("__builtin__"); 2121 if (bltinmod == NULL) 2122 Py_FatalError("exceptions bootstrapping error."); 2123 bdict = PyModule_GetDict(bltinmod); 2124 if (bdict == NULL) 2125 Py_FatalError("exceptions bootstrapping error."); 2126 2127 POST_INIT(BaseException) 2128 POST_INIT(Exception) 2129 POST_INIT(StandardError) 2130 POST_INIT(TypeError) 2131 POST_INIT(StopIteration) 2132 POST_INIT(GeneratorExit) 2133 POST_INIT(SystemExit) 2134 POST_INIT(KeyboardInterrupt) 2135 POST_INIT(ImportError) 2136 POST_INIT(EnvironmentError) 2137 POST_INIT(IOError) 2138 POST_INIT(OSError) 2139 #ifdef MS_WINDOWS 2140 POST_INIT(WindowsError) 2141 #endif 2142 #ifdef __VMS 2143 POST_INIT(VMSError) 2144 #endif 2145 POST_INIT(EOFError) 2146 POST_INIT(RuntimeError) 2147 POST_INIT(NotImplementedError) 2148 POST_INIT(NameError) 2149 POST_INIT(UnboundLocalError) 2150 POST_INIT(AttributeError) 2151 POST_INIT(SyntaxError) 2152 POST_INIT(IndentationError) 2153 POST_INIT(TabError) 2154 POST_INIT(LookupError) 2155 POST_INIT(IndexError) 2156 POST_INIT(KeyError) 2157 POST_INIT(ValueError) 2158 POST_INIT(UnicodeError) 2159 #ifdef Py_USING_UNICODE 2160 POST_INIT(UnicodeEncodeError) 2161 POST_INIT(UnicodeDecodeError) 2162 POST_INIT(UnicodeTranslateError) 2163 #endif 2164 POST_INIT(AssertionError) 2165 POST_INIT(ArithmeticError) 2166 POST_INIT(FloatingPointError) 2167 POST_INIT(OverflowError) 2168 POST_INIT(ZeroDivisionError) 2169 POST_INIT(SystemError) 2170 POST_INIT(ReferenceError) 2171 POST_INIT(MemoryError) 2172 POST_INIT(BufferError) 2173 POST_INIT(Warning) 2174 POST_INIT(UserWarning) 2175 POST_INIT(DeprecationWarning) 2176 POST_INIT(PendingDeprecationWarning) 2177 POST_INIT(SyntaxWarning) 2178 POST_INIT(RuntimeWarning) 2179 POST_INIT(FutureWarning) 2180 POST_INIT(ImportWarning) 2181 POST_INIT(UnicodeWarning) 2182 POST_INIT(BytesWarning) 2183 2184 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL); 2185 if (!PyExc_MemoryErrorInst) 2186 Py_FatalError("Cannot pre-allocate MemoryError instance"); 2187 2188 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL); 2189 if (!PyExc_RecursionErrorInst) 2190 Py_FatalError("Cannot pre-allocate RuntimeError instance for " 2191 "recursion errors"); 2192 else { 2193 PyBaseExceptionObject *err_inst = 2194 (PyBaseExceptionObject *)PyExc_RecursionErrorInst; 2195 PyObject *args_tuple; 2196 PyObject *exc_message; 2197 exc_message = PyString_FromString("maximum recursion depth exceeded"); 2198 if (!exc_message) 2199 Py_FatalError("cannot allocate argument for RuntimeError " 2200 "pre-allocation"); 2201 args_tuple = PyTuple_Pack(1, exc_message); 2202 if (!args_tuple) 2203 Py_FatalError("cannot allocate tuple for RuntimeError " 2204 "pre-allocation"); 2205 Py_DECREF(exc_message); 2206 if (BaseException_init(err_inst, args_tuple, NULL)) 2207 Py_FatalError("init of pre-allocated RuntimeError failed"); 2208 Py_DECREF(args_tuple); 2209 } 2210 Py_DECREF(bltinmod); 2211 } 2212 2213 void 2214 _PyExc_Fini(void) 2215 { 2216 Py_CLEAR(PyExc_MemoryErrorInst); 2217 Py_CLEAR(PyExc_RecursionErrorInst); 2218 } 2219