From 78e0fc74bce026ddf67d029030a90c9b8faffcb5 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Tue, 11 Sep 2001 03:07:38 +0000 Subject: 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 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)) { -- cgit v0.12