summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/test/test_array.py14
-rw-r--r--Misc/ACKS1
-rw-r--r--Modules/arraymodule.c41
3 files changed, 36 insertions, 20 deletions
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index d3fe7e9..fb451a9 100755
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -122,9 +122,14 @@ def testtype(type, example):
a.pop()
a.pop()
a.pop()
- a.pop()
+ x = a.pop()
+ if x != 'e':
+ raise TestFailed, "array(%s) pop-test" % `type`
if a != array.array(type, "acd"):
raise TestFailed, "array(%s) pop-test" % `type`
+ a.reverse()
+ if a != array.array(type, "dca"):
+ raise TestFailed, "array(%s) reverse-test" % `type`
else:
a = array.array(type, [1, 2, 3, 4, 5])
a[:-1] = a
@@ -155,9 +160,14 @@ def testtype(type, example):
a.pop()
a.pop()
a.pop()
- a.pop()
+ x = a.pop()
+ if x != 5:
+ raise TestFailed, "array(%s) pop-test" % `type`
if a != array.array(type, [1, 3, 4]):
raise TestFailed, "array(%s) pop-test" % `type`
+ a.reverse()
+ if a != array.array(type, [4, 3, 1]):
+ raise TestFailed, "array(%s) reverse-test" % `type`
# test that overflow exceptions are raised as expected for assignment
# to array of specific integral types
diff --git a/Misc/ACKS b/Misc/ACKS
index 972d35e..3de0f3b 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -58,6 +58,7 @@ Mike Carlton
Donn Cave
Per Cederqvist
Jeffrey Chang
+Brad Chapman
Mitch Chapman
David Chaum
Nicolas Chauvat
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 7197147..991fdc2 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -328,7 +328,6 @@ static struct arraydescr descriptors[] = {
{'d', sizeof(double), d_getitem, d_setitem},
{'\0', 0, 0, 0} /* Sentinel */
};
-/* If we ever allow items larger than double, we must change reverse()! */
/****************************************************************************
Implementations of array object methods.
@@ -650,7 +649,7 @@ array_count(arrayobject *self, PyObject *args)
}
static char count_doc [] =
-"count (x)\n\
+"count(x)\n\
\n\
Return number of occurences of x in the array.";
@@ -677,7 +676,7 @@ array_index(arrayobject *self, PyObject *args)
}
static char index_doc [] =
-"index (x)\n\
+"index(x)\n\
\n\
Return index of first occurence of x in the array.";
@@ -708,7 +707,7 @@ array_remove(arrayobject *self, PyObject *args)
}
static char remove_doc [] =
-"remove (x)\n\
+"remove(x)\n\
\n\
Remove the first occurence of x in the array.";
@@ -739,7 +738,7 @@ array_pop(arrayobject *self, PyObject *args)
}
static char pop_doc [] =
-"pop ([i])\n\
+"pop([i])\n\
\n\
Return the i-th element and delete it from the array. i defaults to -1.";
@@ -794,7 +793,7 @@ array_insert(arrayobject *self, PyObject *args)
}
static char insert_doc [] =
-"insert (i,x)\n\
+"insert(i,x)\n\
\n\
Insert a new item x into the array before position i.";
@@ -802,8 +801,12 @@ Insert a new item x into the array before position i.";
static PyObject *
array_buffer_info(arrayobject *self, PyObject *args)
{
- PyObject* retval = PyTuple_New(2);
- if (!retval) return NULL;
+ PyObject* retval = NULL;
+ if (!PyArg_ParseTuple(args, ":buffer_info"))
+ return NULL;
+ retval = PyTuple_New(2);
+ if (!retval)
+ return NULL;
PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
@@ -812,7 +815,7 @@ array_buffer_info(arrayobject *self, PyObject *args)
}
static char buffer_info_doc [] =
-"buffer_info -> (address, length)\n\
+"buffer_info() -> (address, length)\n\
\n\
Return a tuple (address, length) giving the current memory address and\n\
the length in bytes of the buffer used to hold array's contents.";
@@ -898,22 +901,24 @@ array_reverse(arrayobject *self, PyObject *args)
{
register int itemsize = self->ob_descr->itemsize;
register char *p, *q;
- char tmp[sizeof(double)]; /* Assume that's the max item size */
+ /* little buffer to hold items while swapping */
+ char tmp[256]; /* 8 is probably enough -- but why skimp */
+ assert(itemsize <= sizeof(tmp));
- if (args != NULL) {
- PyErr_SetString(PyExc_TypeError,
- "<array>.reverse requires exactly 0 arguments");
- return NULL;
- }
+ if (!PyArg_ParseTuple(args, ":reverse"))
+ return NULL;
if (self->ob_size > 1) {
for (p = self->ob_item,
q = self->ob_item + (self->ob_size - 1)*itemsize;
p < q;
p += itemsize, q -= itemsize) {
- memmove(tmp, p, itemsize);
- memmove(p, q, itemsize);
- memmove(q, tmp, itemsize);
+ /* memory areas guaranteed disjoint, so memcpy
+ * is safe (& memmove may be slower).
+ */
+ memcpy(tmp, p, itemsize);
+ memcpy(p, q, itemsize);
+ memcpy(q, tmp, itemsize);
}
}