Add functions PyUnicode_Append() and PyUnicode_AppendAndDel() that mirror

PyString_Concat() and PyString_ConcatAndDel() (the name PyUnicode_Concat()
was already taken).

Change PyObject_Repr() to always return a unicode object.

Update all repr implementations to return unicode objects.

Add a function PyObject_ReprStr8() that calls PyObject_Repr() and converts
the result to an 8bit string.

Use PyObject_ReprStr8() where using PyObject_Repr() can't be done
straightforward.
This commit is contained in:
Walter Dörwald 2007-05-18 17:15:44 +00:00
parent 14176a56d3
commit 1ab8330827
49 changed files with 385 additions and 255 deletions

View file

@ -613,18 +613,21 @@ static PyObject *
set_repr(PySetObject *so)
{
PyObject *keys, *result=NULL, *listrepr;
int newsize;
Py_UNICODE *u;
const char *s;
int status = Py_ReprEnter((PyObject*)so);
if (status != 0) {
if (status < 0)
return NULL;
return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
return PyUnicode_FromFormat("%s(...)", so->ob_type->tp_name);
}
/* shortcut for the empty set */
if (!so->used) {
Py_ReprLeave((PyObject*)so);
return PyString_FromFormat("%s()", so->ob_type->tp_name);
return PyUnicode_FromFormat("%s()", so->ob_type->tp_name);
}
keys = PySequence_List((PyObject *)so);
@ -635,14 +638,28 @@ set_repr(PySetObject *so)
if (listrepr == NULL)
goto done;
if (so->ob_type == &PySet_Type) {
char *s = PyString_AS_STRING(listrepr);
s += 1;
s[strlen(s)-1] = 0;
result = PyString_FromFormat("{%s}", s);
} else {
result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
PyString_AS_STRING(listrepr));
newsize = PyUnicode_GET_SIZE(listrepr);
if (so->ob_type != &PySet_Type)
newsize += strlen(so->ob_type->tp_name)+2;
result = PyUnicode_FromUnicode(NULL, newsize);
if (result) {
u = PyUnicode_AS_UNICODE(result);
if (so->ob_type != &PySet_Type) {
for (s = so->ob_type->tp_name; *s;)
*u++ = *s++;
*u++ = '(';
Py_UNICODE_COPY(u, PyUnicode_AS_UNICODE(listrepr),
PyUnicode_GET_SIZE(listrepr));
u += PyUnicode_GET_SIZE(listrepr);
*u++ = ')';
} else {
*u++ = '{';
/* Omit the brackets from the listrepr */
Py_UNICODE_COPY(u, PyUnicode_AS_UNICODE(listrepr)+1,
PyUnicode_GET_SIZE(listrepr)-2);
u += PyUnicode_GET_SIZE(listrepr)-2;
*u++ = '}';
}
}
Py_DECREF(listrepr);
done: