field.c: Replace `tofe' by `implicitfe', calling `implicit{mp,gf}'.
[catacomb-python] / field.c
diff --git a/field.c b/field.c
index b29d8a9..9380678 100644 (file)
--- 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);
   }
@@ -232,7 +227,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);