- 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?");