diff options
Diffstat (limited to 'Python/errors.c')
| -rw-r--r-- | Python/errors.c | 56 | 
1 files changed, 47 insertions, 9 deletions
diff --git a/Python/errors.c b/Python/errors.c index da4b463..64ba05d 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -106,10 +106,18 @@ PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)          err = PyExceptionInstance_Class(err);      if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { -        int res = 0; +        int res = 0, reclimit;          PyObject *exception, *value, *tb;          PyErr_Fetch(&exception, &value, &tb); +        /* Temporarily bump the recursion limit, so that in the most +           common case PyObject_IsSubclass will not raise a recursion +           error we have to ignore anyway.  Don't do it when the limit +           is already insanely high, to avoid overflow */ +        reclimit = Py_GetRecursionLimit(); +        if (reclimit < (1 << 30)) +            Py_SetRecursionLimit(reclimit + 5);          res = PyObject_IsSubclass(err, exc); +        Py_SetRecursionLimit(reclimit);          /* This function must not fail, so print the error here */          if (res == -1) {              PyErr_WriteUnraisable(err); @@ -365,7 +373,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)  PyObject * -PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename) +PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)  {      PyObject *name = filename ? PyString_FromString(filename) : NULL;      PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); @@ -373,9 +381,9 @@ PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)      return result;  } -#ifdef Py_WIN_WIDE_FILENAMES +#ifdef MS_WINDOWS  PyObject * -PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename) +PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)  {      PyObject *name = filename ?                       PyUnicode_FromUnicode(filename, wcslen(filename)) : @@ -384,7 +392,7 @@ PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)      Py_XDECREF(name);      return result;  } -#endif /* Py_WIN_WIDE_FILENAMES */ +#endif /* MS_WINDOWS */  PyObject *  PyErr_SetFromErrno(PyObject *exc) @@ -454,7 +462,6 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilename(      return ret;  } -#ifdef Py_WIN_WIDE_FILENAMES  PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(      PyObject *exc,      int ierr, @@ -469,7 +476,6 @@ PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(      Py_XDECREF(name);      return ret;  } -#endif /* Py_WIN_WIDE_FILENAMES */  PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)  { @@ -493,7 +499,6 @@ PyObject *PyErr_SetFromWindowsErrWithFilename(      return result;  } -#ifdef Py_WIN_WIDE_FILENAMES  PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(      int ierr,      const Py_UNICODE *filename) @@ -507,7 +512,6 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(      Py_XDECREF(name);      return result;  } -#endif /* Py_WIN_WIDE_FILENAMES */  #endif /* MS_WINDOWS */  void @@ -602,6 +606,40 @@ PyErr_NewException(char *name, PyObject *base, PyObject *dict)      return result;  } + +/* Create an exception with docstring */ +PyObject * +PyErr_NewExceptionWithDoc(char *name, char *doc, PyObject *base, PyObject *dict) +{ +    int result; +    PyObject *ret = NULL; +    PyObject *mydict = NULL; /* points to the dict only if we create it */ +    PyObject *docobj; + +    if (dict == NULL) { +        dict = mydict = PyDict_New(); +        if (dict == NULL) { +            return NULL; +        } +    } + +    if (doc != NULL) { +        docobj = PyString_FromString(doc); +        if (docobj == NULL) +            goto failure; +        result = PyDict_SetItemString(dict, "__doc__", docobj); +        Py_DECREF(docobj); +        if (result < 0) +            goto failure; +    } + +    ret = PyErr_NewException(name, base, dict); +  failure: +    Py_XDECREF(mydict); +    return ret; +} + +  /* Call when an exception has occurred but there is no way for Python     to handle it.  Examples: exception in __del__ or during GC. */  void  | 
