Commit f108be3a authored by Tres Seaver's avatar Tres Seaver

All modules compiling under Py3k.

parent 6cb58ca0
This diff is collapsed.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "Python.h" #include "Python.h"
/* include structmember.h for offsetof */ /* include structmember.h for offsetof */
#include "structmember.h" #include "structmember.h"
#include "bytesobject.h"
#ifdef PERSISTENT #ifdef PERSISTENT
#include "persistent/cPersistence.h" #include "persistent/cPersistence.h"
...@@ -27,7 +28,7 @@ ...@@ -27,7 +28,7 @@
#define PER_ACCESSED(O) 1 #define PER_ACCESSED(O) 1
#endif #endif
#include "py24compat.h" #include "_compat.h"
/* So sue me. This pair gets used all over the place, so much so that it /* So sue me. This pair gets used all over the place, so much so that it
* interferes with understanding non-persistence parts of algorithms. * interferes with understanding non-persistence parts of algorithms.
...@@ -65,7 +66,7 @@ static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;} ...@@ -65,7 +66,7 @@ static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;}
#define MAX_BTREE_SIZE(B) DEFAULT_MAX_BTREE_SIZE #define MAX_BTREE_SIZE(B) DEFAULT_MAX_BTREE_SIZE
#define MAX_BUCKET_SIZE(B) DEFAULT_MAX_BUCKET_SIZE #define MAX_BUCKET_SIZE(B) DEFAULT_MAX_BUCKET_SIZE
#define SameType_Check(O1, O2) ((O1)->ob_type==(O2)->ob_type) #define SameType_Check(O1, O2) (Py_TYPE((O1))==Py_TYPE((O2)))
#define ASSERT(C, S, R) if (! (C)) { \ #define ASSERT(C, S, R) if (! (C)) { \
PyErr_SetString(PyExc_AssertionError, (S)); return (R); } PyErr_SetString(PyExc_AssertionError, (S)); return (R); }
...@@ -81,7 +82,7 @@ static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;} ...@@ -81,7 +82,7 @@ static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;}
static int static int
longlong_check(PyObject *ob) longlong_check(PyObject *ob)
{ {
if (PyInt_Check(ob)) if (INT_CHECK(ob))
return 1; return 1;
if (PyLong_Check(ob)) { if (PyLong_Check(ob)) {
...@@ -101,10 +102,10 @@ longlong_as_object(PY_LONG_LONG val) ...@@ -101,10 +102,10 @@ longlong_as_object(PY_LONG_LONG val)
static PY_LONG_LONG maxint = 0; static PY_LONG_LONG maxint = 0;
if (maxint == 0) if (maxint == 0)
maxint = PyInt_GetMax(); maxint = INT_GETMAX();
if ((val > maxint) || (val < (-maxint-1))) if ((val > maxint) || (val < (-maxint-1)))
return PyLong_FromLongLong(val); return PyLong_FromLongLong(val);
return PyInt_FromLong((long)val); return INT_FROM_LONG((long)val);
} }
#endif #endif
...@@ -291,7 +292,7 @@ IndexError(int i) ...@@ -291,7 +292,7 @@ IndexError(int i)
{ {
PyObject *v; PyObject *v;
v = PyInt_FromLong(i); v = INT_FROM_LONG(i);
if (!v) { if (!v) {
v = Py_None; v = Py_None;
Py_INCREF(v); Py_INCREF(v);
...@@ -451,7 +452,11 @@ BTREEITEMSTEMPLATE_C ...@@ -451,7 +452,11 @@ BTREEITEMSTEMPLATE_C
int int
init_persist_type(PyTypeObject *type) init_persist_type(PyTypeObject *type)
{ {
#ifdef PY3K
((PyObject*)type)->ob_type = &PyType_Type;
#else
type->ob_type = &PyType_Type; type->ob_type = &PyType_Type;
#endif
type->tp_base = cPersistenceCAPI->pertype; type->tp_base = cPersistenceCAPI->pertype;
if (PyType_Ready(type) < 0) if (PyType_Ready(type) < 0)
...@@ -460,6 +465,21 @@ init_persist_type(PyTypeObject *type) ...@@ -460,6 +465,21 @@ init_persist_type(PyTypeObject *type)
return 1; return 1;
} }
#ifdef PY3K
static struct PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
"_" MOD_NAME_PREFIX "BTree", /* m_name */
BTree_module_documentation, /* m_doc */
-1, /* m_size */
module_methods, /* m_methods */
NULL, /* m_reload */
NULL, /* m_traverse */
NULL, /* m_clear */
NULL, /* m_free */
};
#endif
void void
INITMODULE (void) INITMODULE (void)
{ {
...@@ -471,40 +491,53 @@ INITMODULE (void) ...@@ -471,40 +491,53 @@ INITMODULE (void)
return; return;
#endif #endif
sort_str = PyString_InternFromString("sort"); sort_str = INTERN("sort");
if (!sort_str) if (!sort_str)
return; return;
reverse_str = PyString_InternFromString("reverse"); reverse_str = INTERN("reverse");
if (!reverse_str) if (!reverse_str)
return; return;
__setstate___str = PyString_InternFromString("__setstate__"); __setstate___str = INTERN("__setstate__");
if (!__setstate___str) if (!__setstate___str)
return; return;
_bucket_type_str = PyString_InternFromString("_bucket_type"); _bucket_type_str = INTERN("_bucket_type");
if (!_bucket_type_str) if (!_bucket_type_str)
return; return;
/* Grab the ConflictError class */ /* Grab the ConflictError class */
m = PyImport_ImportModule("BTrees.Interfaces"); m = PyImport_ImportModule("BTrees.Interfaces");
if (m != NULL) { if (m != NULL)
{
c = PyObject_GetAttrString(m, "BTreesConflictError"); c = PyObject_GetAttrString(m, "BTreesConflictError");
if (c != NULL) if (c != NULL)
ConflictError = c; ConflictError = c;
Py_DECREF(m); Py_DECREF(m);
} }
if (ConflictError == NULL) { if (ConflictError == NULL)
{
Py_INCREF(PyExc_ValueError); Py_INCREF(PyExc_ValueError);
ConflictError=PyExc_ValueError; ConflictError=PyExc_ValueError;
} }
/* Initialize the PyPersist_C_API and the type objects. */ /* Initialize the PyPersist_C_API and the type objects. */
cPersistenceCAPI = PyCObject_Import("persistent.cPersistence", "CAPI"); #ifdef PY3K
cPersistenceCAPI = (cPersistenceCAPIstruct *)PyCapsule_Import(
"persistent.cPersistence.CAPI", 0);
#else
cPersistenceCAPI = (cPersistenceCAPIstruct *)PyCObject_Import(
"persistent.cPersistence", "CAPI");
#endif
if (cPersistenceCAPI == NULL) if (cPersistenceCAPI == NULL)
return; return;
BTreeItemsType.ob_type = &PyType_Type; #ifdef PY3K
BTreeIter_Type.ob_type = &PyType_Type; #define _SET_TYPE(typ) ((PyObject*)(&typ))->ob_type = &PyType_Type
#else
#define _SET_TYPE(typ) (typ).ob_type = &PyType_Type
#endif
_SET_TYPE(BTreeItemsType);
_SET_TYPE(BTreeIter_Type);
BTreeIter_Type.tp_getattro = PyObject_GenericGetAttr; BTreeIter_Type.tp_getattro = PyObject_GenericGetAttr;
BucketType.tp_new = PyType_GenericNew; BucketType.tp_new = PyType_GenericNew;
SetType.tp_new = PyType_GenericNew; SetType.tp_new = PyType_GenericNew;
...@@ -520,20 +553,26 @@ INITMODULE (void) ...@@ -520,20 +553,26 @@ INITMODULE (void)
return; return;
if (PyDict_SetItem(BTreeType.tp_dict, _bucket_type_str, if (PyDict_SetItem(BTreeType.tp_dict, _bucket_type_str,
(PyObject *)&BucketType) < 0) { (PyObject *)&BucketType) < 0)
{
fprintf(stderr, "btree failed\n"); fprintf(stderr, "btree failed\n");
return; return;
} }
if (PyDict_SetItem(TreeSetType.tp_dict, _bucket_type_str, if (PyDict_SetItem(TreeSetType.tp_dict, _bucket_type_str,
(PyObject *)&SetType) < 0) { (PyObject *)&SetType) < 0)
{
fprintf(stderr, "bucket failed\n"); fprintf(stderr, "bucket failed\n");
return; return;
} }
#ifdef PY3K
m = PyModule_Create(&moduledef);
#else
/* Create the module and add the functions */ /* Create the module and add the functions */
m = Py_InitModule4("_" MOD_NAME_PREFIX "BTree", m = Py_InitModule4("_" MOD_NAME_PREFIX "BTree",
module_methods, BTree_module_documentation, module_methods, BTree_module_documentation,
(PyObject *)NULL, PYTHON_API_VERSION); (PyObject *)NULL, PYTHON_API_VERSION);
#endif
/* Add some symbolic constants to the module */ /* Add some symbolic constants to the module */
d = PyModule_GetDict(m); d = PyModule_GetDict(m);
......
This diff is collapsed.
This diff is collapsed.
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
FOR A PARTICULAR PURPOSE FOR A PARTICULAR PURPOSE
****************************************************************************/ ****************************************************************************/
#include "_compat.h"
#define SETTEMPLATE_C "$Id$\n" #define SETTEMPLATE_C "$Id$\n"
...@@ -20,9 +21,11 @@ Set_insert(Bucket *self, PyObject *args) ...@@ -20,9 +21,11 @@ Set_insert(Bucket *self, PyObject *args)
PyObject *key; PyObject *key;
int i; int i;
UNLESS (PyArg_ParseTuple(args, "O", &key)) return NULL; UNLESS (PyArg_ParseTuple(args, "O", &key))
if ( (i=_bucket_set(self, key, Py_None, 1, 1, 0)) < 0) return NULL; return NULL;
return PyInt_FromLong(i); if ( (i=_bucket_set(self, key, Py_None, 1, 1, 0)) < 0)
return NULL;
return INT_FROM_LONG(i);
} }
/* _Set_update and _TreeSet_update are identical except for the /* _Set_update and _TreeSet_update are identical except for the
...@@ -55,7 +58,7 @@ _Set_update(Bucket *self, PyObject *seq) ...@@ -55,7 +58,7 @@ _Set_update(Bucket *self, PyObject *seq)
n += ind; n += ind;
} }
err: err:
Py_DECREF(iter); Py_DECREF(iter);
if (ind < 0) if (ind < 0)
return -1; return -1;
...@@ -77,7 +80,7 @@ Set_update(Bucket *self, PyObject *args) ...@@ -77,7 +80,7 @@ Set_update(Bucket *self, PyObject *args)
return NULL; return NULL;
} }
return PyInt_FromLong(n); return INT_FROM_LONG(n);
} }
static PyObject * static PyObject *
...@@ -85,8 +88,10 @@ Set_remove(Bucket *self, PyObject *args) ...@@ -85,8 +88,10 @@ Set_remove(Bucket *self, PyObject *args)
{ {
PyObject *key; PyObject *key;
UNLESS (PyArg_ParseTuple(args, "O", &key)) return NULL; UNLESS (PyArg_ParseTuple(args, "O", &key))
if (_bucket_set(self, key, NULL, 0, 1, 0) < 0) return NULL; return NULL;
if (_bucket_set(self, key, NULL, 0, 1, 0) < 0)
return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
...@@ -109,7 +114,8 @@ _set_setstate(Bucket *self, PyObject *args) ...@@ -109,7 +114,8 @@ _set_setstate(Bucket *self, PyObject *args)
return -1; return -1;
} }
if ((l=PyTuple_Size(items)) < 0) return -1; if ((l=PyTuple_Size(items)) < 0)
return -1;
for (i=self->len; --i >= 0; ) for (i=self->len; --i >= 0; )
{ {
...@@ -125,7 +131,8 @@ _set_setstate(Bucket *self, PyObject *args) ...@@ -125,7 +131,8 @@ _set_setstate(Bucket *self, PyObject *args)
if (l > self->size) if (l > self->size)
{ {
UNLESS (keys=BTree_Realloc(self->keys, sizeof(KEY_TYPE)*l)) return -1; UNLESS (keys=BTree_Realloc(self->keys, sizeof(KEY_TYPE)*l))
return -1;
self->keys=keys; self->keys=keys;
self->size=l; self->size=l;
} }
...@@ -134,7 +141,8 @@ _set_setstate(Bucket *self, PyObject *args) ...@@ -134,7 +141,8 @@ _set_setstate(Bucket *self, PyObject *args)
{ {
k=PyTuple_GET_ITEM(items, i); k=PyTuple_GET_ITEM(items, i);
COPY_KEY_FROM_ARG(self->keys[i], k, copied); COPY_KEY_FROM_ARG(self->keys[i], k, copied);
UNLESS (copied) return -1; UNLESS (copied)
return -1;
INCREF_KEY(self->keys[i]); INCREF_KEY(self->keys[i]);
} }
...@@ -154,13 +162,15 @@ set_setstate(Bucket *self, PyObject *args) ...@@ -154,13 +162,15 @@ set_setstate(Bucket *self, PyObject *args)
{ {
int r; int r;
UNLESS (PyArg_ParseTuple(args, "O", &args)) return NULL; UNLESS (PyArg_ParseTuple(args, "O", &args))
return NULL;
PER_PREVENT_DEACTIVATION(self); PER_PREVENT_DEACTIVATION(self);
r=_set_setstate(self, args); r=_set_setstate(self, args);
PER_UNUSE(self); PER_UNUSE(self);
if (r < 0) return NULL; if (r < 0)
return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
...@@ -190,7 +200,8 @@ static struct PyMethodDef Set_methods[] = { ...@@ -190,7 +200,8 @@ static struct PyMethodDef Set_methods[] = {
"If an argument is given, find the minimum >= the argument"}, "If an argument is given, find the minimum >= the argument"},
#ifdef PERSISTENT #ifdef PERSISTENT
{"_p_resolveConflict", (PyCFunction) bucket__p_resolveConflict, METH_VARARGS, {"_p_resolveConflict",
(PyCFunction) bucket__p_resolveConflict, METH_VARARGS,
"_p_resolveConflict() -- Reinitialize from a newly created copy"}, "_p_resolveConflict() -- Reinitialize from a newly created copy"},
{"_p_deactivate", (PyCFunction) bucket__p_deactivate, METH_KEYWORDS, {"_p_deactivate", (PyCFunction) bucket__p_deactivate, METH_KEYWORDS,
...@@ -235,12 +246,14 @@ set_repr(Bucket *self) ...@@ -235,12 +246,14 @@ set_repr(Bucket *self)
PyObject *r, *t; PyObject *r, *t;
if (!format) if (!format)
format = PyString_FromString(MOD_NAME_PREFIX "Set(%s)"); format = TEXT_FROM_STRING(MOD_NAME_PREFIX "Set(%s)");
UNLESS (t = PyTuple_New(1)) return NULL; UNLESS (t = PyTuple_New(1))
UNLESS (r = bucket_keys(self, NULL, NULL)) goto err; return NULL;
UNLESS (r = bucket_keys(self, NULL, NULL))
goto err;
PyTuple_SET_ITEM(t, 0, r); PyTuple_SET_ITEM(t, 0, r);
r = t; r = t;
ASSIGN(r, PyString_Format(format, r)); ASSIGN(r, TEXT_FORMAT(format, r));
return r; return r;
err: err:
Py_DECREF(t); Py_DECREF(t);
...@@ -291,8 +304,7 @@ static PySequenceMethods set_as_sequence = { ...@@ -291,8 +304,7 @@ static PySequenceMethods set_as_sequence = {
}; };
static PyTypeObject SetType = { static PyTypeObject SetType = {
PyObject_HEAD_INIT(NULL) /* PyPersist_Type */ PyVarObject_HEAD_INIT(NULL, 0) /* PyPersist_Type */
0, /* ob_size */
MODULE_NAME MOD_NAME_PREFIX "Set", /* tp_name */ MODULE_NAME MOD_NAME_PREFIX "Set", /* tp_name */
sizeof(Bucket), /* tp_basicsize */ sizeof(Bucket), /* tp_basicsize */
0, /* tp_itemsize */ 0, /* tp_itemsize */
...@@ -311,7 +323,8 @@ static PyTypeObject SetType = { ...@@ -311,7 +323,8 @@ static PyTypeObject SetType = {
0, /* tp_getattro */ 0, /* tp_getattro */
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */ Py_TPFLAGS_BASETYPE, /* tp_flags */
0, /* tp_doc */ 0, /* tp_doc */
(traverseproc)bucket_traverse, /* tp_traverse */ (traverseproc)bucket_traverse, /* tp_traverse */
...@@ -339,7 +352,8 @@ nextSet(SetIteration *i) ...@@ -339,7 +352,8 @@ nextSet(SetIteration *i)
if (i->position >= 0) if (i->position >= 0)
{ {
UNLESS(PER_USE(BUCKET(i->set))) return -1; UNLESS(PER_USE(BUCKET(i->set)))
return -1;
if (i->position) if (i->position)
{ {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
FOR A PARTICULAR PURPOSE FOR A PARTICULAR PURPOSE
****************************************************************************/ ****************************************************************************/
#include "_compat.h"
#define TREESETTEMPLATE_C "$Id$\n" #define TREESETTEMPLATE_C "$Id$\n"
...@@ -25,7 +26,7 @@ TreeSet_insert(BTree *self, PyObject *args) ...@@ -25,7 +26,7 @@ TreeSet_insert(BTree *self, PyObject *args)
i = _BTree_set(self, key, Py_None, 1, 1); i = _BTree_set(self, key, Py_None, 1, 1);
if (i < 0) if (i < 0)
return NULL; return NULL;
return PyInt_FromLong(i); return INT_FROM_LONG(i);
} }
/* _Set_update and _TreeSet_update are identical except for the /* _Set_update and _TreeSet_update are identical except for the
...@@ -42,9 +43,11 @@ _TreeSet_update(BTree *self, PyObject *seq) ...@@ -42,9 +43,11 @@ _TreeSet_update(BTree *self, PyObject *seq)
if (iter == NULL) if (iter == NULL)
return -1; return -1;
while (1) { while (1)
{
v = PyIter_Next(iter); v = PyIter_Next(iter);
if (v == NULL) { if (v == NULL)
{
if (PyErr_Occurred()) if (PyErr_Occurred())
goto err; goto err;
else else
...@@ -58,7 +61,7 @@ _TreeSet_update(BTree *self, PyObject *seq) ...@@ -58,7 +61,7 @@ _TreeSet_update(BTree *self, PyObject *seq)
n += ind; n += ind;
} }
err: err:
Py_DECREF(iter); Py_DECREF(iter);
if (ind < 0) if (ind < 0)
return -1; return -1;
...@@ -74,13 +77,14 @@ TreeSet_update(BTree *self, PyObject *args) ...@@ -74,13 +77,14 @@ TreeSet_update(BTree *self, PyObject *args)
if (!PyArg_ParseTuple(args, "|O:update", &seq)) if (!PyArg_ParseTuple(args, "|O:update", &seq))
return NULL; return NULL;
if (seq) { if (seq)
{
n = _TreeSet_update(self, seq); n = _TreeSet_update(self, seq);
if (n < 0) if (n < 0)
return NULL; return NULL;
} }
return PyInt_FromLong(n); return INT_FROM_LONG(n);
} }
...@@ -89,8 +93,10 @@ TreeSet_remove(BTree *self, PyObject *args) ...@@ -89,8 +93,10 @@ TreeSet_remove(BTree *self, PyObject *args)
{ {
PyObject *key; PyObject *key;
UNLESS (PyArg_ParseTuple(args, "O", &key)) return NULL; UNLESS (PyArg_ParseTuple(args, "O", &key))
if (_BTree_set(self, key, NULL, 0, 1) < 0) return NULL; return NULL;
if (_BTree_set(self, key, NULL, 0, 1) < 0)
return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
...@@ -100,18 +106,21 @@ TreeSet_setstate(BTree *self, PyObject *args) ...@@ -100,18 +106,21 @@ TreeSet_setstate(BTree *self, PyObject *args)
{ {
int r; int r;
if (!PyArg_ParseTuple(args,"O",&args)) return NULL; if (!PyArg_ParseTuple(args,"O",&args))
return NULL;
PER_PREVENT_DEACTIVATION(self); PER_PREVENT_DEACTIVATION(self);
r=_BTree_setstate(self, args, 1); r=_BTree_setstate(self, args, 1);
PER_UNUSE(self); PER_UNUSE(self);
if (r < 0) return NULL; if (r < 0)
return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
static struct PyMethodDef TreeSet_methods[] = { static struct PyMethodDef TreeSet_methods[] =
{
{"__getstate__", (PyCFunction) BTree_getstate, METH_NOARGS, {"__getstate__", (PyCFunction) BTree_getstate, METH_NOARGS,
"__getstate__() -> state\n\n" "__getstate__() -> state\n\n"
"Return the picklable state of the TreeSet."}, "Return the picklable state of the TreeSet."},
...@@ -158,7 +167,8 @@ static struct PyMethodDef TreeSet_methods[] = { ...@@ -158,7 +167,8 @@ static struct PyMethodDef TreeSet_methods[] = {
"Perform sanity check on TreeSet, and raise exception if flawed."}, "Perform sanity check on TreeSet, and raise exception if flawed."},
#ifdef PERSISTENT #ifdef PERSISTENT
{"_p_resolveConflict", (PyCFunction) BTree__p_resolveConflict, METH_VARARGS, {"_p_resolveConflict",
(PyCFunction) BTree__p_resolveConflict, METH_VARARGS,
"_p_resolveConflict() -- Reinitialize from a newly created copy"}, "_p_resolveConflict() -- Reinitialize from a newly created copy"},
{"_p_deactivate", (PyCFunction) BTree__p_deactivate, METH_KEYWORDS, {"_p_deactivate", (PyCFunction) BTree__p_deactivate, METH_KEYWORDS,
...@@ -198,10 +208,10 @@ TreeSet_init(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -198,10 +208,10 @@ TreeSet_init(PyObject *self, PyObject *args, PyObject *kwds)
return 0; return 0;
} }
static PyTypeObject TreeSetType = { static PyTypeObject TreeSetType =
PyObject_HEAD_INIT(NULL) /* PyPersist_Type */ {
0, /* ob_size */ PyVarObject_HEAD_INIT(NULL, 0)
MODULE_NAME MOD_NAME_PREFIX "TreeSet",/* tp_name */ MODULE_NAME MOD_NAME_PREFIX "TreeSet", /* tp_name */
sizeof(BTree), /* tp_basicsize */ sizeof(BTree), /* tp_basicsize */
0, /* tp_itemsize */ 0, /* tp_itemsize */
(destructor)BTree_dealloc, /* tp_dealloc */ (destructor)BTree_dealloc, /* tp_dealloc */
...@@ -219,7 +229,8 @@ static PyTypeObject TreeSetType = { ...@@ -219,7 +229,8 @@ static PyTypeObject TreeSetType = {
0, /* tp_getattro */ 0, /* tp_getattro */
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */ Py_TPFLAGS_BASETYPE, /* tp_flags */
0, /* tp_doc */ 0, /* tp_doc */
(traverseproc)BTree_traverse, /* tp_traverse */ (traverseproc)BTree_traverse, /* tp_traverse */
......
/* Straddle Python 2 / 3 */
#ifndef BTREES__COMPAT_H
#define BTREES__COMPAT_H
#if PY_MAJOR_VERSION >= 3
#ifdef INTERN
#undef INTERN
#endif
#ifdef INT_FROM_LONG
#undef INT_FROM_LONG
#endif
#ifdef INT_CHECK
#undef INT_CHECK
#endif
#define PY3K
#define INTERN PyUnicode_InternFromString
#define INT_FROM_LONG(x) PyLong_FromLong(x)
#define INT_CHECK(x) PyLong_Check(x)
#define INT_AS_LONG(x) PyLong_AS_LONG(x)
#define INT_GETMAX(x) 2<<31
#define TEXT_FROM_STRING PyUnicode_FromString
#define TEXT_FORMAT PyUnicode_Format
#define COMPARE(lhs, rhs) \
PyObject_RichCompareBool((lhs), (rhs), Py_LT) > 0 ? -1 : \
(PyObject_RichCompareBool((lhs), (rhs), Py_EQ) > 0 ? 0 : 1)
#else
#define INTERN PyString_InternFromString
#define INT_FROM_LONG(x) PyInt_FromLong(x)
#define INT_CHECK(x) PyInt_Check(x)
#define INT_AS_LONG(x) PyInt_AS_LONG(x)
#define INT_GETMAX(x) PyInt_GetMax(x)
#define TEXT_FROM_STRING PyString_FromString
#define TEXT_FORMAT PyString_Format
#define COMPARE(lhs, rhs) PyObject_Compare((lhs), (rhs))
#endif
#endif /* BTREES__COMPAT_H */
...@@ -40,14 +40,14 @@ typedef unsigned char char6[6]; ...@@ -40,14 +40,14 @@ typedef unsigned char char6[6];
#define KEYMACROS_H "$Id$\n" #define KEYMACROS_H "$Id$\n"
#define KEY_TYPE char2 #define KEY_TYPE char2
#undef KEY_TYPE_IS_PYOBJECT #undef KEY_TYPE_IS_PYOBJECT
#define KEY_CHECK(K) (PyString_Check(K) && PyString_GET_SIZE(K)==2) #define KEY_CHECK(K) (PyBytes_Check(K) && PyBytes_GET_SIZE(K)==2)
#define TEST_KEY_SET_OR(V, K, T) if ( ( (V) = ((*(K) < *(T) || (*(K) == *(T) && (K)[1] < (T)[1])) ? -1 : ((*(K) == *(T) && (K)[1] == (T)[1]) ? 0 : 1)) ), 0 ) #define TEST_KEY_SET_OR(V, K, T) if ( ( (V) = ((*(K) < *(T) || (*(K) == *(T) && (K)[1] < (T)[1])) ? -1 : ((*(K) == *(T) && (K)[1] == (T)[1]) ? 0 : 1)) ), 0 )
#define DECREF_KEY(KEY) #define DECREF_KEY(KEY)
#define INCREF_KEY(k) #define INCREF_KEY(k)
#define COPY_KEY(KEY, E) (*(KEY)=*(E), (KEY)[1]=(E)[1]) #define COPY_KEY(KEY, E) (*(KEY)=*(E), (KEY)[1]=(E)[1])
#define COPY_KEY_TO_OBJECT(O, K) O=PyString_FromStringAndSize((const char*)K,2) #define COPY_KEY_TO_OBJECT(O, K) O=PyBytes_FromStringAndSize((const char*)K,2)
#define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \
if (KEY_CHECK(ARG)) memcpy(TARGET, PyString_AS_STRING(ARG), 2); else { \ if (KEY_CHECK(ARG)) memcpy(TARGET, PyBytes_AS_STRING(ARG), 2); else { \
PyErr_SetString(PyExc_TypeError, "expected two-character string key"); \ PyErr_SetString(PyExc_TypeError, "expected two-character string key"); \
(STATUS)=0; } (STATUS)=0; }
...@@ -59,10 +59,10 @@ typedef unsigned char char6[6]; ...@@ -59,10 +59,10 @@ typedef unsigned char char6[6];
#define DECREF_VALUE(k) #define DECREF_VALUE(k)
#define INCREF_VALUE(k) #define INCREF_VALUE(k)
#define COPY_VALUE(V, E) (memcpy(V, E, 6)) #define COPY_VALUE(V, E) (memcpy(V, E, 6))
#define COPY_VALUE_TO_OBJECT(O, K) O=PyString_FromStringAndSize((const char*)K,6) #define COPY_VALUE_TO_OBJECT(O, K) O=PyBytes_FromStringAndSize((const char*)K,6)
#define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \
if ((PyString_Check(ARG) && PyString_GET_SIZE(ARG)==6)) \ if ((PyBytes_Check(ARG) && PyBytes_GET_SIZE(ARG)==6)) \
memcpy(TARGET, PyString_AS_STRING(ARG), 6); else { \ memcpy(TARGET, PyBytes_AS_STRING(ARG), 6); else { \
PyErr_SetString(PyExc_TypeError, "expected six-character string key"); \ PyErr_SetString(PyExc_TypeError, "expected six-character string key"); \
(STATUS)=0; } (STATUS)=0; }
...@@ -93,11 +93,11 @@ bucket_toString(PyObject *oself) ...@@ -93,11 +93,11 @@ bucket_toString(PyObject *oself)
len = self->len; len = self->len;
items = PyString_FromStringAndSize(NULL, len*8); items = PyBytes_FromStringAndSize(NULL, len*8);
if (items == NULL) if (items == NULL)
goto err; goto err;
memcpy(PyString_AS_STRING(items), self->keys, len*2); memcpy(PyBytes_AS_STRING(items), self->keys, len*2);
memcpy(PyString_AS_STRING(items)+len*2, self->values, len*6); memcpy(PyBytes_AS_STRING(items)+len*2, self->values, len*6);
PER_UNUSE(self); PER_UNUSE(self);
return items; return items;
...@@ -116,7 +116,7 @@ bucket_fromString(PyObject *oself, PyObject *state) ...@@ -116,7 +116,7 @@ bucket_fromString(PyObject *oself, PyObject *state)
KEY_TYPE *keys; KEY_TYPE *keys;
VALUE_TYPE *values; VALUE_TYPE *values;
len = PyString_Size(state); len = PyBytes_Size(state);
if (len < 0) if (len < 0)
return NULL; return NULL;
...@@ -144,8 +144,8 @@ bucket_fromString(PyObject *oself, PyObject *state) ...@@ -144,8 +144,8 @@ bucket_fromString(PyObject *oself, PyObject *state)
self->size = len; self->size = len;
} }
memcpy(self->keys, PyString_AS_STRING(state), len*2); memcpy(self->keys, PyBytes_AS_STRING(state), len*2);
memcpy(self->values, PyString_AS_STRING(state)+len*2, len*6); memcpy(self->values, PyBytes_AS_STRING(state)+len*2, len*6);
self->len = len; self->len = len;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#define COPY_VALUE_TO_OBJECT(O, K) O=PyFloat_FromDouble(K) #define COPY_VALUE_TO_OBJECT(O, K) O=PyFloat_FromDouble(K)
#define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \
if (PyFloat_Check(ARG)) TARGET = (float)PyFloat_AsDouble(ARG); \ if (PyFloat_Check(ARG)) TARGET = (float)PyFloat_AsDouble(ARG); \
else if (PyInt_Check(ARG)) TARGET = (float)PyInt_AsLong(ARG); \ else if (INT_CHECK(ARG)) TARGET = (float)INT_AS_LONG(ARG); \
else { \ else { \
PyErr_SetString(PyExc_TypeError, "expected float or int value"); \ PyErr_SetString(PyExc_TypeError, "expected float or int value"); \
(STATUS)=0; (TARGET)=0; } (STATUS)=0; (TARGET)=0; }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#define KEY_CHECK longlong_check #define KEY_CHECK longlong_check
#define COPY_KEY_TO_OBJECT(O, K) O=longlong_as_object(K) #define COPY_KEY_TO_OBJECT(O, K) O=longlong_as_object(K)
#define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \
if (PyInt_Check(ARG)) TARGET=PyInt_AS_LONG(ARG); else \ if (INT_CHECK(ARG)) TARGET=INT_AS_LONG(ARG); else \
if (longlong_check(ARG)) TARGET=PyLong_AsLongLong(ARG); else \ if (longlong_check(ARG)) TARGET=PyLong_AsLongLong(ARG); else \
if (PyLong_Check(ARG)) { \ if (PyLong_Check(ARG)) { \
PyErr_SetString(PyExc_ValueError, "long integer out of range"); \ PyErr_SetString(PyExc_ValueError, "long integer out of range"); \
...@@ -19,11 +19,11 @@ ...@@ -19,11 +19,11 @@
#else #else
/* C int as key */ /* C int as key */
#define KEY_TYPE int #define KEY_TYPE int
#define KEY_CHECK PyInt_Check #define KEY_CHECK INT_CHECK
#define COPY_KEY_TO_OBJECT(O, K) O=PyInt_FromLong(K) #define COPY_KEY_TO_OBJECT(O, K) O=INT_FROM_LONG(K)
#define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \
if (PyInt_Check(ARG)) { \ if (INT_CHECK(ARG)) { \
long vcopy = PyInt_AS_LONG(ARG); \ long vcopy = INT_AS_LONG(ARG); \
if ((int)vcopy != vcopy) { \ if ((int)vcopy != vcopy) { \
PyErr_SetString(PyExc_TypeError, "integer out of range"); \ PyErr_SetString(PyExc_TypeError, "integer out of range"); \
(STATUS)=0; (TARGET)=0; \ (STATUS)=0; (TARGET)=0; \
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#define VALUE_PARSE "L" #define VALUE_PARSE "L"
#define COPY_VALUE_TO_OBJECT(O, K) O=longlong_as_object(K) #define COPY_VALUE_TO_OBJECT(O, K) O=longlong_as_object(K)
#define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \
if (PyInt_Check(ARG)) TARGET=PyInt_AS_LONG(ARG); else \ if (INT_CHECK(ARG)) TARGET=INT_AS_LONG(ARG); else \
if (longlong_check(ARG)) TARGET=PyLong_AsLongLong(ARG); else \ if (longlong_check(ARG)) TARGET=PyLong_AsLongLong(ARG); else \
if (PyLong_Check(ARG)) { \ if (PyLong_Check(ARG)) { \
PyErr_SetString(PyExc_ValueError, "long integer out of range"); \ PyErr_SetString(PyExc_ValueError, "long integer out of range"); \
...@@ -18,11 +18,11 @@ ...@@ -18,11 +18,11 @@
#else #else
#define VALUE_TYPE int #define VALUE_TYPE int
#define VALUE_PARSE "i" #define VALUE_PARSE "i"
#define COPY_VALUE_TO_OBJECT(O, K) O=PyInt_FromLong(K) #define COPY_VALUE_TO_OBJECT(O, K) O=INT_FROM_LONG(K)
#define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \ #define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \
if (PyInt_Check(ARG)) { \ if (INT_CHECK(ARG)) { \
long vcopy = PyInt_AS_LONG(ARG); \ long vcopy = INT_AS_LONG(ARG); \
if ((int)vcopy != vcopy) { \ if ((int)vcopy != vcopy) { \
PyErr_SetString(PyExc_TypeError, "integer out of range"); \ PyErr_SetString(PyExc_TypeError, "integer out of range"); \
(STATUS)=0; (TARGET)=0; \ (STATUS)=0; (TARGET)=0; \
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#define KEY_TYPE_IS_PYOBJECT #define KEY_TYPE_IS_PYOBJECT
#include "Python.h" #include "Python.h"
#include "_compat.h"
static PyObject *object_; static PyObject *object_;
...@@ -15,12 +16,9 @@ check_argument_cmp(PyObject *arg) ...@@ -15,12 +16,9 @@ check_argument_cmp(PyObject *arg)
/* arg->ob_type->tp_compare, */ /* arg->ob_type->tp_compare, */
/* ((PyTypeObject *)object_)->ob_type->tp_compare); */ /* ((PyTypeObject *)object_)->ob_type->tp_compare); */
if (arg->ob_type->tp_richcompare == NULL if (Py_TYPE(arg)->tp_richcompare == NULL
&& #ifndef PY3K
#if PY_MAJOR_VERSION==2 && PY_MINOR_VERSION < 6 && Py_TYPE(arg)->tp_compare ==
arg->ob_type->tp_compare == NULL
#else
arg->ob_type->tp_compare ==
((PyTypeObject *)object_)->ob_type->tp_compare ((PyTypeObject *)object_)->ob_type->tp_compare
#endif #endif
) )
...@@ -31,7 +29,8 @@ check_argument_cmp(PyObject *arg) ...@@ -31,7 +29,8 @@ check_argument_cmp(PyObject *arg)
return 1; return 1;
} }
#define TEST_KEY_SET_OR(V, KEY, TARGET) if ( ( (V) = PyObject_Compare((KEY),(TARGET)) ), PyErr_Occurred() ) #define TEST_KEY_SET_OR(V, KEY, TARGET) \
if ( ( (V) = COMPARE((KEY),(TARGET)) ), PyErr_Occurred() )
#define INCREF_KEY(k) Py_INCREF(k) #define INCREF_KEY(k) Py_INCREF(k)
#define DECREF_KEY(KEY) Py_DECREF(KEY) #define DECREF_KEY(KEY) Py_DECREF(KEY)
#define COPY_KEY(KEY, E) KEY=(E) #define COPY_KEY(KEY, E) KEY=(E)
......
#define VALUEMACROS_H "$Id$\n" #define VALUEMACROS_H "$Id$\n"
#define VALUE_TYPE PyObject * #define VALUE_TYPE PyObject *
#define VALUE_TYPE_IS_PYOBJECT #define VALUE_TYPE_IS_PYOBJECT
#define TEST_VALUE(VALUE, TARGET) PyObject_Compare((VALUE),(TARGET)) #define TEST_VALUE(VALUE, TARGET) COMPARE((VALUE),(TARGET))
#define DECLARE_VALUE(NAME) VALUE_TYPE NAME #define DECLARE_VALUE(NAME) VALUE_TYPE NAME
#define INCREF_VALUE(k) Py_INCREF(k) #define INCREF_VALUE(k) Py_INCREF(k)
#define DECREF_VALUE(k) Py_DECREF(k) #define DECREF_VALUE(k) Py_DECREF(k)
......
/* Backport type definitions from Python 2.5's object.h */
#ifndef BTREE_PY24COMPATH_H
#define BTREE_PY24COMPAT_H
#if PY_VERSION_HEX < 0x02050000
typedef Py_ssize_t (*lenfunc)(PyObject *);
typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t);
typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *);
typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
#endif /* PY_VERSION_HEX */
#endif /* BTREE_PY24COMPAT_H */
...@@ -100,16 +100,22 @@ is_jython = 'java' in sys.platform ...@@ -100,16 +100,22 @@ is_jython = 'java' in sys.platform
# Jython cannot build the C optimizations, while on PyPy they are # Jython cannot build the C optimizations, while on PyPy they are
# anti-optimizations (the C extension compatibility layer is known-slow, # anti-optimizations (the C extension compatibility layer is known-slow,
# and defeats JIT opportunities). # and defeats JIT opportunities).
if pure_python or is_pypy or is_jython or sys.version_info[0] > 2: if pure_python or is_pypy or is_jython:
ext_modules = [] ext_modules = []
else: else:
ext_modules = [BTreeExtension(family) for family in FAMILIES] ext_modules = [BTreeExtension(family) for family in FAMILIES]
REQUIRES = [ if sys.version_info[0] > 3:
REQUIRES = [
'persistent>=4.0.4',
'zope.interface',
]
else:
REQUIRES = [
'persistent', 'persistent',
'zope.interface', 'zope.interface',
] ]
TESTS_REQUIRE = REQUIRES + ['transaction'] TESTS_REQUIRE = REQUIRES + ['transaction']
setup(name='BTrees', setup(name='BTrees',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment