]> granicus.if.org Git - python/commitdiff
More on SF bug [#460020] bug or feature: unicode() and subclasses.
authorTim Peters <tim.peters@gmail.com>
Tue, 11 Sep 2001 01:41:59 +0000 (01:41 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 11 Sep 2001 01:41:59 +0000 (01:41 +0000)
Repaired str(i) to return a genuine string when i is an instance of a str
subclass.  New PyString_CheckExact() macro.

Include/stringobject.h
Lib/test/test_descr.py
Objects/object.c
Objects/stringobject.c

index a67e33e3a8363af71eefbf70c2c62c716d639b1a..052eacf85e38c9e6c9669c596b41221c3971af7f 100644 (file)
@@ -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 *);
index d756dc57d05730cf6a0d208811e41aacdc8fc407..0de4dec078ec00cb6a419bfbaa4923b798859901 100644 (file)
@@ -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
index 704ffc13b284b5b1050d1cadde323762210732ec..718dddf7cfe31057341bab8a296019269a22d10e 100644 (file)
@@ -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);
 
index 4c285009628ec2257bef4f474c6604a092f207ac..9c873ecc89a77d4b650e4361b17703003437320d 100644 (file)
@@ -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);