Commit 7930fe41 authored by Martin v. Löwis's avatar Martin v. Löwis

Introduce PyObject* API for raising encode errors.

parent b73fc0da
...@@ -257,6 +257,12 @@ raise_encode_exception(PyObject **exceptionObject, ...@@ -257,6 +257,12 @@ raise_encode_exception(PyObject **exceptionObject,
const Py_UNICODE *unicode, Py_ssize_t size, const Py_UNICODE *unicode, Py_ssize_t size,
Py_ssize_t startpos, Py_ssize_t endpos, Py_ssize_t startpos, Py_ssize_t endpos,
const char *reason); const char *reason);
static void
raise_encode_exception_obj(PyObject **exceptionObject,
const char *encoding,
PyObject *unicode,
Py_ssize_t startpos, Py_ssize_t endpos,
const char *reason);
/* Same for linebreaks */ /* Same for linebreaks */
static unsigned char ascii_linebreak[] = { static unsigned char ascii_linebreak[] = {
...@@ -4786,9 +4792,9 @@ _PyUnicode_AsUTF8String(PyObject *obj, const char *errors) ...@@ -4786,9 +4792,9 @@ _PyUnicode_AsUTF8String(PyObject *obj, const char *errors)
for(k=0; k<repsize; k++) { for(k=0; k<repsize; k++) {
c = prep[k]; c = prep[k];
if (0x80 <= c) { if (0x80 <= c) {
raise_encode_exception(&exc, "utf-8", raise_encode_exception_obj(&exc, "utf-8",
PyUnicode_AS_UNICODE(unicode), (PyObject*)unicode,
size, i-1, i, i-1, i,
"surrogates not allowed"); "surrogates not allowed");
goto error; goto error;
} }
...@@ -6434,6 +6440,33 @@ make_encode_exception(PyObject **exceptionObject, ...@@ -6434,6 +6440,33 @@ make_encode_exception(PyObject **exceptionObject,
} }
} }
/* This is ultimately going t replace above function. */
static void
make_encode_exception_obj(PyObject **exceptionObject,
const char *encoding,
PyObject *unicode,
Py_ssize_t startpos, Py_ssize_t endpos,
const char *reason)
{
if (*exceptionObject == NULL) {
*exceptionObject = PyObject_CallFunction(
PyExc_UnicodeEncodeError, "sUnns",
encoding, unicode, startpos, endpos, reason);
}
else {
if (PyUnicodeEncodeError_SetStart(*exceptionObject, startpos))
goto onError;
if (PyUnicodeEncodeError_SetEnd(*exceptionObject, endpos))
goto onError;
if (PyUnicodeEncodeError_SetReason(*exceptionObject, reason))
goto onError;
return;
onError:
Py_DECREF(*exceptionObject);
*exceptionObject = NULL;
}
}
/* raises a UnicodeEncodeError */ /* raises a UnicodeEncodeError */
static void static void
raise_encode_exception(PyObject **exceptionObject, raise_encode_exception(PyObject **exceptionObject,
...@@ -6447,6 +6480,19 @@ raise_encode_exception(PyObject **exceptionObject, ...@@ -6447,6 +6480,19 @@ raise_encode_exception(PyObject **exceptionObject,
if (*exceptionObject != NULL) if (*exceptionObject != NULL)
PyCodec_StrictErrors(*exceptionObject); PyCodec_StrictErrors(*exceptionObject);
} }
/* This is ultimately going to replace above function. */
static void
raise_encode_exception_obj(PyObject **exceptionObject,
const char *encoding,
PyObject *unicode,
Py_ssize_t startpos, Py_ssize_t endpos,
const char *reason)
{
make_encode_exception_obj(exceptionObject,
encoding, unicode, startpos, endpos, reason);
if (*exceptionObject != NULL)
PyCodec_StrictErrors(*exceptionObject);
}
/* error handling callback helper: /* error handling callback helper:
build arguments, call the callback and check the arguments, build arguments, call the callback and check the arguments,
......
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