Allow Unicode strings in __slots__, converting them to byte strings.

This commit is contained in:
Martin v. Löwis 2002-10-14 21:07:28 +00:00
parent ff9284bc2e
commit d919a59ab5
1 changed files with 39 additions and 0 deletions

View File

@ -1003,6 +1003,38 @@ valid_identifier(PyObject *s)
return 1;
}
#ifdef Py_USING_UNICODE
/* Replace Unicode objects in slots. */
static PyObject *
_unicode_to_string(PyObject *slots, int nslots)
{
PyObject *tmp = slots;
PyObject *o, *o1;
int i;
intintargfunc copy = slots->ob_type->tp_as_sequence->sq_slice;
for (i = 0; i < nslots; i++) {
if (PyUnicode_Check(o = PyTuple_GET_ITEM(tmp, i))) {
if (tmp == slots) {
tmp = copy(slots, 0, PyTuple_GET_SIZE(slots));
if (tmp == NULL)
return NULL;
}
o1 = _PyUnicode_AsDefaultEncodedString
(o, NULL);
if (o1 == NULL) {
Py_DECREF(tmp);
return 0;
}
Py_INCREF(o1);
Py_DECREF(o);
PyTuple_SET_ITEM(tmp, i, o1);
}
}
return tmp;
}
#endif
static PyObject *
type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
{
@ -1135,6 +1167,13 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
return NULL;
}
#ifdef Py_USING_UNICODE
tmp = _unicode_to_string(slots, nslots);
Py_DECREF(slots);
slots = tmp;
if (!tmp)
return NULL;
#endif
/* Check for valid slot names and two special cases */
for (i = 0; i < nslots; i++) {
PyObject *tmp = PyTuple_GET_ITEM(slots, i);