pubkey: Various stupid DSA bugs fixed.
[catacomb-python] / field.c
diff --git a/field.c b/field.c
index ea7d6de..9f51f5f 100644 (file)
--- a/field.c
+++ b/field.c
@@ -56,20 +56,19 @@ static PyObject *fe_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
 
 static PyObject *field_dopywrap(PyTypeObject *ty, field *f)
 {
-  field_pyobj *fobj = newtype(ty, 0);
+  field_pyobj *fobj = newtype(ty, 0, f->ops->name);
   fobj->f = f;
-  fobj->ty.tp_name = (/*unconst*/ char *)f->ops->name;
-  fobj->ty.tp_basicsize = sizeof(fe_pyobj);
-  fobj->ty.tp_base = fe_pytype;
+  fobj->ty.ht_type.tp_basicsize = sizeof(fe_pyobj);
+  fobj->ty.ht_type.tp_base = fe_pytype;
   Py_INCREF(fe_pytype);
-  fobj->ty.tp_flags = (Py_TPFLAGS_DEFAULT |
-                      Py_TPFLAGS_BASETYPE |
-                      Py_TPFLAGS_CHECKTYPES |
-                      Py_TPFLAGS_HEAPTYPE);
-  fobj->ty.tp_alloc = PyType_GenericAlloc;
-  fobj->ty.tp_free = _PyObject_Del;
-  fobj->ty.tp_new = fe_pynew;
-  PyType_Ready(&fobj->ty);
+  fobj->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT |
+                              Py_TPFLAGS_BASETYPE |
+                              Py_TPFLAGS_CHECKTYPES |
+                              Py_TPFLAGS_HEAPTYPE);
+  fobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
+  fobj->ty.ht_type.tp_free = 0;
+  fobj->ty.ht_type.tp_new = fe_pynew;
+  PyType_Ready(&fobj->ty.ht_type);
   return ((PyObject *)fobj);
 }
 
@@ -116,16 +115,16 @@ static mp *tofe(field *f, PyObject *o)
 
   if (FE_PYCHECK(o)) {
     if (FE_F(o) != f && !field_samep(FE_F(o), f)) return (0);
-    y = FE_X(o);
-  }
-  if ((x = tomp(o)) != 0) {
+    y = MP_COPY(FE_X(o));
+  } else if ((x = tomp(o)) != 0) {
     if (MP_ZEROP(x))
-      y = f->zero;
+      y = MP_COPY(f->zero);
     else if (MP_EQ(x, MP_ONE))
-      y = f->one;
+      y = MP_COPY(f->one);
+    else
+      y = F_IN(f, MP_NEW, x);
+    MP_DROP(x);
   }
-  if (x) MP_DROP(x);
-  if (y) MP_COPY(y);
   return (y);
 }
 
@@ -273,7 +272,7 @@ static PyObject *fe_pyint(PyObject *x)
 static PyObject *fe_pylong(PyObject *x)
 {
   mp *xx = F_OUT(FE_F(x), MP_NEW, FE_X(x));
-  PyObject *rc = (PyObject *)mp_topylong(xx);
+  PyObject *rc = mp_topylong(xx);
   MP_DROP(xx);
   return (rc);
 }
@@ -293,7 +292,7 @@ static void fe_pydealloc(PyObject *me)
 {
   Py_DECREF(FE_FOBJ(me));
   MP_DROP(FE_X(me));
-  PyObject_DEL(me);
+  FREEOBJ(me);
 }
 
 #define UNOP(name, check)                                              \
@@ -408,7 +407,7 @@ static PyNumberMethods fe_pynumber = {
 };
 
 static PyTypeObject fe_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.FE",                       /* @tp_name@ */
   sizeof(fe_pyobj),                    /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -440,7 +439,7 @@ static PyTypeObject fe_pytype_skel = {
   fe_pyrichcompare,                    /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   fe_pymethods,                                /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   fe_pygetset,                         /* @tp_getset@ */
@@ -452,7 +451,7 @@ static PyTypeObject fe_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   abstract_pynew,                      /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -538,7 +537,7 @@ static PyMethodDef field_pymethods[] = {
 };
 
 static PyTypeObject field_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.Field",                    /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -569,7 +568,7 @@ static PyTypeObject field_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   field_pymethods,                     /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   field_pygetset,                      /* @tp_getset@ */
@@ -581,7 +580,7 @@ static PyTypeObject field_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   abstract_pynew,                      /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -594,7 +593,7 @@ static PyObject *primefield_pynew(PyTypeObject *ty,
   field *f;
   char *kwlist[] = { "p", 0 };
 
-  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:primefield", kwlist,
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:primefield", kwlist,
                                   convmp, &xx))
     goto end;
   if ((f = field_prime(xx)) == 0)
@@ -616,7 +615,7 @@ static PyGetSetDef primefield_pygetset[] = {
 };
 
 static PyTypeObject primefield_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.PrimeField",               /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -647,7 +646,7 @@ static PyTypeObject primefield_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   primefield_pygetset,                 /* @tp_getset@ */
@@ -659,7 +658,7 @@ static PyTypeObject primefield_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   primefield_pynew,                    /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -683,7 +682,7 @@ end:
 }
 
 static PyTypeObject niceprimefield_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.NicePrimeField",           /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -714,7 +713,7 @@ static PyTypeObject niceprimefield_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
@@ -726,7 +725,7 @@ static PyTypeObject niceprimefield_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   niceprimefield_pynew,                        /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -743,7 +742,7 @@ static PyGetSetDef binfield_pygetset[] = {
 };
 
 static PyTypeObject binfield_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.BinField",                 /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -774,7 +773,7 @@ static PyTypeObject binfield_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   binfield_pygetset,                   /* @tp_getset@ */
@@ -786,7 +785,7 @@ static PyTypeObject binfield_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   abstract_pynew,                      /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -816,7 +815,7 @@ static PyGetSetDef binpolyfield_pygetset[] = {
 };
 
 static PyTypeObject binpolyfield_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.BinPolyField",             /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -847,7 +846,7 @@ static PyTypeObject binpolyfield_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   binpolyfield_pygetset,               /* @tp_getset@ */
@@ -859,7 +858,7 @@ static PyTypeObject binpolyfield_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   binpolyfield_pynew,                  /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -898,7 +897,7 @@ static PyGetSetDef binnormfield_pygetset[] = {
 };
 
 static PyTypeObject binnormfield_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.BinNormField",             /* @tp_name@ */
   sizeof(field_pyobj),                 /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -929,7 +928,7 @@ static PyTypeObject binnormfield_pytype_skel = {
   field_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   binnormfield_pygetset,               /* @tp_getset@ */
@@ -941,7 +940,7 @@ static PyTypeObject binnormfield_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   binnormfield_pynew,                  /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };