summaryrefslogtreecommitdiffstats
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r--Python/bltinmodule.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ca5043d..cce19e1 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -85,6 +85,24 @@ builtin_chr(self, v)
}
static object *
+builtin_coerce(self, args)
+ object *self;
+ object *args;
+{
+ object *v, *w;
+ object *res;
+
+ if (!getargs(args, "(OO)", &v, &w))
+ return NULL;
+ if (coerce(&v, &w) < 0)
+ return NULL;
+ res = mkvalue("(OO)", v, w);
+ DECREF(v);
+ DECREF(w);
+ return res;
+}
+
+static object *
builtin_dir(self, v)
object *self;
object *v;
@@ -250,6 +268,9 @@ builtin_float(self, v)
INCREF(v);
return v;
}
+ else if (is_instanceobject(v)) {
+ return instance_convert(v, "__float__");
+ }
err_setstr(TypeError, "float() argument must be int, long or float");
return NULL;
}
@@ -359,6 +380,9 @@ builtin_int(self, v)
/* XXX should check for overflow */
return newintobject((long)x);
}
+ else if (is_instanceobject(v)) {
+ return instance_convert(v, "__int__");
+ }
err_setstr(TypeError, "int() argument must be int, long or float");
return NULL;
}
@@ -385,7 +409,10 @@ builtin_len(self, v)
err_setstr(TypeError, "len() of unsized object");
return NULL;
}
- return newintobject(len);
+ if (len < 0)
+ return NULL;
+ else
+ return newintobject(len);
}
static object *
@@ -407,6 +434,9 @@ builtin_long(self, v)
double x = getfloatvalue(v);
return dnewlongobject(x);
}
+ else if (is_instanceobject(v)) {
+ return instance_convert(v, "__long__");
+ }
err_setstr(TypeError, "long() argument must be int, long or float");
return NULL;
}
@@ -648,6 +678,7 @@ static struct methodlist builtin_methods[] = {
{"abs", builtin_abs},
{"apply", builtin_apply},
{"chr", builtin_chr},
+ {"coerce", builtin_coerce},
{"dir", builtin_dir},
{"divmod", builtin_divmod},
{"eval", builtin_eval},
@@ -766,6 +797,8 @@ coerce(pv, pw)
INCREF(w);
return 0;
}
+ if (is_instanceobject(v) || is_instanceobject(w))
+ return instance_coerce(pv, pw);
if (v->ob_type->tp_as_number == NULL ||
w->ob_type->tp_as_number == NULL) {
err_setstr(TypeError, "mixing number and non-number");