X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/827f89d7920979b763e228970132c3624a921b13..6311e4f71d2aac179fa3841d47302cdb642e487d:/pgen.c diff --git a/pgen.c b/pgen.c index 18b0c26..3c2a792 100644 --- a/pgen.c +++ b/pgen.c @@ -100,12 +100,12 @@ static PyObject *pfmeth_jump(PyObject *me, PyObject *arg) RETURN_ME; } -static PyObject *meth__PrimeFilter_smallfactor(PyObject *me, PyObject *arg) +static PyObject *pfmeth_smallfactor(PyObject *me, PyObject *arg) { mp *x = 0; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "OO&:smallfactor", &me, convmp, &x)) goto end; + if (!PyArg_ParseTuple(arg, "O&:smallfactor", convmp, &x)) goto end; rc = PyInt_FromLong(pfilt_smallfactor(x)); end: mp_drop(x); @@ -125,8 +125,10 @@ static PyObject *pfilt_pyint(PyObject *me) return (rc); } +#ifdef PY2 static PyObject *pfilt_pylong(PyObject *me) { return (mp_topylong(PFILT_F(me)->m)); } +#endif static PyObject *pfget_x(PyObject *me, void *hunoz) { return (mp_pywrap(MP_COPY(PFILT_F(me)->m))); } @@ -134,7 +136,7 @@ static PyObject *pfget_x(PyObject *me, void *hunoz) static PyObject *pfget_status(PyObject *me, void *hunoz) { return (PyInt_FromLong(PFILT_ST(me))); } -static PyGetSetDef pfilt_pygetset[] = { +static const PyGetSetDef pfilt_pygetset[] = { #define GETSETNAME(op, name) pf##op##_##name GET (x, "F.x -> current position of filter") GET (status, "F.status -> primality status of filter") @@ -142,20 +144,23 @@ static PyGetSetDef pfilt_pygetset[] = { { 0 } }; -static PyMethodDef pfilt_pymethods[] = { +static const PyMethodDef pfilt_pymethods[] = { #define METHNAME(name) pfmeth_##name METH (step, "F.step(N)") METH (muladd, "F.muladd(M, A)") METH (jump, "F.jump(FF)") + SMTH (smallfactor, "smallfactor(X) -> PGST") #undef METHNAME { 0 } }; -static PyNumberMethods pfilt_pynumber = { +static const PyNumberMethods pfilt_pynumber = { 0, /* @nb_add@ */ 0, /* @nb_subtract@ */ 0, /* @nb_multiply@ */ +#ifdef PY2 0, /* @nb_divide@ */ +#endif 0, /* @nb_remainder@ */ 0, /* @nb_divmod@ */ 0, /* @nb_power@ */ @@ -169,17 +174,23 @@ static PyNumberMethods pfilt_pynumber = { 0, /* @nb_and@ */ 0, /* @nb_xor@ */ 0, /* @nb_or@ */ +#ifdef PY2 0, /* @nb_coerce@ */ +#endif pfilt_pyint, /* @nb_int@ */ - pfilt_pylong, /* @nb_long@ */ + PY23(pfilt_pylong, 0), /* @nb_long@ */ 0, /* @nb_float@ */ +#ifdef PY2 0, /* @nb_oct@ */ 0, /* @nb_hex@ */ +#endif 0, /* @nb_inplace_add@ */ 0, /* @nb_inplace_subtract@ */ 0, /* @nb_inplace_multiply@ */ +#ifdef PY2 0, /* @nb_inplace_divide@ */ +#endif 0, /* @nb_inplace_remainder@ */ 0, /* @nb_inplace_power@ */ 0, /* @nb_inplace_lshift@ */ @@ -194,8 +205,8 @@ static PyNumberMethods pfilt_pynumber = { 0, /* @nb_inplace_true_divide@ */ }; -static PyTypeObject pfilt_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pfilt_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeFilter", /* @tp_name@ */ sizeof(pfilt_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -206,7 +217,7 @@ static PyTypeObject pfilt_pytype_skel = { 0, /* @tp_setattr@ */ 0, /* @tp_compare@ */ 0, /* @tp_repr@ */ - &pfilt_pynumber, /* @tp_as_number@ */ + PYNUMBER(pfilt), /* @tp_as_number@ */ 0, /* @tp_as_sequence@ */ 0, /* @tp_as_mapping@ */ 0, /* @tp_hash@ */ @@ -219,7 +230,7 @@ static PyTypeObject pfilt_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"PrimeFilter(X): small-primes filter.", + "PrimeFilter(X): small-primes filter.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -227,9 +238,9 @@ static PyTypeObject pfilt_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - pfilt_pymethods, /* @tp_methods@ */ + PYMETHODS(pfilt), /* @tp_methods@ */ 0, /* @tp_members@ */ - pfilt_pygetset, /* @tp_getset@ */ + PYGETSET(pfilt), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -303,15 +314,15 @@ static PyObject *rget_niters(PyObject *me, void *hunoz) static PyObject *rget_x(PyObject *me, void *hunoz) { return (mp_pywrap(MP_COPY(RABIN_R(me)->mm.m))); } -static PyObject *meth__RabinMiller_iters(PyObject *me, PyObject *arg) +static PyObject *rmeth_iters(PyObject *me, PyObject *arg) { unsigned n; - if (!PyArg_ParseTuple(arg, "OO&:iters", &me, convuint, &n)) return (0); + if (!PyArg_ParseTuple(arg, "O&:iters", convuint, &n)) return (0); return (PyInt_FromLong(rabin_iters(n))); } -static PyGetSetDef rabin_pygetset[] = { +static const PyGetSetDef rabin_pygetset[] = { #define GETSETNAME(op, name) r##op##_##name GET (x, "R.x -> number under test") GET (niters, "R.niters -> suggested number of tests") @@ -319,16 +330,17 @@ static PyGetSetDef rabin_pygetset[] = { { 0 } }; -static PyMethodDef rabin_pymethods[] = { +static const PyMethodDef rabin_pymethods[] = { #define METHNAME(name) rmeth_##name METH (test, "R.test(W) -> PGST") METH (rtest, "R.rtest(W) -> PGST") + SMTH (iters, "iters(NBITS) -> NITERS") #undef METHNAME { 0 } }; -static PyTypeObject rabin_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject rabin_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "RabinMiller", /* @tp_name@ */ sizeof(rabin_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -352,7 +364,7 @@ static PyTypeObject rabin_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"RabinMiller(X): Rabin-Miller strong primality test.", + "RabinMiller(X): Rabin-Miller strong primality test.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -360,9 +372,9 @@ static PyTypeObject rabin_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - rabin_pymethods, /* @tp_methods@ */ + PYMETHODS(rabin), /* @tp_methods@ */ 0, /* @tp_members@ */ - rabin_pygetset, /* @tp_getset@ */ + PYGETSET(rabin), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -406,8 +418,7 @@ static void pgevent_kill(PyObject *me) static void pgevent_pydealloc(PyObject *me) { pgevent_pyobj *ev = (pgevent_pyobj *)me; - if (ev->r) Py_DECREF(ev->r); - FREEOBJ(me); + Py_XDECREF(ev->r); FREEOBJ(me); } #define PGEVENT_CHECK(me) do { \ @@ -418,7 +429,7 @@ static void pgevent_pydealloc(PyObject *me) } while (0) static PyObject *peget_name(PyObject *me, void *hunoz) - { PGEVENT_CHECK(me); return (PyString_FromString(PGEVENT_EV(me)->name)); } + { PGEVENT_CHECK(me); return (TEXT_FROMSTR(PGEVENT_EV(me)->name)); } static PyObject *peget_x(PyObject *me, void *hunoz) { PGEVENT_CHECK(me); return (mp_pywrap(MP_COPY(PGEVENT_EV(me)->m))); } @@ -443,6 +454,7 @@ static int peset_x(PyObject *me, PyObject *xobj, void *hunoz) mp *x = 0; pgen_event *ev = PGEVENT_EV(me); int rc = -1; + if (!xobj) NIERR("__del__"); PGEVENT_CHECK(me); if ((x = getmp(xobj)) == 0) goto end; mp_drop(ev->m); @@ -453,7 +465,7 @@ end: return (rc); } -static PyGetSetDef pgevent_pygetset[] = { +static const PyGetSetDef pgevent_pygetset[] = { #define GETSETNAME(op, name) pe##op##_##name GET (name, "EV.name -> value being generated") GETSET(x, "EV.x -> value under test") @@ -464,8 +476,8 @@ static PyGetSetDef pgevent_pygetset[] = { { 0 } }; -static PyTypeObject pgevent_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgevent_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenEvent", /* @tp_name@ */ sizeof(pgevent_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -489,7 +501,7 @@ static PyTypeObject pgevent_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"Prime-generation event.", + "Prime-generation event.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -499,7 +511,7 @@ static PyTypeObject pgevent_pytype_skel = { 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ - pgevent_pygetset, /* @tp_getset@ */ + PYGETSET(pgevent), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -543,7 +555,7 @@ static PyTypeObject *pgtest_pytype; static int pgev_python(int rq, pgen_event *ev, void *p) { - PyObject *py = p; + pypgev *pg = p; PyObject *pyev = 0; PyObject *rc = 0; int st = PGEN_ABORT; @@ -551,11 +563,10 @@ static int pgev_python(int rq, pgen_event *ev, void *p) static const char *const meth[] = { "pg_abort", "pg_done", "pg_begin", "pg_try", "pg_fail", "pg_pass" }; - Py_INCREF(py); rq++; if (rq > N(meth)) SYSERR("event code out of range"); pyev = pgevent_pywrap(ev); - if ((rc = PyObject_CallMethod(py, (/*unconst*/ char *)meth[rq], + if ((rc = PyObject_CallMethod(pg->obj, (/*unconst*/ char *)meth[rq], "(O)", pyev)) == 0) goto end; if (rc == Py_None) @@ -567,12 +578,13 @@ static int pgev_python(int rq, pgen_event *ev, void *p) else st = l; end: + if (PyErr_Occurred()) + stash_exception(pg->exc, "exception from `pgen' handler"); if (pyev) { pgevent_kill(pyev); Py_DECREF(pyev); } Py_XDECREF(rc); - Py_DECREF(py); return (st); } @@ -587,24 +599,22 @@ static PyObject *pgev_pywrap(const pgev *pg) int convpgev(PyObject *o, void *p) { - pgev *pg = p; + pypgev *pg = p; if (PGEV_PYCHECK(o)) - *pg = *PGEV_PG(o); + pg->ev = *PGEV_PG(o); else { - pg->proc = pgev_python; - pg->ctx = o; - Py_INCREF(o); + pg->ev.proc = pgev_python; + pg->ev.ctx = pg; + pg->obj = o; Py_INCREF(o); } return (1); } -void droppgev(pgev *p) +void droppgev(pypgev *pg) { - if (p->proc == pgev_python) { - PyObject *py = p->ctx; - Py_DECREF(py); - } + if (pg->ev.proc == pgev_python) + { assert(pg->ev.ctx == pg); Py_DECREF(pg->obj); } } static PyObject *pgmeth_common(PyObject *me, PyObject *arg, int rq) @@ -633,20 +643,20 @@ PGMETH(fail, FAIL) static PyObject *pgev_stdev(pgen_proc *proc) { pgev pg; pg.proc = proc; pg.ctx = 0; return (pgev_pywrap(&pg)); } -static PyMethodDef pgev_pymethods[] = { +static const PyMethodDef pgev_pymethods[] = { #define METHNAME(name) pgmeth_##name - METH (pg_abort, "E.pg_abort() -> PGRC -- prime generation aborted") - METH (pg_done, "E.pg_done() -> PGRC -- prime generation finished") - METH (pg_begin, "E.pg_begin() -> PGRC -- commence stepping/testing") - METH (pg_try, "E.pg_try() -> PGRC -- found new candidate") - METH (pg_pass, "E.pg_pass() -> PGRC -- passed primality test") - METH (pg_fail, "E.pg_fail() -> PGRC -- failed primality test") + METH (pg_abort, "E.pg_abort(EV) -> PGST -- prime generation aborted") + METH (pg_done, "E.pg_done(EV) -> PGST -- prime generation finished") + METH (pg_begin, "E.pg_begin(EV) -> PGST -- commence stepping/testing") + METH (pg_try, "E.pg_try(EV) -> PGST -- found new candidate") + METH (pg_pass, "E.pg_pass(EV) -> PGST -- passed primality test") + METH (pg_fail, "E.pg_fail(EV) -> PGST -- failed primality test") #undef METHNAME { 0 } }; -static PyTypeObject pgev_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgev_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenBuiltinHandler", /* @tp_name@ */ sizeof(pgev_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -670,7 +680,7 @@ static PyTypeObject pgev_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"Built-in prime-generation event handler, base class.", + "Built-in prime-generation event handler, base class.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -678,7 +688,7 @@ static PyTypeObject pgev_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - pgev_pymethods, /* @tp_methods@ */ + PYMETHODS(pgev), /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ 0, /* @tp_base@ */ @@ -712,15 +722,15 @@ end: static PyObject *psget_step(PyObject *me, void *hunoz) { return (PyInt_FromLong(PGSTEP_STEP(me))); } -static PyGetSetDef pgstep_pygetset[] = { +static const PyGetSetDef pgstep_pygetset[] = { #define GETSETNAME(op, name) ps##op##_##name GET (step, "S.step -> step size for the stepper") #undef GETSETNAME { 0 } }; -static PyTypeObject pgstep_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgstep_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenStepper", /* @tp_name@ */ sizeof(pgstep_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -744,7 +754,7 @@ static PyTypeObject pgstep_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"PrimeGenStepper(STEP): simple stepper with small-factors filter.", + "PrimeGenStepper(STEP): simple stepper with small-factors filter.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -754,7 +764,7 @@ static PyTypeObject pgstep_pytype_skel = { 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ - pgstep_pygetset, /* @tp_getset@ */ + PYGETSET(pgstep), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -794,15 +804,15 @@ static void pgjump_pydealloc(PyObject *me) static PyObject *pjget_jump(PyObject *me, void *hunoz) { RETURN_OBJ(PGJUMP_FOBJ(me)); } -static PyGetSetDef pgjump_pygetset[] = { +static const PyGetSetDef pgjump_pygetset[] = { #define GETSETNAME(op, name) pj##op##_##name GET (jump, "S.jump -> jump size for the stepper") #undef GETSETNAME { 0 } }; -static PyTypeObject pgjump_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgjump_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenJumper", /* @tp_name@ */ sizeof(pgjump_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -826,7 +836,8 @@ static PyTypeObject pgjump_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"PrimeGenJumper(JUMP): stepper for larger steps with small-factors filter.", + "PrimeGenJumper(JUMP): " + "stepper for larger steps with small-factors filter.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -836,7 +847,7 @@ static PyTypeObject pgjump_pytype_skel = { 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ - pgjump_pygetset, /* @tp_getset@ */ + PYGETSET(pgjump), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -862,8 +873,8 @@ end: return ((PyObject *)rc); } -static PyTypeObject pgtest_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgtest_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenTester", /* @tp_name@ */ sizeof(pgtest_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -887,7 +898,7 @@ static PyTypeObject pgtest_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"PrimeGenTester(): Rabin-Miller tester.", + "PrimeGenTester(): Rabin-Miller tester.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -912,10 +923,10 @@ static PyTypeObject pgtest_pytype_skel = { /*----- Prime generation functions ----------------------------------------*/ -void pgenerr(void) +void pgenerr(struct excinfo *exc) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_ValueError, "prime generation failed"); + if (exc->ty) RESTORE_EXCINFO(exc); + else PyErr_SetString(PyExc_ValueError, "prime generation failed"); } static PyObject *meth_pgen(PyObject *me, PyObject *arg, PyObject *kw) @@ -926,26 +937,26 @@ static PyObject *meth_pgen(PyObject *me, PyObject *arg, PyObject *kw) char *p = "p"; pgen_filterctx fc = { 2 }; rabin tc; - pgev step = { 0 }, test = { 0 }, evt = { 0 }; + struct excinfo exc = EXCINFO_INIT; + pypgev step = { { 0 } }, test = { { 0 } }, evt = { { 0 } }; unsigned nsteps = 0, ntests = 0; static const char *const kwlist[] = { "start", "name", "stepper", "tester", "event", "nsteps", "ntests", 0 }; - step.proc = pgen_filter; step.ctx = &fc; - test.proc = pgen_test; test.ctx = &tc; + step.exc = &exc; step.ev.proc = pgen_filter; step.ev.ctx = &fc; + test.exc = &exc; test.ev.proc = pgen_test; test.ev.ctx = &tc; + evt.exc = &exc; if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|sO&O&O&O&O&:pgen", KWLIST, convmp, &x, &p, convpgev, &step, convpgev, &test, convpgev, &evt, convuint, &nsteps, convuint, &ntests)) goto end; if (!ntests) ntests = rabin_iters(mp_bits(x)); - if ((r = pgen(p, MP_NEW, x, evt.proc, evt.ctx, - nsteps, step.proc, step.ctx, - ntests, test.proc, test.ctx)) == 0) - PGENERR; - if (PyErr_Occurred()) goto end; - rc = mp_pywrap(r); - r = 0; + if ((r = pgen(p, MP_NEW, x, evt.ev.proc, evt.ev.ctx, + nsteps, step.ev.proc, step.ev.ctx, + ntests, test.ev.proc, test.ev.ctx)) == 0) + PGENERR(&exc); + rc = mp_pywrap(r); r = 0; end: mp_drop(r); mp_drop(x); droppgev(&step); droppgev(&test); droppgev(&evt); @@ -961,19 +972,21 @@ static PyObject *meth_strongprime_setup(PyObject *me, unsigned nbits; char *name = "p"; unsigned n = 0; - pgev evt = { 0 }; + struct excinfo exc = EXCINFO_INIT; + pypgev evt = { { 0 } }; PyObject *rc = 0; static const char *const kwlist[] = { "nbits", "name", "event", "rng", "nsteps", 0 }; + evt.exc = &exc; if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|sO&O&O&", KWLIST, convuint, &nbits, &name, convpgev, &evt, convgrand, &r, convuint, &n)) goto end; if ((x = strongprime_setup(name, MP_NEW, &f, nbits, - r, n, evt.proc, evt.ctx)) == 0) - PGENERR; + r, n, evt.ev.proc, evt.ev.ctx)) == 0) + PGENERR(&exc); rc = Py_BuildValue("(NN)", mp_pywrap(x), pfilt_pywrap(&f)); x = 0; end: @@ -989,19 +1002,21 @@ static PyObject *meth_strongprime(PyObject *me, PyObject *arg, PyObject *kw) unsigned nbits; char *name = "p"; unsigned n = 0; - pgev evt = { 0 }; + struct excinfo exc = EXCINFO_INIT; + pypgev evt = { { 0 } }; PyObject *rc = 0; static const char *const kwlist[] = { "nbits", "name", "event", "rng", "nsteps", 0 }; + evt.exc = &exc; if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|sO&O&O&", KWLIST, convuint, &nbits, &name, convpgev, &evt, convgrand, &r, convuint, &n)) goto end; if ((x = strongprime(name, MP_NEW, nbits, - r, n, evt.proc, evt.ctx)) == 0) - PGENERR; + r, n, evt.ev.proc, evt.ev.ctx)) == 0) + PGENERR(&exc); rc = mp_pywrap(x); x = 0; end: @@ -1013,7 +1028,8 @@ end: static PyObject *meth_limlee(PyObject *me, PyObject *arg, PyObject *kw) { char *p = "p"; - pgev ie = { 0 }, oe = { 0 }; + struct excinfo exc = EXCINFO_INIT; + pypgev ie = { { 0 } }, oe = { { 0 } }; unsigned ql, pl; grand *r = &rand_global; unsigned on = 0; @@ -1023,17 +1039,19 @@ static PyObject *meth_limlee(PyObject *me, PyObject *arg, PyObject *kw) { "pbits", "qbits", "name", "event", "ievent", "rng", "nsteps", 0 }; mp *x = 0, **v = 0; + ie.exc = oe.exc = &exc; if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|sO&O&O&O&:limlee", KWLIST, convuint, &pl, convuint, &ql, &p, convpgev, &oe, convpgev, &ie, convgrand, &r, convuint, &on)) goto end; if ((x = limlee(p, MP_NEW, MP_NEW, ql, pl, r, on, - oe.proc, oe.ctx, ie.proc, ie.ctx, &nf, &v)) == 0) - PGENERR; + oe.ev.proc, oe.ev.ctx, ie.ev.proc, ie.ev.ctx, + &nf, &v)) == 0) + PGENERR(&exc);; vec = PyList_New(nf); for (i = 0; i < nf; i++) - PyList_SetItem(vec, i, mp_pywrap(v[i])); + PyList_SET_ITEM(vec, i, mp_pywrap(v[i])); xfree(v); rc = Py_BuildValue("(NN)", mp_pywrap(x), vec); end: @@ -1043,23 +1061,28 @@ end: /*----- Global stuff ------------------------------------------------------*/ -static PyMethodDef methods[] = { +static const struct nameval consts[] = { + CONST(PGEN_PASS), CONST(PGEN_FAIL), CONST(PGEN_BEGIN), CONST(PGEN_TRY), + CONST(PGEN_DONE), CONST(PGEN_ABORT), + { 0 } +}; + +static const PyMethodDef methods[] = { #define METHNAME(name) meth_##name - METH (_PrimeFilter_smallfactor, "smallfactor(X) -> PGRC") - METH (_RabinMiller_iters, "iters(NBITS) -> NITERS") - KWMETH(pgen, "\ -pgen(START, [name = 'p', stepper = PrimeGenStepper(2),\n\ - tester = PrimeGenTester(), event = pgen_nullev,\n\ - nsteps = 0, ntests = RabinMiller.iters(START.nbits)]) -> P") - KWMETH(strongprime_setup, "\ -strongprime_setup(NBITS, [name = 'p', event = pgen_nullev,\n\ - rng = rand, nsteps = 0]) -> (START, JUMP)") - KWMETH(strongprime, "\ -strongprime(NBITS, [name = 'p', event = pgen_nullev,\n\ - rng = rand, nsteps = 0]) -> P") - KWMETH(limlee, "\ -limlee(PBITS, QBITS, [name = 'p', event = pgen_nullev,\n\ - ievent = pgen_nullev, rng = rand, nsteps = 0]) -> (P, [Q, ...])") + KWMETH(pgen, + "pgen(START, [name = 'p'], [stepper = PrimeGenStepper(2)],\n" + " [tester = PrimeGenTester()], [event = pgen_nullev],\n" + " [nsteps = 0], [ntests = RabinMiller.iters(START.nbits)]) -> P") + KWMETH(strongprime_setup, + "strongprime_setup(NBITS, [name = 'p'], [event = pgen_nullev],\n" + " [rng = rand], [nsteps = 0]) -> (START, JUMP)") + KWMETH(strongprime, + "strongprime(NBITS, [name = 'p'], [event = pgen_nullev],\n" + " [rng = rand], [nsteps = 0]) -> P") + KWMETH(limlee, + "limlee(PBITS, QBITS, [name = 'p'], [event = pgen_nullev],\n" + " [ievent = pgen_nullev], [rng = rand], [nsteps = 0]) " + "-> (P, [Q, ...])") #undef METHNAME { 0 } }; @@ -1091,6 +1114,7 @@ void pgen_pyinsert(PyObject *mod) INSERT("pgen_stdev", pgev_stdev(pgen_ev)); INSERT("pgen_spinev", pgev_stdev(pgen_evspin)); INSERT("pgen_subev", pgev_stdev(pgen_subev)); + setconstants(mod, consts); } /*----- That's all, folks -------------------------------------------------*/