diff -r f3ff4a3ce77c Lib/test/test_struct.py --- a/Lib/test/test_struct.py Thu Feb 02 12:09:30 2017 +0100 +++ b/Lib/test/test_struct.py Thu Feb 02 13:22:33 2017 +0100 @@ -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 -r f3ff4a3ce77c Modules/_struct.c --- a/Modules/_struct.c Thu Feb 02 12:09:30 2017 +0100 +++ b/Modules/_struct.c Thu Feb 02 13:22:33 2017 +0100 @@ -2162,7 +2162,7 @@ pack_into(PyObject *self, PyObject **arg 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 stri [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 * 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 -r f3ff4a3ce77c Modules/clinic/_struct.c.h --- a/Modules/clinic/_struct.c.h Thu Feb 02 12:09:30 2017 +0100 +++ b/Modules/clinic/_struct.c.h Thu Feb 02 13:22:33 2017 +0100 @@ -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 * exit: return return_value; } -/*[clinic end generated code: output=db8152ad222fa3d0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0714090a5d0ea8ce input=a9049054013a1b77]*/