]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
* Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
authorGuido van Rossum <guido@python.org>
Sat, 7 Jan 1995 12:39:01 +0000 (12:39 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 7 Jan 1995 12:39:01 +0000 (12:39 +0000)
use new instancebinop interface

Python/bltinmodule.c

index c553be60aa003cc60086eff5ae8785bd10587068..59e15e1f4bd9f701ffe6c9e396847176eeb32211 100644 (file)
@@ -256,17 +256,13 @@ builtin_cmp(self, args)
 }
 
 static object *
-builtin_coerce(self, args)
-       object *self;
-       object *args;
-{
+do_coerce(v, w)
        object *v, *w;
+{
        object *res;
-
-       if (!newgetargs(args, "OO:coerce", &v, &w))
-               return NULL;
        if (is_instanceobject(v) || is_instanceobject(w))
-               return instancebinop(v, w, "__coerce__", "__rcoerce__");
+               return instancebinop(v, w, "__coerce__", "__rcoerce__",
+                                    do_coerce);
        if (coerce(&v, &w) < 0)
                return NULL;
        res = mkvalue("(OO)", v, w);
@@ -275,6 +271,18 @@ builtin_coerce(self, args)
        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;
@@ -336,16 +344,14 @@ builtin_dir(self, args)
 }
 
 static object *
-builtin_divmod(self, args)
-       object *self;
-       object *args;
+do_divmod(v, w)
+       object *v, *w;
 {
-       object *v, *w, *x;
+       object *res;
 
-       if (!newgetargs(args, "OO:divmod", &v, &w))
-               return NULL;
        if (is_instanceobject(v) || is_instanceobject(w))
-               return instancebinop(v, w, "__divmod__", "__rdivmod__");
+               return instancebinop(v, w, "__divmod__", "__rdivmod__",
+                                    do_divmod);
        if (v->ob_type->tp_as_number == NULL ||
                                w->ob_type->tp_as_number == NULL) {
                err_setstr(TypeError,
@@ -354,10 +360,22 @@ builtin_divmod(self, args)
        }
        if (coerce(&v, &w) != 0)
                return NULL;
-       x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
+       res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
        DECREF(v);
        DECREF(w);
-       return x;
+       return res;
+}
+
+static object *
+builtin_divmod(self, args)
+       object *self;
+       object *args;
+{
+       object *v, *w;
+
+       if (!newgetargs(args, "OO:divmod", &v, &w))
+               return NULL;
+       return do_divmod(v, w);
 }
 
 static object *
@@ -896,58 +914,68 @@ builtin_ord(self, args)
        return newintobject((long)(c & 0xff));
 }
 
+static object *
+do_pow(v, w)
+       object *v, *w;
+{
+       object *res;
+       if (is_instanceobject(v) || is_instanceobject(w))
+               return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
+       if (v->ob_type->tp_as_number == NULL ||
+           w->ob_type->tp_as_number == NULL) {
+               err_setstr(TypeError, "pow() requires numeric arguments");
+               return NULL;
+       }
+       if (coerce(&v, &w) != 0)
+               return NULL;
+       res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
+       DECREF(v);
+       DECREF(w);
+       return res;
+}
+
 static object *
 builtin_pow(self, args)
        object *self;
        object *args;
 {
-       object *v, *w, *z = None, *x;
+       object *v, *w, *z = None, *res;
+       object *v1, *z1, *w2, *z2;
 
        if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
                return NULL;
-       if (z == None) {
-               if (is_instanceobject(v) || is_instanceobject(w))
-                       return instancebinop(v, w, "__pow__", "__rpow__");
-       }
-       else {
-               /* XXX The ternary version doesn't do coercions */
-               if (is_instanceobject(v))
-                       return v->ob_type->tp_as_number->nb_power(v, w, z);
-       }
+       if (z == None)
+               return do_pow(v, w);
+       /* XXX The ternary version doesn't do class instance coercions */
+       if (is_instanceobject(v))
+               return v->ob_type->tp_as_number->nb_power(v, w, z);
        if (v->ob_type->tp_as_number == NULL ||
-           (z!=None && z->ob_type->tp_as_number == NULL) ||
+           z->ob_type->tp_as_number == NULL ||
            w->ob_type->tp_as_number == NULL) {
                err_setstr(TypeError, "pow() requires numeric arguments");
                return NULL;
        }
        if (coerce(&v, &w) != 0)
                return NULL;
-       if (z == None) {
-               x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
-       }
-       else {
-               object *v1, *z1, *w2, *z2;
-               x = NULL;
-               v1 = v;
-               z1 = z;
-               if (coerce(&v1, &z1) != 0)
-                       goto error2;
-               w2 = w;
-               z2 = z1;
-               if (coerce(&w2, &z2) != 0)
-                       goto error1;
-               x = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
-               DECREF(w2);
-               DECREF(z2);
-       error1:
-               DECREF(v1);
-               DECREF(z1);
-       error2:
-               ;
-       }
+       res = NULL;
+       v1 = v;
+       z1 = z;
+       if (coerce(&v1, &z1) != 0)
+               goto error2;
+       w2 = w;
+       z2 = z1;
+       if (coerce(&w2, &z2) != 0)
+               goto error1;
+       res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
+       DECREF(w2);
+       DECREF(z2);
+ error1:
+       DECREF(v1);
+       DECREF(z1);
+ error2:
        DECREF(v);
        DECREF(w);
-       return x;
+       return res;
 }
 
 static object *