mirror of
https://github.com/python/cpython.git
synced 2025-09-25 01:43:11 +00:00
Added new API PyUnicode_FromEncodedObject() which supports decoding
objects including instance objects. The old API PyUnicode_FromObject() is still available as shortcut.
This commit is contained in:
parent
b6d78fcd9c
commit
5a5c81a0e9
2 changed files with 67 additions and 6 deletions
|
@ -297,6 +297,24 @@ extern DL_IMPORT(int) PyUnicode_Resize(
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
extern DL_IMPORT(PyObject*) PyUnicode_FromEncodedObject(
|
||||||
|
register PyObject *obj, /* Object */
|
||||||
|
const char *encoding, /* encoding */
|
||||||
|
const char *errors /* error handling */
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Shortcut for PyUnicode_FromEncodedObject(obj, NULL, "strict");
|
||||||
|
which results in using the default encoding as basis for
|
||||||
|
decoding the object.
|
||||||
|
|
||||||
|
Coerces obj to an Unicode object and return a reference with
|
||||||
|
*incremented* refcount.
|
||||||
|
|
||||||
|
The API returns NULL in case of an error. The caller is responsible
|
||||||
|
for decref'ing the returned objects.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
extern DL_IMPORT(PyObject*) PyUnicode_FromObject(
|
extern DL_IMPORT(PyObject*) PyUnicode_FromObject(
|
||||||
register PyObject *obj /* Object */
|
register PyObject *obj /* Object */
|
||||||
);
|
);
|
||||||
|
|
|
@ -355,17 +355,48 @@ int PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PyObject *PyUnicode_FromObject(register PyObject *obj)
|
PyObject *PyUnicode_FromObject(register PyObject *obj)
|
||||||
|
{
|
||||||
|
return PyUnicode_FromEncodedObject(obj, NULL, "strict");
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
|
||||||
|
const char *encoding,
|
||||||
|
const char *errors)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
int len;
|
int len;
|
||||||
|
int owned = 0;
|
||||||
|
PyObject *v;
|
||||||
|
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (PyUnicode_Check(obj)) {
|
|
||||||
|
/* Coerce object */
|
||||||
|
if (PyInstance_Check(obj)) {
|
||||||
|
PyObject *func;
|
||||||
|
func = PyObject_GetAttrString(obj, "__str__");
|
||||||
|
if (func == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"coercing to Unicode: instance doesn't define __str__");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
obj = PyEval_CallObject(func, NULL);
|
||||||
|
Py_DECREF(func);
|
||||||
|
if (obj == NULL)
|
||||||
|
return NULL;
|
||||||
|
owned = 1;
|
||||||
|
}
|
||||||
|
if (PyUnicode_Check(obj)) {
|
||||||
Py_INCREF(obj);
|
Py_INCREF(obj);
|
||||||
return obj;
|
v = obj;
|
||||||
|
if (encoding) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"decoding Unicode is not supported");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
else if (PyString_Check(obj)) {
|
else if (PyString_Check(obj)) {
|
||||||
s = PyString_AS_STRING(obj);
|
s = PyString_AS_STRING(obj);
|
||||||
|
@ -376,14 +407,26 @@ PyObject *PyUnicode_FromObject(register PyObject *obj)
|
||||||
case of a TypeError. */
|
case of a TypeError. */
|
||||||
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"coercing to Unicode: need string or charbuffer");
|
"coercing to Unicode: need string or buffer");
|
||||||
return NULL;
|
goto onError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert to Unicode */
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
Py_INCREF(unicode_empty);
|
Py_INCREF(unicode_empty);
|
||||||
return (PyObject *)unicode_empty;
|
v = (PyObject *)unicode_empty;
|
||||||
}
|
}
|
||||||
return PyUnicode_Decode(s, len, NULL, "strict");
|
else
|
||||||
|
v = PyUnicode_Decode(s, len, encoding, errors);
|
||||||
|
done:
|
||||||
|
if (owned)
|
||||||
|
Py_DECREF(obj);
|
||||||
|
return v;
|
||||||
|
|
||||||
|
onError:
|
||||||
|
if (owned)
|
||||||
|
Py_DECREF(obj);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *PyUnicode_Decode(const char *s,
|
PyObject *PyUnicode_Decode(const char *s,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue