From c0f59ad1455a53b6a8a9f09620ae4283e4df9f26 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 2 Feb 2017 14:24:16 +0100 Subject: Rename struct.unpack() 2nd parameter to "buffer" Issue #29300: Rename struct.unpack() second parameter from "inputstr" to "buffer", and use the Py_buffer type. Fix also unit tests on struct.unpack() which passed a Unicode string instead of a bytes string as struct.unpack() second parameter. The purpose of test_trailing_counter() is to test invalid format strings, not to test the buffer parameter. --- Lib/test/test_struct.py | 6 +++--- Modules/_struct.c | 8 ++++---- Modules/clinic/_struct.c.h | 20 ++++++++++++-------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index be00475..cf1d567 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -530,13 +530,13 @@ class StructTest(unittest.TestCase): # format lists containing only count spec should result in an error self.assertRaises(struct.error, struct.pack, '12345') - self.assertRaises(struct.error, struct.unpack, '12345', '') + self.assertRaises(struct.error, struct.unpack, '12345', b'') self.assertRaises(struct.error, struct.pack_into, '12345', store, 0) self.assertRaises(struct.error, struct.unpack_from, '12345', store, 0) # Format lists with trailing count spec should result in an error self.assertRaises(struct.error, struct.pack, 'c12345', 'x') - self.assertRaises(struct.error, struct.unpack, 'c12345', 'x') + self.assertRaises(struct.error, struct.unpack, 'c12345', b'x') self.assertRaises(struct.error, struct.pack_into, 'c12345', store, 0, 'x') self.assertRaises(struct.error, struct.unpack_from, 'c12345', store, @@ -545,7 +545,7 @@ class StructTest(unittest.TestCase): # Mixed format tests self.assertRaises(struct.error, struct.pack, '14s42', 'spam and eggs') self.assertRaises(struct.error, struct.unpack, '14s42', - 'spam and eggs') + b'spam and eggs') self.assertRaises(struct.error, struct.pack_into, '14s42', store, 0, 'spam and eggs') self.assertRaises(struct.error, struct.unpack_from, '14s42', store, 0) diff --git a/Modules/_struct.c b/Modules/_struct.c index 3626bad..78cd0f3 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -2162,7 +2162,7 @@ pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) unpack format: object - inputstr: object + buffer: Py_buffer / Return a tuple containing values unpacked according to the format string. @@ -2173,8 +2173,8 @@ See help(struct) for more on format strings. [clinic start generated code]*/ static PyObject * -unpack_impl(PyObject *module, PyObject *format, PyObject *inputstr) -/*[clinic end generated code: output=06951d66eae6d63b input=4b81d54988890f5e]*/ +unpack_impl(PyObject *module, PyObject *format, Py_buffer *buffer) +/*[clinic end generated code: output=f75ada02aaa33b3b input=654078e6660c2df0]*/ { PyStructObject *s_object; PyObject *result; @@ -2182,7 +2182,7 @@ unpack_impl(PyObject *module, PyObject *format, PyObject *inputstr) s_object = cache_struct(format); if (s_object == NULL) return NULL; - result = Struct_unpack(s_object, inputstr); + result = Struct_unpack_impl(s_object, buffer); Py_DECREF(s_object); return result; } diff --git a/Modules/clinic/_struct.c.h b/Modules/clinic/_struct.c.h index f05ea53..f9c3a5c 100644 --- a/Modules/clinic/_struct.c.h +++ b/Modules/clinic/_struct.c.h @@ -156,7 +156,7 @@ PyDoc_STRVAR(calcsize__doc__, {"calcsize", (PyCFunction)calcsize, METH_O, calcsize__doc__}, PyDoc_STRVAR(unpack__doc__, -"unpack($module, format, inputstr, /)\n" +"unpack($module, format, buffer, /)\n" "--\n" "\n" "Return a tuple containing values unpacked according to the format string.\n" @@ -169,27 +169,31 @@ PyDoc_STRVAR(unpack__doc__, {"unpack", (PyCFunction)unpack, METH_FASTCALL, unpack__doc__}, static PyObject * -unpack_impl(PyObject *module, PyObject *format, PyObject *inputstr); +unpack_impl(PyObject *module, PyObject *format, Py_buffer *buffer); static PyObject * unpack(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; PyObject *format; - PyObject *inputstr; + Py_buffer buffer = {NULL, NULL}; - if (!_PyArg_UnpackStack(args, nargs, "unpack", - 2, 2, - &format, &inputstr)) { + if (!_PyArg_ParseStack(args, nargs, "Oy*:unpack", + &format, &buffer)) { goto exit; } if (!_PyArg_NoStackKeywords("unpack", kwnames)) { goto exit; } - return_value = unpack_impl(module, format, inputstr); + return_value = unpack_impl(module, format, &buffer); exit: + /* Cleanup for buffer */ + if (buffer.obj) { + PyBuffer_Release(&buffer); + } + return return_value; } @@ -273,4 +277,4 @@ iter_unpack(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnam exit: return return_value; } -/*[clinic end generated code: output=db8152ad222fa3d0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0714090a5d0ea8ce input=a9049054013a1b77]*/ -- cgit v0.12