~mdw
/
catacomb-python
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
algorithms.c: Delete a spurious blank line.
[catacomb-python]
/
mp.c
diff --git
a/mp.c
b/mp.c
index
1513974
..
b25fdce
100644
(file)
--- a/
mp.c
+++ b/
mp.c
@@
-33,6
+33,17
@@
PyTypeObject *mp_pytype = 0;
PyTypeObject *gf_pytype = 0;
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;
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;
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;
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;
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);
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;
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 && 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) {
}
}
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);
}
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;
{
mp *x;
- if (
PyString_Check
(o)) {
+ if (
TEXT_CHECK
(o)) {
mptext_stringctx sc;
mp *x;
mptext_stringctx sc;
mp *x;
- s
c.buf = PyString_AS_STRING(o)
;
-
sc.lim = sc.buf + PyString_GET_SIZE(o)
;
+ s
ize_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); }
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);
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); }
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);
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);
}
return (o);
}
@@
-545,14
+553,14
@@
end:
return ((PyObject *)zz);
}
return ((PyObject *)zz);
}
-
long
mphash(mp *x)
+
Py_hash_t
mphash(mp *x)
{
PyObject *l = mp_topylong(x);
{
PyObject *l = mp_topylong(x);
-
long
h = PyObject_Hash(l);
+
Py_hash_t
h = PyObject_Hash(l);
Py_DECREF(l); return (h);
}
Py_DECREF(l); return (h);
}
-static
long
mp_pyhash(PyObject *me) { return (mphash(MP_X(me))); }
+static
Py_hash_t
mp_pyhash(PyObject *me) { return (mphash(MP_X(me))); }
static PyObject *mpmeth_jacobi(PyObject *me, PyObject *arg)
{
static PyObject *mpmeth_jacobi(PyObject *me, PyObject *arg)
{
@@
-709,7
+717,7
@@
end:
if (!len) len = 1; \
} \
rc = bytestring_pywrap(0, len); \
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); \
}
end: \
return (rc); \
}
@@
-723,13
+731,12
@@
STOREOP(storeb2c, 2c)
static PyObject *ty##meth_frombuf(PyObject *me, PyObject *arg) \
{ \
buf b; \
static PyObject *ty##meth_frombuf(PyObject *me, PyObject *arg) \
{ \
buf b; \
- char *p; \
- Py_ssize_t sz; \
+ struct bin in; \
PyObject *rc = 0; \
mp *x; \
\
PyObject *rc = 0; \
mp *x; \
\
- if (!PyArg_ParseTuple(arg, "
s#:frombuf", &p, &sz)) goto end;
\
- buf_init(&b,
p, sz);
\
+ if (!PyArg_ParseTuple(arg, "
O&:frombuf", convbin, &in)) goto end;
\
+ buf_init(&b,
(/*unconst*/ void *)in.p, in.sz);
\
if ((x = buf_getmp(&b)) == 0) VALERR("malformed data"); \
rc = Py_BuildValue("(NN)", ty##_pywrap(x), \
bytestring_pywrapbuf(&b)); \
if ((x = buf_getmp(&b)) == 0) VALERR("malformed data"); \
rc = Py_BuildValue("(NN)", ty##_pywrap(x), \
bytestring_pywrapbuf(&b)); \
@@
-750,10
+757,10
@@
static PyObject *mpmeth_tobuf(PyObject *me)
x = MP_X(me);
n = mp_octets(x) + 3;
rc = bytestring_pywrap(0, n);
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));
buf_putmp(&b, x);
assert(BOK(&b));
-
_PyString_Resize(&
rc, BLEN(&b));
+
BIN_SETLEN(
rc, BLEN(&b));
return (rc);
}
return (rc);
}
@@
-815,10
+822,9
@@
static PyObject *mpmeth_fibonacci(PyObject *me, PyObject *arg)
#define LOADOP(pre, name) \
static PyObject *pre##meth_##name(PyObject *me, PyObject *arg) \
{ \
#define LOADOP(pre, name) \
static PyObject *pre##meth_##name(PyObject *me, PyObject *arg) \
{ \
- char *p; \
- Py_ssize_t len; \
- if (!PyArg_ParseTuple(arg, "s#:" #name, &p, &len)) return (0); \
- return (pre##_pywrap(mp_##name(MP_NEW, p, len))); \
+ struct bin in; \
+ if (!PyArg_ParseTuple(arg, "O&:" #name, convbin, &in)) return (0); \
+ return (pre##_pywrap(mp_##name(MP_NEW, in.p, in.sz))); \
}
LOADOP(mp, loadl)
LOADOP(mp, loadb)
}
LOADOP(mp, loadl)
LOADOP(mp, loadb)
@@
-932,7
+938,7
@@
static const PyNumberMethods mp_pynumber = {
};
static const PyTypeObject mp_pytype_skel = {
};
static const PyTypeObject mp_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MP", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MP", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-1091,7
+1097,7
@@
static const PyMethodDef mpmul_pymethods[] = {
};
static const PyTypeObject mpmul_pytype_skel = {
};
static const PyTypeObject mpmul_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MPMul", /* @tp_name@ */
sizeof(mpmul_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MPMul", /* @tp_name@ */
sizeof(mpmul_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-1360,7
+1366,7
@@
static const PyMethodDef mpmont_pymethods[] = {
};
static const PyTypeObject mpmont_pytype_skel = {
};
static const PyTypeObject mpmont_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MPMont", /* @tp_name@ */
sizeof(mpmont_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MPMont", /* @tp_name@ */
sizeof(mpmont_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-1501,7
+1507,7
@@
static const PyMethodDef mpbarrett_pymethods[] = {
};
static const PyTypeObject mpbarrett_pytype_skel = {
};
static const PyTypeObject mpbarrett_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MPBarrett", /* @tp_name@ */
sizeof(mpbarrett_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MPBarrett", /* @tp_name@ */
sizeof(mpbarrett_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-1631,7
+1637,7
@@
static const const PyMethodDef mpreduce_pymethods[] = {
};
static const PyTypeObject mpreduce_pytype_skel = {
};
static const PyTypeObject mpreduce_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MPReduce", /* @tp_name@ */
sizeof(mpreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MPReduce", /* @tp_name@ */
sizeof(mpreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-1815,7
+1821,7
@@
static const PyMethodDef mpcrt_pymethods[] = {
};
static const PyTypeObject mpcrt_pytype_skel = {
};
static const PyTypeObject mpcrt_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"MPCRT", /* @tp_name@ */
sizeof(mpcrt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"MPCRT", /* @tp_name@ */
sizeof(mpcrt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-2115,7
+2121,7
@@
static const PyNumberMethods gf_pynumber = {
};
static const PyTypeObject gf_pytype_skel = {
};
static const PyTypeObject gf_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"GF", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"GF", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-2316,7
+2322,7
@@
static const PyMethodDef gfreduce_pymethods[] = {
};
static const PyTypeObject gfreduce_pytype_skel = {
};
static const PyTypeObject gfreduce_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"GFReduce", /* @tp_name@ */
sizeof(gfreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"GFReduce", /* @tp_name@ */
sizeof(gfreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
@@
-2454,7
+2460,7
@@
static const PyMethodDef gfn_pymethods[] = {
};
static const PyTypeObject gfn_pytype_skel = {
};
static const PyTypeObject gfn_pytype_skel = {
- Py
Object_HEAD_INIT(0) 0,
/* Header */
+ Py
VarObject_HEAD_INIT(0, 0)
/* Header */
"GFN", /* @tp_name@ */
sizeof(gfn_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
"GFN", /* @tp_name@ */
sizeof(gfn_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */