Commit 6d7d910d authored by Tim Peters's avatar Tim Peters

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.
parent 70a0b0f2
...@@ -61,6 +61,7 @@ Copyright (c) Corporation for National Research Initiatives. ...@@ -61,6 +61,7 @@ Copyright (c) Corporation for National Research Initiatives.
#ifndef Py_USING_UNICODE #ifndef Py_USING_UNICODE
#define PyUnicode_Check(op) 0 #define PyUnicode_Check(op) 0
#define PyUnicode_CheckExact(op) 0
#else #else
...@@ -373,6 +374,7 @@ typedef struct { ...@@ -373,6 +374,7 @@ typedef struct {
extern DL_IMPORT(PyTypeObject) PyUnicode_Type; extern DL_IMPORT(PyTypeObject) PyUnicode_Type;
#define PyUnicode_Check(op) PyObject_TypeCheck(op, &PyUnicode_Type) #define PyUnicode_Check(op) PyObject_TypeCheck(op, &PyUnicode_Type)
#define PyUnicode_CheckExact(op) ((op)->ob_type == &PyUnicode_Type)
/* Fast access macros */ /* Fast access macros */
#define PyUnicode_GET_SIZE(op) \ #define PyUnicode_GET_SIZE(op) \
......
...@@ -1443,7 +1443,7 @@ def inherits(): ...@@ -1443,7 +1443,7 @@ def inherits():
verify(str(s).__class__ is str) verify(str(s).__class__ is str)
s = madstring("\x00" * 5) s = madstring("\x00" * 5)
#XXX verify(str(s) == "\x00" ( 5) #XXX verify(str(s) == "\x00" * 5)
verify(str(s).__class__ is str) verify(str(s).__class__ is str)
class madunicode(unicode): class madunicode(unicode):
...@@ -1460,7 +1460,7 @@ def inherits(): ...@@ -1460,7 +1460,7 @@ def inherits():
verify(u.rev().rev() == madunicode(u"ABCDEF")) verify(u.rev().rev() == madunicode(u"ABCDEF"))
u = madunicode(u"12345") u = madunicode(u"12345")
verify(unicode(u) == u"12345") verify(unicode(u) == u"12345")
#XXX verify(unicode(u).__class__ is unicode) verify(unicode(u).__class__ is unicode)
def all(): def all():
lists() lists()
......
...@@ -425,12 +425,20 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj, ...@@ -425,12 +425,20 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
} }
if (PyUnicode_Check(obj)) { if (PyUnicode_Check(obj)) {
if (encoding) { if (encoding) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"decoding Unicode is not supported"); "decoding Unicode is not supported");
return NULL; return NULL;
} }
Py_INCREF(obj); if (PyUnicode_CheckExact(obj)) {
v = 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; goto done;
} }
else if (PyString_Check(obj)) { else if (PyString_Check(obj)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment