mirror of
https://github.com/python/cpython.git
synced 2025-11-14 07:49:28 +00:00
Introduce PyObject* API for raising encode errors.
This commit is contained in:
parent
2fbc185209
commit
9e8166843c
1 changed files with 49 additions and 3 deletions
|
|
@ -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)
|
||||||
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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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,
|
||||||
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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue