X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/f76230157bd427829e49628de37d53f9c8ae7842..refs/heads/mdw/freebin:/field.c diff --git a/field.c b/field.c index b29d8a9..2e99efc 100644 --- a/field.c +++ b/field.c @@ -107,23 +107,18 @@ PyObject *fe_pywrap(PyObject *fobj, mp *x) return ((PyObject *)z); } -static mp *tofe(field *f, PyObject *o) +static mp *implicitfe(field *f, PyObject *o) { - mp *x = 0, *y = 0; - - if (FE_PYCHECK(o)) { - if (FE_F(o) != f && !field_samep(FE_F(o), f)) return (0); - y = MP_COPY(FE_X(o)); - } else if ((x = tomp(o)) != 0) { - if (MP_ZEROP(x)) - y = MP_COPY(f->zero); - else if (MP_EQ(x, MP_ONE)) - y = MP_COPY(f->one); - else - y = F_IN(f, MP_NEW, x); - MP_DROP(x); + mp *x; + + if (FE_PYCHECK(o) && FE_F(o) == f) return (MP_COPY(FE_X(o))); + switch (f->ops->ty) { + case FTY_PRIME: x = implicitmp(o); break; + case FTY_BINARY: x = implicitgf(o); break; + default: assert(!"huh?"); } - return (y); + if (!x) return (0); + return (F_IN(f, MP_NEW, x)); } /*----- Field elements ----------------------------------------------------*/ @@ -135,9 +130,9 @@ static int febinop(PyObject *x, PyObject *y, else if (FE_PYCHECK(y)) *fobj = FE_FOBJ(y); else return (-1); *f = FIELD_F(*fobj); - if ((*xx = tofe(*f, x)) == 0) + if ((*xx = implicitfe(*f, x)) == 0) return (-1); - if ((*yy = tofe(*f, y)) == 0) { + if ((*yy = implicitfe(*f, y)) == 0) { MP_DROP(*xx); return (-1); } @@ -179,7 +174,10 @@ static PyObject *fe_pyexp(PyObject *x, PyObject *y, PyObject *z) field *ff; mp *xx, *yy; - if (z != Py_None || !FE_PYCHECK(x) || (yy = tomp(y)) == 0) + if (z != Py_None || !FE_PYCHECK(x)) RETURN_NOTIMPL; + if (FE_PYCHECK(y) && FE_F(y)->ops->ty == FTY_PRIME) + yy = F_OUT(FE_F(y), MP_NEW, FE_X(y)); + else if ((yy = implicitmp(y)) == 0) RETURN_NOTIMPL; ff = FE_F(x); xx = FE_X(x); MP_COPY(xx); if (MP_NEGP(yy) && F_ZEROP(ff, xx)) ZDIVERR("division by zero"); @@ -232,7 +230,7 @@ static int fe_pycoerce(PyObject **x, PyObject **y) Py_INCREF(*x); Py_INCREF(*y); return (0); } - if ((z = tofe(FE_F(*x), *y)) != 0) { + if ((z = implicitfe(FE_F(*x), *y)) != 0) { Py_INCREF(*x); *y = fe_pywrap(FE_FOBJ(*x), z); return (0);