summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/collectionsmodule.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/Modules/collectionsmodule.c b/Modules/collectionsmodule.c
index f7fb91f..ddc6f88 100644
--- a/Modules/collectionsmodule.c
+++ b/Modules/collectionsmodule.c
@@ -326,18 +326,26 @@ deque_item(dequeobject *deque, int i)
return NULL;
}
- i += deque->leftindex;
- n = i / BLOCKLEN;
- i %= BLOCKLEN;
- if (i < (deque->len >> 1)) {
+ if (i == 0) {
+ i = deque->leftindex;
b = deque->leftblock;
- while (n--)
- b = b->rightlink;
- } else {
- n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
+ } else if (i == deque->len - 1) {
+ i = deque->rightindex;
b = deque->rightblock;
- while (n--)
- b = b->leftlink;
+ } else {
+ i += deque->leftindex;
+ n = i / BLOCKLEN;
+ i %= BLOCKLEN;
+ if (i < (deque->len >> 1)) {
+ b = deque->leftblock;
+ while (n--)
+ b = b->rightlink;
+ } else {
+ n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
+ b = deque->rightblock;
+ while (n--)
+ b = b->leftlink;
+ }
}
item = b->data[i];
Py_INCREF(item);