From d6030acd7f974fc8595b514032e1801e68fec300 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 2 Apr 2007 22:39:08 +0000 Subject: Array module's buffer interface can now handle empty arrays. --- Lib/test/test_re.py | 7 +++++++ Misc/NEWS | 2 ++ Modules/arraymodule.c | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index a885180..f15ce09 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -604,6 +604,13 @@ class ReTests(unittest.TestCase): self.assertEqual(iter.next().span(), (4, 4)) self.assertRaises(StopIteration, iter.next) + def test_empty_array(self): + # SF buf 1647541 + import array + for typecode in 'cbBuhHiIlLfd': + a = array.array(typecode) + self.assertEqual(re.compile("bla").match(a), None) + self.assertEqual(re.compile("").match(a).groups(), ()) def run_re_tests(): from test.re_tests import benchmarks, tests, SUCCEED, FAIL, SYNTAX_ERROR diff --git a/Misc/NEWS b/Misc/NEWS index 34d4d09..641e0b0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -134,6 +134,8 @@ Core and builtins Extension Modules ----------------- +- Bug #1647541: Array module's buffer interface can now handle empty arrays. + - Bug #1693079: The array module can now successfully pickle empty arrays. - Bug #1688393: Prevent crash in socket.recvfrom if length is negative. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 0aeb64e..3ba5cf8 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1745,6 +1745,8 @@ static PyMappingMethods array_as_mapping = { (objobjargproc)array_ass_subscr }; +static const void *emptybuf = ""; + static Py_ssize_t array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr) { @@ -1754,6 +1756,8 @@ array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr) return -1; } *ptr = (void *)self->ob_item; + if (*ptr == NULL) + *ptr = emptybuf; return self->ob_size*self->ob_descr->itemsize; } @@ -1766,6 +1770,8 @@ array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr) return -1; } *ptr = (void *)self->ob_item; + if (*ptr == NULL) + *ptr = emptybuf; return self->ob_size*self->ob_descr->itemsize; } -- cgit v0.12