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:
parent
e8a3c28f8d
commit
9e51f9bec8
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue