diff options
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r-- | Python/bltinmodule.c | 132 |
1 files changed, 80 insertions, 52 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index c553be6..59e15e1 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -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); @@ -276,6 +272,18 @@ builtin_coerce(self, args) } 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; object *args; @@ -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 * @@ -897,57 +915,67 @@ builtin_ord(self, args) } 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 * |