All the exception building related stuff has been moved out of this

module and into _exceptions.c.  This includes all the PyExc_* globals,
the bltin_exc table, init_class_exc(), fini_instances(),
finierrors().

Renamed _PyBuiltin_Init_1() to _PyBuiltin_Init() since the two phase
initializations are necessary any more.

Removed as obsolete _PyBuiltin_Init_2(), _PyBuiltin_Fini_1() and
_PyBuiltin_Fini_2().
This commit is contained in:
Barry Warsaw 2000-05-25 23:15:05 +00:00
parent cfa2dba720
commit 78e6c671db
1 changed files with 1 additions and 190 deletions

View File

@ -2356,178 +2356,13 @@ static PyMethodDef builtin_methods[] = {
{NULL, NULL},
};
/* Predefined exceptions */
PyObject *PyExc_Exception;
PyObject *PyExc_StandardError;
PyObject *PyExc_ArithmeticError;
PyObject *PyExc_LookupError;
PyObject *PyExc_AssertionError;
PyObject *PyExc_AttributeError;
PyObject *PyExc_EOFError;
PyObject *PyExc_FloatingPointError;
PyObject *PyExc_EnvironmentError;
PyObject *PyExc_IOError;
PyObject *PyExc_OSError;
PyObject *PyExc_ImportError;
PyObject *PyExc_IndexError;
PyObject *PyExc_KeyError;
PyObject *PyExc_KeyboardInterrupt;
PyObject *PyExc_MemoryError;
PyObject *PyExc_NameError;
PyObject *PyExc_OverflowError;
PyObject *PyExc_RuntimeError;
PyObject *PyExc_NotImplementedError;
PyObject *PyExc_SyntaxError;
PyObject *PyExc_SystemError;
PyObject *PyExc_SystemExit;
PyObject *PyExc_UnboundLocalError;
PyObject *PyExc_UnicodeError;
PyObject *PyExc_TypeError;
PyObject *PyExc_ValueError;
PyObject *PyExc_ZeroDivisionError;
#ifdef MS_WINDOWS
PyObject *PyExc_WindowsError;
#endif
PyObject *PyExc_MemoryErrorInst;
static struct
{
char* name;
PyObject** exc;
}
bltin_exc[] = {
{"Exception", &PyExc_Exception},
{"StandardError", &PyExc_StandardError},
{"ArithmeticError", &PyExc_ArithmeticError},
{"LookupError", &PyExc_LookupError},
{"AssertionError", &PyExc_AssertionError},
{"AttributeError", &PyExc_AttributeError},
{"EOFError", &PyExc_EOFError},
{"FloatingPointError", &PyExc_FloatingPointError},
{"EnvironmentError", &PyExc_EnvironmentError},
{"IOError", &PyExc_IOError},
{"OSError", &PyExc_OSError},
{"ImportError", &PyExc_ImportError},
{"IndexError", &PyExc_IndexError},
{"KeyError", &PyExc_KeyError},
{"KeyboardInterrupt", &PyExc_KeyboardInterrupt},
{"MemoryError", &PyExc_MemoryError},
{"NameError", &PyExc_NameError},
{"OverflowError", &PyExc_OverflowError},
{"RuntimeError", &PyExc_RuntimeError},
{"NotImplementedError",&PyExc_NotImplementedError},
{"SyntaxError", &PyExc_SyntaxError},
{"SystemError", &PyExc_SystemError},
{"SystemExit", &PyExc_SystemExit},
{"UnboundLocalError", &PyExc_UnboundLocalError},
{"UnicodeError", &PyExc_UnicodeError},
{"TypeError", &PyExc_TypeError},
{"ValueError", &PyExc_ValueError},
#ifdef MS_WINDOWS
{"WindowsError", &PyExc_WindowsError},
#endif
{"ZeroDivisionError", &PyExc_ZeroDivisionError},
{NULL, NULL}
};
/* Import exceptions module to extract class exceptions. On success,
* return 1. On failure return 0 which signals _PyBuiltin_Init_2 to
* issue a fatal error.
*/
static int
init_class_exc(dict)
PyObject *dict;
{
int i;
PyObject *m = PyImport_ImportModule("exceptions");
PyObject *args = NULL;
PyObject *d = NULL;
/* make sure we got the module and its dictionary */
if (m == NULL ||
(d = PyModule_GetDict(m)) == NULL)
{
PySys_WriteStderr("'import exceptions' failed\n");
goto finally;
}
for (i = 0; bltin_exc[i].name; i++) {
/* dig the exception out of the module */
PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
if (!exc) {
PySys_WriteStderr(
"Built-in exception class not found: %s. Library mismatch?\n",
bltin_exc[i].name);
goto finally;
}
/* free the old-style exception string object */
Py_XDECREF(*bltin_exc[i].exc);
/* squirrel away a pointer to the exception */
Py_INCREF(exc);
*bltin_exc[i].exc = exc;
/* and insert the name in the __builtin__ module */
if (PyDict_SetItemString(dict, bltin_exc[i].name, exc)) {
PySys_WriteStderr(
"Cannot insert exception into __builtin__: %s\n",
bltin_exc[i].name);
goto finally;
}
}
/* we need one pre-allocated instance */
args = Py_BuildValue("()");
if (!args ||
!(PyExc_MemoryErrorInst =
PyEval_CallObject(PyExc_MemoryError, args)))
{
PySys_WriteStderr("Cannot pre-allocate MemoryError instance\n");
goto finally;
}
Py_DECREF(args);
/* we're done with the exceptions module */
Py_DECREF(m);
return 1;
finally:
Py_XDECREF(m);
Py_XDECREF(args);
PyErr_Clear();
return 0;
}
static void
fini_instances()
{
Py_XDECREF(PyExc_MemoryErrorInst);
PyExc_MemoryErrorInst = NULL;
}
static void
finierrors()
{
int i;
for (i = 0; bltin_exc[i].name; i++) {
PyObject *exc = *bltin_exc[i].exc;
Py_XDECREF(exc);
*bltin_exc[i].exc = NULL;
}
}
static char builtin_doc[] =
"Built-in functions, exceptions, and other objects.\n\
\n\
Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
PyObject *
_PyBuiltin_Init_1()
_PyBuiltin_Init()
{
PyObject *mod, *dict;
mod = Py_InitModule4("__builtin__", builtin_methods,
@ -2547,30 +2382,6 @@ _PyBuiltin_Init_1()
return mod;
}
void
_PyBuiltin_Init_2(dict)
PyObject *dict;
{
if (!init_class_exc(dict))
/* class based exceptions could not be initialized. */
Py_FatalError("Standard exceptions could not be initialized.");
}
void
_PyBuiltin_Fini_1()
{
fini_instances();
}
void
_PyBuiltin_Fini_2()
{
finierrors();
}
/* Helper for filter(): filter a tuple through a function */
static PyObject *