summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/object.h1
-rw-r--r--Modules/mpzmodule.c20
-rw-r--r--Objects/fileobject.c15
-rw-r--r--Objects/object.c36
-rw-r--r--Python/bltinmodule.c7
-rw-r--r--Python/ceval.c13
6 files changed, 51 insertions, 41 deletions
diff --git a/Include/object.h b/Include/object.h
index ab270f8..24989bf 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -214,6 +214,7 @@ extern typeobject Typetype; /* The type of type objects */
/* Generic operations on objects */
extern int printobject PROTO((object *, FILE *, int));
extern object * reprobject PROTO((object *));
+extern object * strobject PROTO((object *));
extern int cmpobject PROTO((object *, object *));
extern object *getattr PROTO((object *, char *));
extern int hasattr PROTO((object *, char *));
diff --git a/Modules/mpzmodule.c b/Modules/mpzmodule.c
index a3e903e..5ff0801 100644
--- a/Modules/mpzmodule.c
+++ b/Modules/mpzmodule.c
@@ -265,24 +265,6 @@ mpz_dealloc(mpzp)
DEL(mpzp);
} /* mpz_dealloc() */
-/* ARGSUSED */
-static int
-mpz_print(v, fp, flags)
- object *v;
- FILE *fp;
- int flags; /* Not used but required by interface */
-{
- stringobject *str
- = (stringobject *)mpz_format(v, 10, (unsigned char)1);
-
- if (str == NULL)
- return -1;
-
- fputs(GETSTRINGVALUE(str), fp);
- DECREF(str);
- return 0;
-} /* mpz_print() */
-
/* pointers to frequently used values 0, 1 and -1 */
static mpzobject *mpz_value_zero, *mpz_value_one, *mpz_value_mone;
@@ -1658,7 +1640,7 @@ static typeobject MPZtype = {
0, /*tp_itemsize*/
/* methods */
mpz_dealloc, /*tp_dealloc*/
- mpz_print, /*tp_print*/
+ 0, /*tp_print*/
mpz_getattr, /*tp_getattr*/
0, /*tp_setattr*/
mpz_compare, /*tp_compare*/
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 7ed4fcd..518fe04 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -680,16 +680,13 @@ writeobject(v, f, flags)
writer = getattr(f, "write");
if (writer == NULL)
return -1;
- if ((flags & PRINT_RAW) && is_stringobject(v)) {
- value = v;
- INCREF(value);
- }
- else {
+ if (flags & PRINT_RAW)
+ value = strobject(v);
+ else
value = reprobject(v);
- if (value == NULL) {
- DECREF(writer);
- return -1;
- }
+ if (value == NULL) {
+ DECREF(writer);
+ return -1;
}
result = call_object(writer, value);
DECREF(writer);
diff --git a/Objects/object.c b/Objects/object.c
index 73fba50..7a7383e 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -124,7 +124,11 @@ printobject(op, fp, flags)
op->ob_type->tp_name, (long)op);
}
else {
- object *s = reprobject(op);
+ object *s;
+ if (flags & PRINT_RAW)
+ s = strobject(op);
+ else
+ s = reprobject(op);
if (s == NULL)
ret = -1;
else if (!is_stringobject(s)) {
@@ -171,6 +175,36 @@ reprobject(v)
return (*v->ob_type->tp_repr)(v);
}
+object *
+strobject(v)
+ object *v;
+{
+ if (v == NULL)
+ return newstringobject("<NULL>");
+ if (is_stringobject(v)) {
+ INCREF(v);
+ return v;
+ }
+ else {
+ object *func = getattr(v, "__str__");
+ object *args;
+ object *res;
+ if (func == NULL) {
+ err_clear();
+ return reprobject(v);
+ }
+ args = newtupleobject(0);
+ if (args == NULL)
+ res = NULL;
+ else {
+ res = call_object(func, args);
+ DECREF(args);
+ }
+ DECREF(func);
+ return res;
+ }
+}
+
int
cmpobject(v, w)
object *v, *w;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 9210bd1..97ed2f4 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1096,12 +1096,7 @@ builtin_str(self, v)
err_badarg();
return NULL;
}
- if (is_stringobject(v)) {
- INCREF(v);
- return v;
- }
- else
- return reprobject(v);
+ return strobject(v);
}
static object *
diff --git a/Python/ceval.c b/Python/ceval.c
index 324ecdf..425e2a0 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -38,6 +38,8 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "graminit.h"
#include "pythonrun.h"
+#include <ctype.h>
+
/* Turn this on if your compiler chokes on the big switch: */
/* #define CASE_TOO_BIG 1 /**/
@@ -660,16 +662,15 @@ eval_code(co, globals, locals, owner, arg)
w = sysget("stdout");
if (softspace(w, 1))
writestring(" ", w);
- if (is_stringobject(v)) {
+ err = writeobject(v, w, PRINT_RAW);
+ if (err == 0 && is_stringobject(v)) {
+ /* XXX move into writeobject() ? */
char *s = getstringvalue(v);
int len = getstringsize(v);
- err = writeobject(v, w, PRINT_RAW);
- if (err == 0 && len > 0 && s[len-1] == '\n')
+ if (len > 0 && isspace(s[len-1]) &&
+ s[len-1] != ' ')
softspace(w, 0);
}
- else {
- err = writeobject(v, w, 0);
- }
DECREF(v);
break;