diff options
-rw-r--r-- | Include/stringobject.h | 1 | ||||
-rw-r--r-- | Lib/test/test_descr.py | 2 | ||||
-rw-r--r-- | Objects/object.c | 8 | ||||
-rw-r--r-- | Objects/stringobject.c | 2 |
4 files changed, 10 insertions, 3 deletions
diff --git a/Include/stringobject.h b/Include/stringobject.h index a67e33e..052eacf 100644 --- a/Include/stringobject.h +++ b/Include/stringobject.h @@ -52,6 +52,7 @@ typedef struct { extern DL_IMPORT(PyTypeObject) PyString_Type; #define PyString_Check(op) PyObject_TypeCheck(op, &PyString_Type) +#define PyString_CheckExact(op) ((op)->ob_type == &PyString_Type) extern DL_IMPORT(PyObject *) PyString_FromStringAndSize(const char *, int); extern DL_IMPORT(PyObject *) PyString_FromString(const char *); diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index d756dc5..0de4dec 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1440,7 +1440,7 @@ def inherits(): verify(u == s) s = madstring("12345") #XXX verify(str(s) == "12345") - #XXX verify(str(s).__class__ is str) + verify(str(s).__class__ is str) class madunicode(unicode): _rev = None diff --git a/Objects/object.c b/Objects/object.c index 704ffc1..718dddf 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -250,10 +250,16 @@ PyObject_Str(PyObject *v) if (v == NULL) return PyString_FromString("<NULL>"); - if (PyString_Check(v)) { + if (PyString_CheckExact(v)) { Py_INCREF(v); return v; } + if (PyString_Check(v)) { + /* For a string subtype that's not a string, return a true + string with the same string data. */ + PyStringObject *s = (PyStringObject *)v; + return PyString_FromStringAndSize(s->ob_sval, s->ob_size); + } if (v->ob_type->tp_str == NULL) return PyObject_Repr(v); diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 4c28500..9c873ec 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -2711,7 +2711,7 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) tmp = string_new(&PyString_Type, args, kwds); if (tmp == NULL) return NULL; - assert(PyString_Check(tmp)); + assert(PyString_CheckExact(tmp)); new = type->tp_alloc(type, n = PyString_GET_SIZE(tmp)); if (new != NULL) memcpy(PyString_AS_STRING(new), PyString_AS_STRING(tmp), n+1); |