Mercurial > cpython-lru_cache-weakref
diff Python/errors.c @ 6377:4cb223f29337 legacy-trunk
New version of PyErr_NewException() that is compatible with -X option.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 03 Oct 1997 19:50:55 +0000 |
| parents | 9e82dd76288e |
| children | bb440a2975ab |
line wrap: on
line diff
--- a/Python/errors.c Fri Oct 03 19:46:02 1997 +0000 +++ b/Python/errors.c Fri Oct 03 19:50:55 1997 +0000 @@ -330,30 +330,51 @@ PyObject * PyErr_NewException(name, base, dict) - char *name; + char *name; /* modulename.classname */ PyObject *base; PyObject *dict; { - PyObject *nname = PyString_InternFromString(name); - PyObject *ndict = NULL; - PyObject *nbases = NULL; + char *dot; + PyObject *modulename = NULL; + PyObject *classname = NULL; + PyObject *mydict = NULL; + PyObject *bases = 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; + } + 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) { - dict = ndict = PyDict_New(); + dict = mydict = PyDict_New(); if (dict == NULL) goto failure; } - if (base == NULL) - base = PyExc_Exception; - nbases = Py_BuildValue("(O)", base); - if (nbases == NULL) + if (PyDict_GetItemString(dict, "__module__") == NULL) { + modulename = PyString_FromStringAndSize(name, (int)(dot-name)); + if (modulename == NULL) + goto failure; + if (PyDict_SetItemString(dict, "__module__", modulename) != 0) + goto failure; + } + classname = PyString_FromString(dot+1); + if (classname == NULL) goto failure; - result = PyClass_New(nbases, dict, nname); + bases = Py_BuildValue("(O)", base); + if (bases == NULL) + goto failure; + result = PyClass_New(bases, dict, classname); failure: - Py_XDECREF(nbases); - Py_XDECREF(ndict); - Py_XDECREF(nname); + Py_XDECREF(bases); + Py_XDECREF(mydict); + Py_XDECREF(classname); + Py_XDECREF(modulename); return result; }
