From 5524a59b0930638413ab44b150a3e66818a34cf9 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 10 Jan 1995 15:26:20 +0000 Subject: [PATCH] move coerce() from bltinmodule.c to object.c and implement builtin_coerce() differently --- Objects/object.c | 33 +++++++++++++++++++++++++ Python/bltinmodule.c | 57 ++++++-------------------------------------- 2 files changed, 40 insertions(+), 50 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index 424caeb8ab8..c19d96ff371 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 53720ada474..f47b4085e29 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -256,13 +256,15 @@ builtin_cmp(self, args) } static object * -do_coerce(v, w) - object *v, *w; +builtin_coerce(self, args) + object *self; + object *args; { + object *v, *w; object *res; - if (is_instanceobject(v) || is_instanceobject(w)) - return instancebinop(v, w, "__coerce__", "__rcoerce__", - do_coerce); + + if (!newgetargs(args, "OO:coerce", &v, &w)) + return NULL; if (coerce(&v, &w) < 0) return NULL; res = mkvalue("(OO)", v, w); @@ -271,18 +273,6 @@ do_coerce(v, w) return res; } -static object * -builtin_coerce(self, args) - object *self; - object *args; -{ - object *v, *w; - - if (!newgetargs(args, "OO:coerce", &v, &w)) - return NULL; - return do_coerce(v, w); -} - static object * builtin_compile(self, args) object *self; @@ -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 */