diff options
author | Thomas Heller <theller@ctypes.org> | 2007-07-11 19:57:40 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2007-07-11 19:57:40 (GMT) |
commit | f630dac17804f2121cefa66a3ef4752f5af6ce7f (patch) | |
tree | 613e1761de0b1286dd8bf89148ce6691ba2a1db1 | |
parent | acb470c05ffc3fd1191f948fd5708fa91e8e2e8b (diff) | |
download | cpython-f630dac17804f2121cefa66a3ef4752f5af6ce7f.zip cpython-f630dac17804f2121cefa66a3ef4752f5af6ce7f.tar.gz cpython-f630dac17804f2121cefa66a3ef4752f5af6ce7f.tar.bz2 |
Must create heaptypes with unicode names.
-rw-r--r-- | Objects/typeobject.c | 21 | ||||
-rw-r--r-- | Python/errors.c | 2 |
2 files changed, 15 insertions, 8 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 891be61..974275e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -44,6 +44,7 @@ static int type_set_name(PyTypeObject *type, PyObject *value, void *context) { PyHeapTypeObject* et; + char *name; if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { PyErr_Format(PyExc_TypeError, @@ -55,19 +56,25 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) "can't delete %s.__name__", type->tp_name); return -1; } - if (PyUnicode_Check(value)) { - value = _PyUnicode_AsDefaultEncodedString(value, NULL); + if (PyString_Check(value)) { + value = PyUnicode_FromStringAndSize(PyString_AS_STRING(value), + PyString_GET_SIZE(value)); if (value == NULL) return -1; + /* XXX Isn't here a refcount leak? */ } - if (!PyString_Check(value)) { + if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "can only assign string to %s.__name__, not '%s'", type->tp_name, value->ob_type->tp_name); return -1; } - if (strlen(PyString_AS_STRING(value)) - != (size_t)PyString_GET_SIZE(value)) { + + name = PyUnicode_AsString(value); + if (name == NULL) + return -1; + + if (strlen(name) != PyUnicode_GET_SIZE(value)) { PyErr_Format(PyExc_ValueError, "__name__ must not contain null bytes"); return -1; @@ -80,7 +87,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) Py_DECREF(et->ht_name); et->ht_name = value; - type->tp_name = PyString_AS_STRING(value); + type->tp_name = name; return 0; } @@ -1658,7 +1665,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) } /* Check arguments: (name, bases, dict) */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, &name, &PyTuple_Type, &bases, &PyDict_Type, &dict)) diff --git a/Python/errors.c b/Python/errors.c index 2a84c8d..0f0b6ed 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -575,7 +575,7 @@ PyErr_NewException(char *name, PyObject *base, PyObject *dict) goto failure; } /* Create a real new-style class. */ - result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO", + result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO", dot+1, bases, dict); failure: Py_XDECREF(bases); |