~mdw
/
catacomb-python
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
buffer.c: Add a lock count which pins a write-buffer's backing store.
[catacomb-python]
/
mp.c
diff --git
a/mp.c
b/mp.c
index
0da3a5e
..
fe5e7dc
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);
}
@@
-698,7
+706,7
@@
end:
PyObject *arg, PyObject *kw) \
{ \
long len = -1; \
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, \
PyObject *rc = 0; \
\
if (!PyArg_ParseTupleAndKeywords(arg, kw, "|l:" #name, \
@@
-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); \
}
@@
-749,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);
}