X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/be17c8c27ee7ae2e14fe34bb517484a11b1cf300..1d460442e7cc36ea3ddebdd8746888afd7999307:/mp.c diff --git a/mp.c b/mp.c index 0da3a5e..fe5e7dc 100644 --- a/mp.c +++ b/mp.c @@ -33,6 +33,17 @@ PyTypeObject *mp_pytype = 0; PyTypeObject *gf_pytype = 0; +#ifndef PyLong_SHIFT +# define PyLong_SHIFT SHIFT +#endif + +#ifndef PyLong_MASK +# define PyLong_MASK MASK +#endif + +STATIC_ASSERT(MPW_BITS >= PyLong_SHIFT, + "Catacomb's limbs are now narrower than than Python's!"); + mp *mp_frompylong(PyObject *obj) { unsigned long bits; @@ -47,14 +58,13 @@ mp *mp_frompylong(PyObject *obj) sz = Py_SIZE(l); if (sz < 0) sz = -sz; - assert(MPW_BITS >= SHIFT); - bits = (unsigned long)sz * SHIFT; + bits = (unsigned long)sz * PyLong_SHIFT; w = (bits + MPW_BITS - 1)/MPW_BITS; x = mp_new(w, Py_SIZE(l) < 0 ? MP_NEG : 0); p = x->v; for (i = 0; i < sz; i++) { r |= (mpd)l->ob_digit[i] << b; - b += SHIFT; + b += PyLong_SHIFT; while (b >= MPW_BITS) { *p++ = MPW(r); r >>= MPW_BITS; @@ -73,26 +83,25 @@ mp *mp_frompylong(PyObject *obj) PyObject *mp_topylong(mp *x) { unsigned long bits = mp_bits(x); - int sz = (bits + SHIFT - 1)/SHIFT; + int sz = (bits + PyLong_SHIFT - 1)/PyLong_SHIFT; PyLongObject *l = _PyLong_New(sz); mpd r = 0; int b = 0; mpw *p = x->v; int i = 0; - assert(MPW_BITS >= SHIFT); while (i < sz && p < x->vl) { r |= (mpd)*p++ << b; b += MPW_BITS; - while (i < sz && b >= SHIFT) { - l->ob_digit[i++] = r & MASK; - r >>= SHIFT; - b -= SHIFT; + while (i < sz && b >= PyLong_SHIFT) { + l->ob_digit[i++] = r & PyLong_MASK; + r >>= PyLong_SHIFT; + b -= PyLong_SHIFT; } } while (i < sz && r) { - l->ob_digit[i++] = r & MASK; - r >>= SHIFT; + l->ob_digit[i++] = r & PyLong_MASK; + r >>= PyLong_SHIFT; } Py_SIZE(l) = (x->f & MP_NEG) ? -sz : sz; return ((PyObject *)l); @@ -102,11 +111,11 @@ mp *mp_frompyobject(PyObject *o, int radix) { mp *x; - if (PyString_Check(o)) { + if (TEXT_CHECK(o)) { mptext_stringctx sc; mp *x; - sc.buf = PyString_AS_STRING(o); - sc.lim = sc.buf + PyString_GET_SIZE(o); + size_t sz; + TEXT_PTRLEN(o, sc.buf, sz); sc.lim = sc.buf + sz; x = mp_read(MP_NEW, radix, &mptext_stringops, &sc); if (!x) return (0); if (sc.buf < sc.lim) { MP_DROP(x); return (0); } @@ -128,8 +137,7 @@ PyObject *mp_topystring(mp *x, int radix, const char *xpre, size_t postlen = post ? strlen(post) : 0; char *p; MP_COPY(x); - o = PyString_FromStringAndSize(0, len + 1 + xprelen + prelen + postlen); - p = PyString_AS_STRING(o); + TEXT_PREPAREWRITE(o, p, len + 1 + xprelen + prelen + postlen); sc.buf = p; if (xpre) { memcpy(sc.buf, xpre, xprelen); sc.buf += xprelen; } if (MP_NEGP(x)) { *sc.buf++ = '-'; x = mp_neg(x, x); } @@ -138,7 +146,7 @@ PyObject *mp_topystring(mp *x, int radix, const char *xpre, mp_write(x, radix, &mptext_stringops, &sc); if (post) { memcpy(sc.buf, post, postlen); sc.buf += postlen; } MP_DROP(x); - _PyString_Resize(&o, sc.buf - p); + TEXT_DONEWRITE(o, sc.buf - p); return (o); } @@ -698,7 +706,7 @@ end: PyObject *arg, PyObject *kw) \ { \ long len = -1; \ - static const char *const kwlist[] = { "len", 0 }; \ + static const char *const kwlist[] = { "len", 0 }; \ PyObject *rc = 0; \ \ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|l:" #name, \ @@ -709,7 +717,7 @@ end: if (!len) len = 1; \ } \ rc = bytestring_pywrap(0, len); \ - mp_##name(MP_X(me), PyString_AS_STRING(rc), len); \ + mp_##name(MP_X(me), BIN_PTR(rc), len); \ end: \ return (rc); \ } @@ -749,10 +757,10 @@ static PyObject *mpmeth_tobuf(PyObject *me) x = MP_X(me); n = mp_octets(x) + 3; rc = bytestring_pywrap(0, n); - buf_init(&b, PyString_AS_STRING(rc), n); + buf_init(&b, BIN_PTR(rc), n); buf_putmp(&b, x); assert(BOK(&b)); - _PyString_Resize(&rc, BLEN(&b)); + BIN_SETLEN(rc, BLEN(&b)); return (rc); }