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__.
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 @@
 	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 @@
 }
 
 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 @@
 	{"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 @@
 	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;