Commit 02e79f40 authored by Jeremy Hylton's avatar Jeremy Hylton

Simplify _BTree_setstate() based on changes in Zope3.

parent 8cd1aea1
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
****************************************************************************/ ****************************************************************************/
#define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.62 2002/06/18 22:56:01 tim_one Exp $\n" #define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.63 2002/06/19 20:20:07 jeremy Exp $\n"
/* /*
** _BTree_get ** _BTree_get
...@@ -767,87 +767,84 @@ _BTree_setstate(BTree *self, PyObject *state, int noval) ...@@ -767,87 +767,84 @@ _BTree_setstate(BTree *self, PyObject *state, int noval)
BTreeItem *d; BTreeItem *d;
int len, l, i, copied=1; int len, l, i, copied=1;
if (_BTree_clear(self) < 0) return -1; if (_BTree_clear(self) < 0)
return -1;
if (state != Py_None) /* The state of a BTree can be one of the following:
{ None -- an empty BTree
A one-tuple -- a single bucket btree
A two-tuple -- a BTree with more than one bucket
See comments for BTree_getstate() for the details.
*/
if (state == Py_None)
return 0;
if (!PyArg_ParseTuple(state,"O|O",&items, &firstbucket)) if (!PyArg_ParseTuple(state, "O|O:__setstate__", &items, &firstbucket))
return -1; return -1;
if ((len=PyTuple_Size(items)) < 0) return -1; len = PyTuple_Size(items);
len=(len+1)/2; if (len < 0)
return -1;
len = (len + 1) / 2;
assert(len > 0); assert(len > 0);
assert(self->size == 0); /* XXX we called _BTree_clear() above! */ assert(self->size == 0); /* XXX we called _BTree_clear() above! */
assert(self->data == NULL); /* ditto */ assert(self->data == NULL); /* ditto */
if (len > self->size) self->data = PyMalloc(sizeof(BTreeItem) * len);
{ if (self->data == NULL)
UNLESS (d = PyRealloc(self->data, sizeof(BTreeItem)*len)) return -1; return -1;
self->data = d;
self->size = len; self->size = len;
}
for (i = 0, d = self->data, l = 0; i < len; i++, d++) for (i = 0, d = self->data, l = 0; i < len; i++, d++) {
{ PyObject *v;
if (i) if (i) { /* skip the first key slot */
{
COPY_KEY_FROM_ARG(d->key, PyTuple_GET_ITEM(items,l), copied); COPY_KEY_FROM_ARG(d->key, PyTuple_GET_ITEM(items,l), copied);
l++; l++;
UNLESS (copied) return -1; if (!copied)
return -1;
INCREF_KEY(d->key); INCREF_KEY(d->key);
} }
d->child = SIZED(PyTuple_GET_ITEM(items,l)); v = PyTuple_GET_ITEM(items, l);
if (PyTuple_Check(d->child)) if (PyTuple_Check(v)) {
{ /* Handle the special case in __getstate__() for a BTree
if (noval) with a single bucket. */
{ if (noval) {
d->child = SIZED(PyObject_CallObject(OBJECT(&SetType), d->child = SIZED(PyObject_CallObject(OBJECT(&SetType),
NULL)); NULL));
UNLESS (d->child) return -1; UNLESS (d->child) return -1;
if (_set_setstate(BUCKET(d->child), if (_set_setstate(BUCKET(d->child), v) < 0)
PyTuple_GET_ITEM(items,l)) return -1;
< 0) return -1;
} }
else else {
{
d->child = SIZED(PyObject_CallObject(OBJECT(&BucketType), d->child = SIZED(PyObject_CallObject(OBJECT(&BucketType),
NULL)); NULL));
UNLESS (d->child) return -1; UNLESS (d->child) return -1;
if (_bucket_setstate(BUCKET(d->child), if (_bucket_setstate(BUCKET(d->child), v) < 0)
PyTuple_GET_ITEM(items,l)) return -1;
< 0) return -1;
} }
} }
else else {
{ d->child = (Sized *)v;
Py_INCREF(d->child); Py_INCREF(v);
} }
l++; l++;
} }
assert(len > 0); if (!firstbucket)
if (len)
{
if (! firstbucket)
firstbucket = OBJECT(self->data->child); firstbucket = OBJECT(self->data->child);
UNLESS (ExtensionClassSubclassInstance_Check( if (!ExtensionClassSubclassInstance_Check(
firstbucket, firstbucket, noval ? &SetType : &BucketType)) {
noval ? &SetType : &BucketType)) PyErr_SetString(PyExc_TypeError, "No firstbucket in non-empty BTree");
{
PyErr_SetString(PyExc_TypeError,
"No firstbucket in non-empty BTree");
return -1; return -1;
} }
self->firstbucket = BUCKET(firstbucket); self->firstbucket = BUCKET(firstbucket);
Py_INCREF(firstbucket); Py_INCREF(firstbucket);
assert(firstbucket->ob_refcnt > 1); assert(firstbucket->ob_refcnt > 1);
}
self->len = len; self->len = len;
}
return 0; return 0;
} }
......
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