Use unicode and remove support for some uses of str8.

This commit is contained in:
Neal Norwitz 2007-08-26 06:45:23 +00:00
parent da059e3585
commit 80e7f27e62
2 changed files with 20 additions and 43 deletions

View File

@ -44,6 +44,7 @@ static int
type_set_name(PyTypeObject *type, PyObject *value, void *context) type_set_name(PyTypeObject *type, PyObject *value, void *context)
{ {
PyHeapTypeObject* et; PyHeapTypeObject* et;
char *tp_name;
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
@ -61,11 +62,10 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
type->tp_name, Py_Type(value)->tp_name); type->tp_name, Py_Type(value)->tp_name);
return -1; return -1;
} }
value = _PyUnicode_AsDefaultEncodedString(value, NULL); tp_name = PyUnicode_AsString(value);
if (value == NULL) if (tp_name == NULL)
return -1; return -1;
if (strlen(PyString_AS_STRING(value)) if (strlen(tp_name) != (size_t)PyUnicode_GET_SIZE(value)) {
!= (size_t)PyString_GET_SIZE(value)) {
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"__name__ must not contain null bytes"); "__name__ must not contain null bytes");
return -1; return -1;
@ -78,7 +78,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
Py_DECREF(et->ht_name); Py_DECREF(et->ht_name);
et->ht_name = value; et->ht_name = value;
type->tp_name = PyString_AS_STRING(value); type->tp_name = tp_name;
return 0; return 0;
} }
@ -1736,7 +1736,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Have slots */ /* Have slots */
/* Make it into a tuple */ /* Make it into a tuple */
if (PyString_Check(slots) || PyUnicode_Check(slots)) if (PyUnicode_Check(slots))
slots = PyTuple_Pack(1, slots); slots = PyTuple_Pack(1, slots);
else else
slots = PySequence_Tuple(slots); slots = PySequence_Tuple(slots);
@ -1875,14 +1875,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_as_sequence = &et->as_sequence; type->tp_as_sequence = &et->as_sequence;
type->tp_as_mapping = &et->as_mapping; type->tp_as_mapping = &et->as_mapping;
type->tp_as_buffer = &et->as_buffer; type->tp_as_buffer = &et->as_buffer;
if (PyString_Check(name)) type->tp_name = PyUnicode_AsString(name);
type->tp_name = PyString_AsString(name); if (!type->tp_name) {
else { Py_DECREF(type);
type->tp_name = PyUnicode_AsString(name); return NULL;
if (!type->tp_name) {
Py_DECREF(type);
return NULL;
}
} }
/* Set tp_base and tp_bases */ /* Set tp_base and tp_bases */

View File

@ -453,8 +453,8 @@ PyImport_Cleanup(void)
while (PyDict_Next(modules, &pos, &key, &value)) { while (PyDict_Next(modules, &pos, &key, &value)) {
if (value->ob_refcnt != 1) if (value->ob_refcnt != 1)
continue; continue;
if (PyString_Check(key) && PyModule_Check(value)) { if (PyUnicode_Check(key) && PyModule_Check(value)) {
name = PyString_AS_STRING(key); name = PyUnicode_AsString(key);
if (strcmp(name, "__builtin__") == 0) if (strcmp(name, "__builtin__") == 0)
continue; continue;
if (strcmp(name, "sys") == 0) if (strcmp(name, "sys") == 0)
@ -472,8 +472,8 @@ PyImport_Cleanup(void)
/* Next, delete all modules (still skipping __builtin__ and sys) */ /* Next, delete all modules (still skipping __builtin__ and sys) */
pos = 0; pos = 0;
while (PyDict_Next(modules, &pos, &key, &value)) { while (PyDict_Next(modules, &pos, &key, &value)) {
if (PyString_Check(key) && PyModule_Check(value)) { if (PyUnicode_Check(key) && PyModule_Check(value)) {
name = PyString_AS_STRING(key); name = PyUnicode_AsString(key);
if (strcmp(name, "__builtin__") == 0) if (strcmp(name, "__builtin__") == 0)
continue; continue;
if (strcmp(name, "sys") == 0) if (strcmp(name, "sys") == 0)
@ -2008,30 +2008,21 @@ get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
*buf = '\0'; *buf = '\0';
*p_buflen = 0; *p_buflen = 0;
modname = PyDict_GetItem(globals, namestr); modname = PyDict_GetItem(globals, namestr);
if (modname == NULL || (!PyString_Check(modname) && !PyUnicode_Check(modname))) if (modname == NULL || !PyUnicode_Check(modname))
return Py_None; return Py_None;
if (PyUnicode_Check(modname)) {
/* XXX need to support Unicode better */
modname = _PyUnicode_AsDefaultEncodedString(modname, NULL);
if (!modname) {
PyErr_Clear();
return NULL;
}
}
modpath = PyDict_GetItem(globals, pathstr); modpath = PyDict_GetItem(globals, pathstr);
if (modpath != NULL) { if (modpath != NULL) {
Py_ssize_t len = PyString_GET_SIZE(modname); Py_ssize_t len = PyUnicode_GET_SIZE(modname);
if (len > MAXPATHLEN) { if (len > MAXPATHLEN) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"Module name too long"); "Module name too long");
return NULL; return NULL;
} }
strcpy(buf, PyString_AS_STRING(modname)); strcpy(buf, PyUnicode_AsString(modname));
} }
else { else {
char *start = PyString_AS_STRING(modname); char *start = PyUnicode_AsString(modname);
char *lastdot = strrchr(start, '.'); char *lastdot = strrchr(start, '.');
size_t len; size_t len;
if (lastdot == NULL && level > 0) { if (lastdot == NULL && level > 0) {
@ -2174,19 +2165,9 @@ ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
} }
return 0; return 0;
} }
if (PyString_Check(item)) {
/* XXX there shouldn't be any str8 objects here */
PyObject *uni = PyUnicode_DecodeASCII(PyString_AsString(item),
PyString_Size(item),
"strict");
Py_DECREF(item);
if (!uni)
return 0;
item = uni;
}
if (!PyUnicode_Check(item)) { if (!PyUnicode_Check(item)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"Item in ``from list'' not a unicode string"); "Item in ``from list'' not a string");
Py_DECREF(item); Py_DECREF(item);
return 0; return 0;
} }
@ -2444,7 +2425,7 @@ PyImport_ReloadModule(PyObject *m)
done using whatever import hooks are installed in the current done using whatever import hooks are installed in the current
environment, e.g. by "rexec". environment, e.g. by "rexec".
A dummy list ["__doc__"] is passed as the 4th argument so that A dummy list ["__doc__"] is passed as the 4th argument so that
e.g. PyImport_Import(PyString_FromString("win32com.client.gencache")) e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
will return <module "gencache"> instead of <module "win32com">. */ will return <module "gencache"> instead of <module "win32com">. */
PyObject * PyObject *