return (rc);
}
-static long fe_pyhash(PyObject *me)
+static Py_hash_t fe_pyhash(PyObject *me)
{ return (mphash(FE_X(me))); }
static int fe_pycoerce(PyObject **x, PyObject **y)
}
#define UNOP(name, check) \
- static PyObject *femeth_##name(PyObject *me, PyObject *arg) { \
+ static PyObject *femeth_##name(PyObject *me) { \
field *f = FE_F(me); \
mp *x = FE_X(me); \
- if (!PyArg_ParseTuple(arg, ":" #name)) return (0); \
if (!f->ops->name) TYERR(#name " not supported for this field"); \
check \
x = f->ops->name(f, MP_NEW, x); \
UNOP(hlv, ; )
#undef UNOP
-static PyObject *feget_field(PyObject *me, void *hunoz)
- { RETURN_OBJ(FE_FOBJ(me)); }
-
static PyObject *feget_value(PyObject *me, void *hunoz)
{
mp *x = F_OUT(FE_F(me), MP_NEW, FE_X(me));
return (mp_pywrap(x));
}
+static const PyMemberDef fe_pymembers[] = {
+#define MEMBERSTRUCT fe_pyobj
+ MEMRNM(field, T_OBJECT, ob_type, READONLY,
+ "X.field -> field containing X")
+#undef MEMBERSTRUCT
+ { 0 }
+};
+
static const PyGetSetDef fe_pygetset[] = {
#define GETSETNAME(op, name) fe##op##_##name
- GET (field, "X.field -> field containing X")
GET (value, "X.value -> `natural' MP/GF representation of X")
GET (_value, "X._value -> internal MP/GF representation of X")
#undef GETSETNAME
static const PyMethodDef fe_pymethods[] = {
#define METHNAME(func) femeth_##func
- METH (inv, "X.inv() -> X^{-1}")
- METH (sqr, "X.sqr() -> X^2")
- METH (sqrt, "X.sqrt() -> sqrt(X)")
- METH (quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
- METH (dbl, "X.dbl() -> 2 * X (prime only)")
- METH (tpl, "X.tpl() -> 3 * X (prime only)")
- METH (qdl, "X.qdl() -> 4 * X (prime only)")
- METH (hlv, "X.hlv() -> X/2 (prime only)")
+ NAMETH(inv, "X.inv() -> X^{-1}")
+ NAMETH(sqr, "X.sqr() -> X^2")
+ NAMETH(sqrt, "X.sqrt() -> sqrt(X)")
+ NAMETH(quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
+ NAMETH(dbl, "X.dbl() -> 2 * X (prime only)")
+ NAMETH(tpl, "X.tpl() -> 3 * X (prime only)")
+ NAMETH(qdl, "X.qdl() -> 4 * X (prime only)")
+ NAMETH(hlv, "X.hlv() -> X/2 (prime only)")
#undef METHNAME
{ 0 }
};
0, /* @nb_inplace_true_divide@ */
};
-static PyTypeObject fe_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject fe_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"FE", /* @tp_name@ */
sizeof(fe_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
PYMETHODS(fe), /* @tp_methods@ */
- 0, /* @tp_members@ */
+ PYMEMBERS(fe), /* @tp_members@ */
PYGETSET(fe), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
{ return (PyInt_FromLong(FIELD_F(me)->noctets)); }
static PyObject *fget_name(PyObject *me, void *hunoz)
- { return (PyString_FromString(F_NAME(FIELD_F(me)))); }
+ { return (TEXT_FROMSTR(F_NAME(FIELD_F(me)))); }
static PyObject *fget_type(PyObject *me, void *hunoz)
{ return (PyInt_FromLong(F_TYPE(FIELD_F(me)))); }
{ 0 }
};
-static PyTypeObject field_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject field_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"Field", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
#undef GETSETNAME
};
-static PyTypeObject primefield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject primefield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"PrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
return (0);
}
-static PyTypeObject niceprimefield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject niceprimefield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"NicePrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
{ 0 }
};
-static PyTypeObject binfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject binfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"BinField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
return (0);
}
-static PyTypeObject binpolyfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject binpolyfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"BinPolyField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
{ 0 }
};
-static PyTypeObject binnormfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+static const PyTypeObject binnormfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"BinNormField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
/*----- Setup -------------------------------------------------------------*/
+static const struct nameval consts[] = {
+ CONST(FTY_PRIME), CONST(FTY_BINARY),
+ { 0 }
+};
+
void field_pyinit(void)
{
INITTYPE(fe, root);
INSERT("BinField", binfield_pytype);
INSERT("BinPolyField", binpolyfield_pytype);
INSERT("BinNormField", binnormfield_pytype);
+ setconstants(mod, consts);
}
/*----- That's all, folks -------------------------------------------------*/