+/*
+ * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
+ *
+ * Thanks go to Tim Peters and Michael Hudson for debugging.
+ */
+
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include "structmember.h"
{
PyObject *str;
PyObject *result;
+ int have_filename = 0;
+ int have_lineno = 0;
+ char *buffer = NULL;
if (self->msg)
str = PyObject_Str(self->msg);
else
str = PyObject_Str(Py_None);
- result = str;
+ if (!str) return NULL;
+ /* Don't fiddle with non-string return (shouldn't happen anyway) */
+ if (!PyString_Check(str)) return str;
/* XXX -- do all the additional formatting with filename and
lineno here */
- if (str != NULL && PyString_Check(str)) {
- int have_filename = 0;
- int have_lineno = 0;
- char *buffer = NULL;
-
- have_filename = (self->filename != NULL) &&
- PyString_Check(self->filename);
- have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
-
- if (have_filename || have_lineno) {
- Py_ssize_t bufsize = PyString_GET_SIZE(str) + 64;
- if (have_filename)
- bufsize += PyString_GET_SIZE(self->filename);
-
- buffer = (char *)PyMem_MALLOC(bufsize);
- if (buffer != NULL) {
- if (have_filename && have_lineno)
- PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
- PyString_AS_STRING(str),
- my_basename(PyString_AS_STRING(self->filename)),
- PyInt_AsLong(self->lineno));
- else if (have_filename)
- PyOS_snprintf(buffer, bufsize, "%s (%s)",
- PyString_AS_STRING(str),
- my_basename(PyString_AS_STRING(self->filename)));
- else if (have_lineno)
- PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
- PyString_AS_STRING(str),
- PyInt_AsLong(self->lineno));
-
- result = PyString_FromString(buffer);
- PyMem_FREE(buffer);
-
- if (result == NULL)
- result = str;
- else
- Py_DECREF(str);
- }
- }
- }
+ have_filename = (self->filename != NULL) &&
+ PyString_Check(self->filename);
+ have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
+
+ if (!have_filename && !have_lineno)
+ return str;
+
+ Py_ssize_t bufsize = PyString_GET_SIZE(str) + 64;
+ if (have_filename)
+ bufsize += PyString_GET_SIZE(self->filename);
+
+ buffer = PyMem_MALLOC(bufsize);
+ if (buffer == NULL)
+ return str;
+
+ if (have_filename && have_lineno)
+ PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
+ PyString_AS_STRING(str),
+ my_basename(PyString_AS_STRING(self->filename)),
+ PyInt_AsLong(self->lineno));
+ else if (have_filename)
+ PyOS_snprintf(buffer, bufsize, "%s (%s)",
+ PyString_AS_STRING(str),
+ my_basename(PyString_AS_STRING(self->filename)));
+ else /* only have_lineno */
+ PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
+ PyString_AS_STRING(str),
+ PyInt_AsLong(self->lineno));
+
+ result = PyString_FromString(buffer);
+ PyMem_FREE(buffer);
+
+ if (result == NULL)
+ result = str;
+ else
+ Py_DECREF(str);
return result;
}
PyObject *obj = PyInt_FromSsize_t(value);
if (!obj)
return -1;
- Py_XDECREF(*attr);
+ Py_CLEAR(*attr);
*attr = obj;
return 0;
}
PyObject *obj = PyString_FromString(value);
if (!obj)
return -1;
- Py_XDECREF(*attr);
+ Py_CLEAR(*attr);
*attr = obj;
return 0;
}
*start = 0; /*XXX check for values <0*/
if (*start>=size)
*start = size-1;
+ Py_DECREF(obj);
return 0;
}
return -1;
*start = 0;
if (*start>=size)
*start = size-1;
+ Py_DECREF(obj);
return 0;
}
return -1;
*end = 1;
if (*end>size)
*end = size;
+ Py_DECREF(obj);
return 0;
}
return -1;
*end = 1;
if (*end>size)
*end = size;
+ Py_DECREF(obj);
return 0;
}
return -1;
static PyObject *
UnicodeDecodeError_str(PyObject *self)
{
- Py_ssize_t start;
- Py_ssize_t end;
+ Py_ssize_t start = 0;
+ Py_ssize_t end = 0;
if (PyUnicodeDecodeError_GetStart(self, &start))
return NULL;