(Adding this to the trunk as well.)
Fix a very old flaw in PyObject_Print(). Amazing! When an object
type defines tp_str but not tp_repr, 'print x' to a real file
object would not call the tp_str slot but rather print a default style
representation: <foo object at 0x....>. This even though 'print x' to
a file-like-object would correctly call the tp_str slot.
diff --git a/Objects/object.c b/Objects/object.c
index 47907bc..1ace8f5 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -196,7 +196,10 @@
fprintf(fp, "<refcnt %u at %p>",
op->ob_refcnt, op);
else if (op->ob_type->tp_print == NULL) {
- if (op->ob_type->tp_repr == NULL) {
+ if ((flags & Py_PRINT_RAW)
+ ? (op->ob_type->tp_str == NULL)
+ : (op->ob_type->tp_repr == NULL))
+ {
fprintf(fp, "<%s object at %p>",
op->ob_type->tp_name, op);
}