diff --git a/Tests/test_image_frombytes.py b/Tests/test_image_frombytes.py index 7fb05cda7b2..c299e454402 100644 --- a/Tests/test_image_frombytes.py +++ b/Tests/test_image_frombytes.py @@ -1,10 +1,17 @@ +import pytest + from PIL import Image from .helper import assert_image_equal, hopper -def test_sanity(): +@pytest.mark.parametrize("data_type", ("bytes", "memoryview")) +def test_sanity(data_type): im1 = hopper() - im2 = Image.frombytes(im1.mode, im1.size, im1.tobytes()) + + data = im1.tobytes() + if data_type == "memoryview": + data = memoryview(data) + im2 = Image.frombytes(im1.mode, im1.size, data) assert_image_equal(im1, im2) diff --git a/src/decode.c b/src/decode.c index 7a97a1e32ed..ea86a937c29 100644 --- a/src/decode.c +++ b/src/decode.c @@ -116,22 +116,22 @@ _dealloc(ImagingDecoderObject *decoder) { static PyObject * _decode(ImagingDecoderObject *decoder, PyObject *args) { - PyObject *input_object, *memview = NULL; - Py_buffer *memview_buf; UINT8 *buffer; Py_ssize_t bufsize; int status; ImagingSectionCookie cookie; + PyObject *input_object; if (!PyArg_ParseTuple(args, "O", &input_object)) { return NULL; } if (PyMemoryView_Check(input_object)) { - memview = PyMemoryView_FromObject(input_object); - memview_buf = PyMemoryView_GET_BUFFER(memview); + PyObject *memview = PyMemoryView_FromObject(input_object); + Py_buffer *memview_buf = PyMemoryView_GET_BUFFER(memview); buffer = memview_buf->buf; bufsize = memview_buf->len; + Py_DECREF(memview); } else if (!PyArg_ParseTuple(args, "y#", &buffer, &bufsize)) { return NULL; @@ -147,7 +147,6 @@ _decode(ImagingDecoderObject *decoder, PyObject *args) { ImagingSectionLeave(&cookie); } - Py_XDECREF(memview); return Py_BuildValue("ii", status, decoder->state.errcode); }