Commit 7eff46cc authored by Guido van Rossum's avatar Guido van Rossum

* Python/bltinmodule.c: restructured coerce(), divmod(), pow() to

	use new instancebinop interface
parent 4127bd3f
...@@ -256,17 +256,13 @@ builtin_cmp(self, args) ...@@ -256,17 +256,13 @@ builtin_cmp(self, args)
} }
static object * static object *
builtin_coerce(self, args) do_coerce(v, w)
object *self;
object *args;
{
object *v, *w; object *v, *w;
{
object *res; object *res;
if (!newgetargs(args, "OO:coerce", &v, &w))
return NULL;
if (is_instanceobject(v) || is_instanceobject(w)) 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) if (coerce(&v, &w) < 0)
return NULL; return NULL;
res = mkvalue("(OO)", v, w); res = mkvalue("(OO)", v, w);
...@@ -275,6 +271,18 @@ builtin_coerce(self, args) ...@@ -275,6 +271,18 @@ builtin_coerce(self, args)
return res; 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 * static object *
builtin_compile(self, args) builtin_compile(self, args)
object *self; object *self;
...@@ -336,16 +344,14 @@ builtin_dir(self, args) ...@@ -336,16 +344,14 @@ builtin_dir(self, args)
} }
static object * static object *
builtin_divmod(self, args) do_divmod(v, w)
object *self; object *v, *w;
object *args;
{ {
object *v, *w, *x; object *res;
if (!newgetargs(args, "OO:divmod", &v, &w))
return NULL;
if (is_instanceobject(v) || is_instanceobject(w)) 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 || if (v->ob_type->tp_as_number == NULL ||
w->ob_type->tp_as_number == NULL) { w->ob_type->tp_as_number == NULL) {
err_setstr(TypeError, err_setstr(TypeError,
...@@ -354,10 +360,22 @@ builtin_divmod(self, args) ...@@ -354,10 +360,22 @@ builtin_divmod(self, args)
} }
if (coerce(&v, &w) != 0) if (coerce(&v, &w) != 0)
return NULL; 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(v);
DECREF(w); 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 * static object *
...@@ -896,58 +914,68 @@ builtin_ord(self, args) ...@@ -896,58 +914,68 @@ builtin_ord(self, args)
return newintobject((long)(c & 0xff)); 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 * static object *
builtin_pow(self, args) builtin_pow(self, args)
object *self; object *self;
object *args; 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)) if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
return NULL; return NULL;
if (z == None) { if (z == None)
if (is_instanceobject(v) || is_instanceobject(w)) return do_pow(v, w);
return instancebinop(v, w, "__pow__", "__rpow__"); /* XXX The ternary version doesn't do class instance coercions */
} if (is_instanceobject(v))
else { return v->ob_type->tp_as_number->nb_power(v, w, z);
/* 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 (v->ob_type->tp_as_number == NULL || 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) { w->ob_type->tp_as_number == NULL) {
err_setstr(TypeError, "pow() requires numeric arguments"); err_setstr(TypeError, "pow() requires numeric arguments");
return NULL; return NULL;
} }
if (coerce(&v, &w) != 0) if (coerce(&v, &w) != 0)
return NULL; return NULL;
if (z == None) { res = NULL;
x = (*v->ob_type->tp_as_number->nb_power)(v, w, z); v1 = v;
} z1 = z;
else { if (coerce(&v1, &z1) != 0)
object *v1, *z1, *w2, *z2; goto error2;
x = NULL; w2 = w;
v1 = v; z2 = z1;
z1 = z; if (coerce(&w2, &z2) != 0)
if (coerce(&v1, &z1) != 0) goto error1;
goto error2; res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
w2 = w; DECREF(w2);
z2 = z1; DECREF(z2);
if (coerce(&w2, &z2) != 0) error1:
goto error1; DECREF(v1);
x = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2); DECREF(z1);
DECREF(w2); error2:
DECREF(z2);
error1:
DECREF(v1);
DECREF(z1);
error2:
;
}
DECREF(v); DECREF(v);
DECREF(w); DECREF(w);
return x; return res;
} }
static object * static object *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment