Kaydet (Commit) c6004117 authored tarafından Guido van Rossum's avatar Guido van Rossum

* mpzmodule.c: removed redundant mpz_print function.

* object.[ch], bltinmodule.c, fileobject.c: changed str() to call
  strobject() which calls an object's __str__ method if it has one.
  strobject() is also called by writeobject() when PRINT_RAW is passed.
* ceval.c: rationalize code for PRINT_ITEM (no change in function!)
* funcobject.c, codeobject.c: added compare and hash functionality.
  Functions with identical code objects and the same global dictionary are
  equal.  Code objects are equal when their code, constants list and names
  list are identical (i.e. the filename and code name don't count).
  (hash doesn't work yet since the constants are in a list and lists can't
  be hashed -- suppose this should really be done with a tuple now we have
  resizetuple!)
üst 2e8f8a39
...@@ -214,6 +214,7 @@ extern typeobject Typetype; /* The type of type objects */ ...@@ -214,6 +214,7 @@ extern typeobject Typetype; /* The type of type objects */
/* Generic operations on objects */ /* Generic operations on objects */
extern int printobject PROTO((object *, FILE *, int)); extern int printobject PROTO((object *, FILE *, int));
extern object * reprobject PROTO((object *)); extern object * reprobject PROTO((object *));
extern object * strobject PROTO((object *));
extern int cmpobject PROTO((object *, object *)); extern int cmpobject PROTO((object *, object *));
extern object *getattr PROTO((object *, char *)); extern object *getattr PROTO((object *, char *));
extern int hasattr PROTO((object *, char *)); extern int hasattr PROTO((object *, char *));
......
...@@ -265,24 +265,6 @@ mpz_dealloc(mpzp) ...@@ -265,24 +265,6 @@ mpz_dealloc(mpzp)
DEL(mpzp); DEL(mpzp);
} /* mpz_dealloc() */ } /* 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 */ /* pointers to frequently used values 0, 1 and -1 */
static mpzobject *mpz_value_zero, *mpz_value_one, *mpz_value_mone; static mpzobject *mpz_value_zero, *mpz_value_one, *mpz_value_mone;
...@@ -1658,7 +1640,7 @@ static typeobject MPZtype = { ...@@ -1658,7 +1640,7 @@ static typeobject MPZtype = {
0, /*tp_itemsize*/ 0, /*tp_itemsize*/
/* methods */ /* methods */
mpz_dealloc, /*tp_dealloc*/ mpz_dealloc, /*tp_dealloc*/
mpz_print, /*tp_print*/ 0, /*tp_print*/
mpz_getattr, /*tp_getattr*/ mpz_getattr, /*tp_getattr*/
0, /*tp_setattr*/ 0, /*tp_setattr*/
mpz_compare, /*tp_compare*/ mpz_compare, /*tp_compare*/
......
...@@ -680,16 +680,13 @@ writeobject(v, f, flags) ...@@ -680,16 +680,13 @@ writeobject(v, f, flags)
writer = getattr(f, "write"); writer = getattr(f, "write");
if (writer == NULL) if (writer == NULL)
return -1; return -1;
if ((flags & PRINT_RAW) && is_stringobject(v)) { if (flags & PRINT_RAW)
value = v; value = strobject(v);
INCREF(value); else
}
else {
value = reprobject(v); value = reprobject(v);
if (value == NULL) { if (value == NULL) {
DECREF(writer); DECREF(writer);
return -1; return -1;
}
} }
result = call_object(writer, value); result = call_object(writer, value);
DECREF(writer); DECREF(writer);
......
...@@ -124,7 +124,11 @@ printobject(op, fp, flags) ...@@ -124,7 +124,11 @@ printobject(op, fp, flags)
op->ob_type->tp_name, (long)op); op->ob_type->tp_name, (long)op);
} }
else { else {
object *s = reprobject(op); object *s;
if (flags & PRINT_RAW)
s = strobject(op);
else
s = reprobject(op);
if (s == NULL) if (s == NULL)
ret = -1; ret = -1;
else if (!is_stringobject(s)) { else if (!is_stringobject(s)) {
...@@ -171,6 +175,36 @@ reprobject(v) ...@@ -171,6 +175,36 @@ reprobject(v)
return (*v->ob_type->tp_repr)(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 int
cmpobject(v, w) cmpobject(v, w)
object *v, *w; object *v, *w;
......
...@@ -1096,12 +1096,7 @@ builtin_str(self, v) ...@@ -1096,12 +1096,7 @@ builtin_str(self, v)
err_badarg(); err_badarg();
return NULL; return NULL;
} }
if (is_stringobject(v)) { return strobject(v);
INCREF(v);
return v;
}
else
return reprobject(v);
} }
static object * static object *
......
...@@ -38,6 +38,8 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -38,6 +38,8 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "graminit.h" #include "graminit.h"
#include "pythonrun.h" #include "pythonrun.h"
#include <ctype.h>
/* Turn this on if your compiler chokes on the big switch: */ /* Turn this on if your compiler chokes on the big switch: */
/* #define CASE_TOO_BIG 1 /**/ /* #define CASE_TOO_BIG 1 /**/
...@@ -660,16 +662,15 @@ eval_code(co, globals, locals, owner, arg) ...@@ -660,16 +662,15 @@ eval_code(co, globals, locals, owner, arg)
w = sysget("stdout"); w = sysget("stdout");
if (softspace(w, 1)) if (softspace(w, 1))
writestring(" ", w); 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); char *s = getstringvalue(v);
int len = getstringsize(v); int len = getstringsize(v);
err = writeobject(v, w, PRINT_RAW); if (len > 0 && isspace(s[len-1]) &&
if (err == 0 && len > 0 && s[len-1] == '\n') s[len-1] != ' ')
softspace(w, 0); softspace(w, 0);
} }
else {
err = writeobject(v, w, 0);
}
DECREF(v); DECREF(v);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment