Kaydet (Commit) 2ac650f3 authored tarafından Guido van Rossum's avatar Guido van Rossum

New version of PyErr_NewException() that is compatible with -X option.

üst 999e5e92
...@@ -330,30 +330,51 @@ PyErr_Format(exception, format, va_alist) ...@@ -330,30 +330,51 @@ PyErr_Format(exception, format, va_alist)
PyObject * PyObject *
PyErr_NewException(name, base, dict) PyErr_NewException(name, base, dict)
char *name; char *name; /* modulename.classname */
PyObject *base; PyObject *base;
PyObject *dict; PyObject *dict;
{ {
PyObject *nname = PyString_InternFromString(name); char *dot;
PyObject *ndict = NULL; PyObject *modulename = NULL;
PyObject *nbases = NULL; PyObject *classname = NULL;
PyObject *mydict = NULL;
PyObject *bases = NULL;
PyObject *result = NULL; PyObject *result = NULL;
if (nname == NULL) dot = strrchr(name, '.');
if (dot == NULL) {
PyErr_SetString(PyExc_SystemError,
"PyErr_NewException: name must be module.class");
return NULL; return NULL;
}
if (base == NULL)
base = PyExc_Exception;
if (!PyClass_Check(base)) {
/* Must be using string-based standard exceptions (-X) */
return PyString_FromString(name);
}
if (dict == NULL) { if (dict == NULL) {
dict = ndict = PyDict_New(); dict = mydict = PyDict_New();
if (dict == NULL) if (dict == NULL)
goto failure; goto failure;
} }
if (base == NULL) if (PyDict_GetItemString(dict, "__module__") == NULL) {
base = PyExc_Exception; modulename = PyString_FromStringAndSize(name, (int)(dot-name));
nbases = Py_BuildValue("(O)", base); if (modulename == NULL)
if (nbases == NULL) goto failure;
if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
goto failure;
}
classname = PyString_FromString(dot+1);
if (classname == NULL)
goto failure;
bases = Py_BuildValue("(O)", base);
if (bases == NULL)
goto failure; goto failure;
result = PyClass_New(nbases, dict, nname); result = PyClass_New(bases, dict, classname);
failure: failure:
Py_XDECREF(nbases); Py_XDECREF(bases);
Py_XDECREF(ndict); Py_XDECREF(mydict);
Py_XDECREF(nname); Py_XDECREF(classname);
Py_XDECREF(modulename);
return result; return result;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment