From 78e0fc74bce026ddf67d029030a90c9b8faffcb5 Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
Date: Tue, 11 Sep 2001 03:07:38 +0000
Subject: [PATCH] Possibly the end of SF [#460020] bug or feature: unicode()
 and subclasses. Changed unicode(i) to return a true Unicode object when i is
 an instance of a unicode subclass.  Added PyUnicode_CheckExact macro.

---
 Include/unicodeobject.h |  2 ++
 Lib/test/test_descr.py  |  4 ++--
 Objects/unicodeobject.c | 16 ++++++++++++----
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index dbeb883eb3..d9cda95f93 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 fea32550ca..a2ec4758f6 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 98691fddcd..a50b9256c9 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)) {
-- 
2.49.0