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