Mercurial > cpython-lru_cache-weakref
diff Objects/stringobject.c @ 20464:98df0115ecf9 legacy-trunk
SF bug [#468061] __str__ ignored in str subclass.
object.c, PyObject_Str: Don't try to optimize anything except exact
string objects here; in particular, let str subclasses go thru tp_str,
same as non-str objects. This allows overrides of tp_str to take
effect.
stringobject.c:
+ string_print (str's tp_print): If the argument isn't an exact string
object, get one from PyObject_Str.
+ string_str (str's tp_str): Make a genuine-string copy of the object if
it's of a proper str subclass type. str() applied to a str subclass
that doesn't override __str__ ends up here.
test_descr.py: New str_of_str_subclass() test.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Tue, 16 Oct 2001 20:18:24 +0000 |
| parents | 621c7703e8b7 |
| children | 7945639df265 |
line wrap: on
line diff
--- a/Objects/stringobject.c Tue Oct 16 20:13:53 2001 +0000 +++ b/Objects/stringobject.c Tue Oct 16 20:18:24 2001 +0000 @@ -566,7 +566,18 @@ int i; char c; int quote; + /* XXX Ought to check for interrupts when writing long strings */ + if (! PyString_CheckExact(op)) { + int ret; + /* A str subclass may have its own __str__ method. */ + op = (PyStringObject *) PyObject_Str((PyObject *)op); + if (op == NULL) + return -1; + ret = string_print(op, fp, flags); + Py_DECREF(op); + return ret; + } if (flags & Py_PRINT_RAW) { fwrite(op->ob_sval, 1, (int) op->ob_size, fp); return 0; @@ -651,8 +662,16 @@ static PyObject * string_str(PyObject *s) { - Py_INCREF(s); - return s; + assert(PyString_Check(s)); + if (PyString_CheckExact(s)) { + Py_INCREF(s); + return s; + } + else { + /* Subtype -- return genuine string with the same value. */ + PyStringObject *t = (PyStringObject *) s; + return PyString_FromStringAndSize(t->ob_sval, t->ob_size); + } } static int
