diff -r cb8606fc84df Lib/test/test_memoryview.py --- a/Lib/test/test_memoryview.py Fri Oct 17 22:25:47 2014 -0700 +++ b/Lib/test/test_memoryview.py Sat Oct 18 15:09:10 2014 -0700 @@ -470,6 +470,30 @@ BaseMemorySliceSliceTests, BaseArrayMemoryTests): pass +class ArrayFormatAllocationTest(unittest.TestCase): + def test_memoryview(self): + # create a base memoryview + data = bytes(range(8)) + V = memoryview(data) + self.assertEquals(list(V), [0,1,2,3,4,5,6,7]) + + B = V.cast('H') + C = B[0:2] + D = memoryview(B) + del B + + self.assertEquals(C[0], 256) + self.assertEquals(D[0], 256) + self.assertEquals(C.format, 'H') + self.assertEquals(D.format, 'H') + + T = V.cast('I') + + self.assertEquals(C[0], 256) + self.assertEquals(D[0], 256) + self.assertEquals(C.format, 'H') + self.assertEquals(D.format, 'H') + def test_main(): test.support.run_unittest(__name__) diff -r cb8606fc84df Objects/memoryobject.c --- a/Objects/memoryobject.c Fri Oct 17 22:25:47 2014 -0700 +++ b/Objects/memoryobject.c Sat Oct 18 15:09:10 2014 -0700 @@ -579,6 +579,15 @@ view->len = len; } +Py_LOCAL_INLINE(void) +init_format(PyMemoryViewObject *mv, char *format) +{ + strncpy(mv->format, format ? format : "B", + _Py_MEMORYVIEW_MAX_FORMAT); + mv->format[_Py_MEMORYVIEW_MAX_FORMAT - 1] = '0円'; + mv->view.format = mv->format; +} + /* Initialize memoryview buffer properties. */ static void init_flags(PyMemoryViewObject *mv) @@ -669,8 +678,10 @@ init_shared_values(dest, src); init_shape_strides(dest, src); init_suboffsets(dest, src); + init_format(mv, src->format); init_flags(mv); + mv->mbuf = mbuf; Py_INCREF(mbuf); mbuf->exports++; @@ -878,6 +889,9 @@ /* flags */ init_flags(mv); + /* format */ + init_format(mv, src->format); + if (copy_buffer(dest, src) < 0) { Py_DECREF(mv); return NULL; @@ -892,7 +906,7 @@ The logical structure of the input and output buffers is the same (i.e. tolist(input) == tolist(output)), but the physical layout in memory can be explicitly chosen. - + As usual, if buffertype=PyBUF_WRITE, the exporter's buffer must be writable, otherwise it may be writable or read-only. @@ -1181,10 +1195,7 @@ goto out; } - strncpy(mv->format, PyBytes_AS_STRING(asciifmt), - _Py_MEMORYVIEW_MAX_FORMAT); - mv->format[_Py_MEMORYVIEW_MAX_FORMAT-1] = '0円'; - view->format = mv->format; + init_format(mv, PyBytes_AS_STRING(asciifmt)); view->itemsize = itemsize; view->ndim = 1; @@ -1193,7 +1204,7 @@ view->suboffsets = NULL; init_flags(mv); - + ret = 0; out: @@ -2240,7 +2251,7 @@ { Py_buffer *view; view = &(self->view); - + CHECK_RELEASED(self); if (view->ndim == 0) {

AltStyle によって変換されたページ (->オリジナル) /