|
78 | 78 | }
|
79 | 79 |
|
80 | 80 | static PyObject* buffer_tester_itemsize(BufferTesterObject* self) {
|
81 |
| - return PyLong_FromLong(self->buffer.itemsize); |
| 81 | + return PyLong_FromSsize_t(self->buffer.itemsize); |
82 | 82 | }
|
83 | 83 |
|
84 | 84 | static PyObject* buffer_tester_format(BufferTesterObject* self) {
|
85 | 85 | return PyBytes_FromString(self->buffer.format);
|
86 | 86 | }
|
| 87 | + |
| 88 | + static PyObject* buffer_tester_shape(BufferTesterObject* self) { |
| 89 | + PyObject* tuple = PyTuple_New(self->buffer.ndim); |
| 90 | + if (!tuple) |
| 91 | + return NULL; |
| 92 | + for (int i = 0; i < self->buffer.ndim; i++) { |
| 93 | + PyObject* value = PyLong_FromSsize_t(self->buffer.shape[i]); |
| 94 | + if (!value) |
| 95 | + return NULL; |
| 96 | + PyTuple_SET_ITEM(tuple, i, value); |
| 97 | + } |
| 98 | + return tuple; |
| 99 | + } |
87 | 100 | ''',
|
88 | 101 | tp_new='buffer_tester_new',
|
89 | 102 | tp_methods='''
|
|
94 | 107 | {"obj", (getter)buffer_tester_obj, NULL, NULL, NULL},
|
95 | 108 | {"bytes", (getter)buffer_tester_bytes, NULL, NULL, NULL},
|
96 | 109 | {"itemsize", (getter)buffer_tester_itemsize, NULL, NULL, NULL},
|
97 |
| - {"format", (getter)buffer_tester_format, NULL, NULL, NULL} |
| 110 | + {"format", (getter)buffer_tester_format, NULL, NULL, NULL}, |
| 111 | + {"shape", (getter)buffer_tester_shape, NULL, NULL, NULL} |
98 | 112 | ''',
|
99 | 113 | )
|
100 | 114 |
|
101 | 115 |
|
102 | 116 | class TestCDataBuffer(CPyExtTestCase):
|
103 | 117 | def test_buffer(self):
|
104 |
| - numbers = [1, 2, 3, 4] |
105 |
| - array = (ctypes.c_int * 4)(*numbers) |
| 118 | + int_format = struct.Struct(">i") |
| 119 | + inner_type = ctypes.c_int.__ctype_be__ * 2 |
| 120 | + outer_type = inner_type * 2 |
| 121 | + array = outer_type(inner_type(1, 2), inner_type(3, 4)) |
106 | 122 | with BufferTester(array) as buffer:
|
107 | 123 | assert buffer.obj is array
|
108 |
| - assert buffer.bytes == b''.join(struct.pack("i", n) for n in numbers) |
109 |
| - assert buffer.itemsize == 4 |
110 |
| - assert buffer.format == b'<i' |
| 124 | + assert buffer.bytes == b''.join(int_format.pack(n) for n in [1, 2, 3, 4]) |
| 125 | + assert buffer.itemsize == int_format.size |
| 126 | + assert buffer.format.startswith(b'>') |
| 127 | + assert struct.Struct(buffer.format).size == int_format.size |
| 128 | + assert buffer.shape == (2, 2) |
0 commit comments