summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/object.c33
-rw-r--r--Python/bltinmodule.c57
2 files changed, 40 insertions, 50 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 424caeb..c19d96f 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -319,6 +319,39 @@ testbool(v)
return res;
}
+/* Coerce two numeric types to the "larger" one.
+ Increment the reference count on each argument.
+ Return -1 and raise an exception if no coercion is possible
+ (and then no reference count is incremented).
+*/
+
+int
+coerce(pv, pw)
+ object **pv, **pw;
+{
+ register object *v = *pv;
+ register object *w = *pw;
+ int res;
+
+ if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
+ INCREF(v);
+ INCREF(w);
+ return 0;
+ }
+ if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
+ res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
+ if (res <= 0)
+ return res;
+ }
+ if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
+ res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
+ if (res <= 0)
+ return res;
+ }
+ err_setstr(TypeError, "number coercion failed");
+ return -1;
+}
+
/*
NoObject is usable as a non-NULL undefined value, used by the macro None.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 53720ad..f47b408 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -256,31 +256,21 @@ builtin_cmp(self, args)
}
static object *
-do_coerce(v, w)
- object *v, *w;
-{
- object *res;
- if (is_instanceobject(v) || is_instanceobject(w))
- return instancebinop(v, w, "__coerce__", "__rcoerce__",
- do_coerce);
- if (coerce(&v, &w) < 0)
- return NULL;
- res = mkvalue("(OO)", v, w);
- DECREF(v);
- DECREF(w);
- return res;
-}
-
-static object *
builtin_coerce(self, args)
object *self;
object *args;
{
object *v, *w;
+ object *res;
if (!newgetargs(args, "OO:coerce", &v, &w))
return NULL;
- return do_coerce(v, w);
+ if (coerce(&v, &w) < 0)
+ return NULL;
+ res = mkvalue("(OO)", v, w);
+ DECREF(v);
+ DECREF(w);
+ return res;
}
static object *
@@ -1464,39 +1454,6 @@ initbuiltin()
(void) dictinsert(builtin_dict, "None", None);
}
-/* Coerce two numeric types to the "larger" one.
- Increment the reference count on each argument.
- Return -1 and raise an exception if no coercion is possible
- (and then no reference count is incremented).
-*/
-
-int
-coerce(pv, pw)
- object **pv, **pw;
-{
- register object *v = *pv;
- register object *w = *pw;
- int res;
-
- if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
- INCREF(v);
- INCREF(w);
- return 0;
- }
- if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
- res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
- if (res <= 0)
- return res;
- }
- if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
- res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
- if (res <= 0)
- return res;
- }
- err_setstr(TypeError, "number coercion failed");
- return -1;
-}
-
/* Helper for filter(): filter a tuple through a function */