]> granicus.if.org Git - python/commitdiff
Oops. The PyObject_Print() function was totally broken; the original code
authorGuido van Rossum <guido@python.org>
Thu, 9 Aug 2007 20:47:59 +0000 (20:47 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 9 Aug 2007 20:47:59 +0000 (20:47 +0000)
was relying on PyString.tp_print but that no longer works.
Fortunately it's rarely called; only the gdb 'pyo' command seems affected.

Objects/object.c

index 3eaf6fab31e8d061f3ed004717e7ee8d3d484381..04d5f488be69b84b3ee56f97444327428daa9dd8 100644 (file)
@@ -284,12 +284,28 @@ internal_print(PyObject *op, FILE *fp, int flags, int nesting)
                        if (flags & Py_PRINT_RAW)
                                s = PyObject_Str(op);
                        else
-                               s = PyObject_ReprStr8(op);
+                               s = PyObject_Repr(op);
                        if (s == NULL)
                                ret = -1;
+                        else if (PyString_Check(s)) {
+                               fwrite(PyString_AS_STRING(s), 1,
+                                      PyString_GET_SIZE(s), fp);
+                       }
+                       else if (PyUnicode_Check(s)) {
+                               PyObject *t;
+                               t = _PyUnicode_AsDefaultEncodedString(s, NULL);
+                               if (t == NULL)
+                                       ret = 0;
+                               else {
+                                       fwrite(PyString_AS_STRING(t), 1,
+                                              PyString_GET_SIZE(t), fp);
+                               }
+                       }
                        else {
-                               ret = internal_print(s, fp, Py_PRINT_RAW,
-                                                    nesting+1);
+                               PyErr_Format(PyExc_TypeError,
+                                            "str() or repr() returned '%.100s'",
+                                            s->ob_type->tp_name);
+                               ret = -1;
                        }
                        Py_XDECREF(s);
                }