bltinmodule.c: added round(x, [n]); coerce() of two class instances

will try to coerce anyway.
classobject.c: instance 'nonzero' should first try __nonzero__
only then __len__.
This commit is contained in:
Guido van Rossum 1993-02-12 16:29:05 +00:00
parent e8a3c28f8d
commit 9e51f9bec8
2 changed files with 32 additions and 3 deletions

View File

@ -619,9 +619,9 @@ instance_nonzero(self)
object *func, *res; object *func, *res;
long outcome; long outcome;
if ((func = instance_getattr(self, "__len__")) == NULL) {
err_clear();
if ((func = instance_getattr(self, "__nonzero__")) == NULL) { if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
err_clear();
if ((func = instance_getattr(self, "__len__")) == NULL) {
err_clear(); err_clear();
/* Fall back to the default behavior: /* Fall back to the default behavior:
all instances are nonzero */ all instances are nonzero */

View File

@ -615,6 +615,34 @@ builtin_repr(self, v)
return reprobject(v); return reprobject(v);
} }
static object *
builtin_round(self, args)
object *self;
object *args;
{
extern double floor PROTO((double));
extern double ceil PROTO((double));
double x;
double f;
int ndigits = 0;
int sign = 1;
int i;
if (!getargs(args, "d", &x)) {
err_clear();
if (!getargs(args, "(di)", &x, &ndigits))
return NULL;
}
f = 1.0;
for (i = ndigits; --i >= 0; )
f = f*10.0;
for (i = ndigits; ++i <= 0; )
f = f*0.1;
if (x >= 0.0)
return newfloatobject(floor(x*f + 0.5) / f);
else
return newfloatobject(ceil(x*f - 0.5) / f);
}
static object * static object *
builtin_str(self, v) builtin_str(self, v)
object *self; object *self;
@ -674,6 +702,7 @@ static struct methodlist builtin_methods[] = {
{"raw_input", builtin_raw_input}, {"raw_input", builtin_raw_input},
{"reload", builtin_reload}, {"reload", builtin_reload},
{"repr", builtin_repr}, {"repr", builtin_repr},
{"round", builtin_round},
{"setattr", builtin_setattr}, {"setattr", builtin_setattr},
{"str", builtin_str}, {"str", builtin_str},
{"type", builtin_type}, {"type", builtin_type},
@ -766,7 +795,7 @@ coerce(pv, pw)
register object *w = *pw; register object *w = *pw;
int res; int res;
if (v->ob_type == w->ob_type) { if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
INCREF(v); INCREF(v);
INCREF(w); INCREF(w);
return 0; return 0;