From 9e51f9bec85ac8bc167c2fb8d3956968ef8311af Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 12 Feb 1993 16:29:05 +0000 Subject: 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__. --- Objects/classobject.c | 4 ++-- Python/bltinmodule.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Objects/classobject.c b/Objects/classobject.c index 0661e81..1e6fdb6 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -619,9 +619,9 @@ instance_nonzero(self) object *func, *res; long outcome; - if ((func = instance_getattr(self, "__len__")) == NULL) { + if ((func = instance_getattr(self, "__nonzero__")) == NULL) { err_clear(); - if ((func = instance_getattr(self, "__nonzero__")) == NULL) { + if ((func = instance_getattr(self, "__len__")) == NULL) { err_clear(); /* Fall back to the default behavior: all instances are nonzero */ diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 85fd58e..97c1303 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -616,6 +616,34 @@ builtin_repr(self, 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 * builtin_str(self, v) object *self; object *v; @@ -674,6 +702,7 @@ static struct methodlist builtin_methods[] = { {"raw_input", builtin_raw_input}, {"reload", builtin_reload}, {"repr", builtin_repr}, + {"round", builtin_round}, {"setattr", builtin_setattr}, {"str", builtin_str}, {"type", builtin_type}, @@ -766,7 +795,7 @@ coerce(pv, pw) register object *w = *pw; int res; - if (v->ob_type == w->ob_type) { + if (v->ob_type == w->ob_type && !is_instanceobject(v)) { INCREF(v); INCREF(w); return 0; -- cgit v0.12