summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/unicodeobject.h2
-rw-r--r--Lib/test/test_descr.py4
-rw-r--r--Objects/unicodeobject.c16
3 files changed, 16 insertions, 6 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index dbeb883..d9cda95 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -61,6 +61,7 @@ Copyright (c) Corporation for National Research Initiatives.
#ifndef Py_USING_UNICODE
#define PyUnicode_Check(op) 0
+#define PyUnicode_CheckExact(op) 0
#else
@@ -373,6 +374,7 @@ typedef struct {
extern DL_IMPORT(PyTypeObject) PyUnicode_Type;
#define PyUnicode_Check(op) PyObject_TypeCheck(op, &PyUnicode_Type)
+#define PyUnicode_CheckExact(op) ((op)->ob_type == &PyUnicode_Type)
/* Fast access macros */
#define PyUnicode_GET_SIZE(op) \
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index fea3255..a2ec475 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1443,7 +1443,7 @@ def inherits():
verify(str(s).__class__ is str)
s = madstring("\x00" * 5)
- #XXX verify(str(s) == "\x00" ( 5)
+ #XXX verify(str(s) == "\x00" * 5)
verify(str(s).__class__ is str)
class madunicode(unicode):
@@ -1460,7 +1460,7 @@ def inherits():
verify(u.rev().rev() == madunicode(u"ABCDEF"))
u = madunicode(u"12345")
verify(unicode(u) == u"12345")
- #XXX verify(unicode(u).__class__ is unicode)
+ verify(unicode(u).__class__ is unicode)
def all():
lists()
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 98691fd..a50b925 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -425,12 +425,20 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
}
if (PyUnicode_Check(obj)) {
if (encoding) {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_TypeError,
"decoding Unicode is not supported");
- return NULL;
+ return NULL;
}
- Py_INCREF(obj);
- v = obj;
+ if (PyUnicode_CheckExact(obj)) {
+ Py_INCREF(obj);
+ v = obj;
+ }
+ else {
+ /* For a subclass of unicode, return a true unicode object
+ with the same string value. */
+ v = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(obj),
+ PyUnicode_GET_SIZE(obj));
+ }
goto done;
}
else if (PyString_Check(obj)) {