Skip to content

Commit bc60e96

Browse files
committed
Set shape on exported memoryviews
Previously we would update the exposed `len` but not the `shape`. This went unnoticed since many consuming APIs only check `len` and not `shape`. This fixes the bug and adds some tests to ensure both fields are properly set.
1 parent dd965dc commit bc60e96

File tree

2 files changed

+4
-0
lines changed

2 files changed

+4
-0
lines changed

msgspec/_core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15051,6 +15051,7 @@ mpack_decode_bin(
1505115051
Py_buffer *buffer = PyMemoryView_GET_BUFFER(view);
1505215052
buffer->buf = s;
1505315053
buffer->len = size;
15054+
buffer->shape = &(buffer->len);
1505415055
return view;
1505515056
}
1505615057

@@ -15910,6 +15911,7 @@ mpack_decode_ext(
1591015911
buffer = PyMemoryView_GET_BUFFER(view);
1591115912
buffer->buf = data_buf;
1591215913
buffer->len = size;
15914+
buffer->shape = &(buffer->len);
1591315915

1591415916
out = PyObject_CallFunctionObjArgs(self->ext_hook, pycode, view, NULL);
1591515917
done:

tests/test_msgpack.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ def test_decode_memoryview_zerocopy(self, input_type):
683683
res = msgspec.msgpack.decode(msg, type=memoryview)
684684
assert isinstance(res, memoryview)
685685
assert bytes(res) == b"abcde"
686+
assert len(res) == 5
686687
if input_type is memoryview:
687688
assert sys.getrefcount(ref) == 3
688689
del msg
@@ -1301,6 +1302,7 @@ def enc_hook(x):
13011302
def ext_hook(code, buf):
13021303
assert isinstance(buf, memoryview)
13031304
assert bytes(buf) == exp_buf
1305+
assert len(buf) == len(exp_buf)
13041306
assert code == 5
13051307
return pickle.loads(buf)
13061308

0 commit comments

Comments
 (0)