mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
Bug #1563759: struct.unpack doens't support buffer protocol objects
This commit is contained in:
parent
8863544522
commit
3608f0570e
3 changed files with 25 additions and 3 deletions
|
@ -612,8 +612,14 @@ def test_pack_into_fn():
|
||||||
assertRaises(struct.error, pack_into, small_buf, 0, test_string)
|
assertRaises(struct.error, pack_into, small_buf, 0, test_string)
|
||||||
assertRaises(struct.error, pack_into, small_buf, 2, test_string)
|
assertRaises(struct.error, pack_into, small_buf, 2, test_string)
|
||||||
|
|
||||||
|
def test_unpack_with_buffer():
|
||||||
|
# SF bug 1563759: struct.unpack doens't support buffer protocol objects
|
||||||
|
data = array.array('B', '\x12\x34\x56\x78')
|
||||||
|
value, = struct.unpack('>I', data)
|
||||||
|
vereq(value, 0x12345678)
|
||||||
|
|
||||||
# Test methods to pack and unpack from buffers rather than strings.
|
# Test methods to pack and unpack from buffers rather than strings.
|
||||||
test_unpack_from()
|
test_unpack_from()
|
||||||
test_pack_into()
|
test_pack_into()
|
||||||
test_pack_into_fn()
|
test_pack_into_fn()
|
||||||
|
test_unpack_with_buffer()
|
||||||
|
|
|
@ -134,6 +134,8 @@ Core and builtins
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Bug #1563759: struct.unpack doens't support buffer protocol objects
|
||||||
|
|
||||||
- Bug #1686475: Support stat'ing open files on Windows again.
|
- Bug #1686475: Support stat'ing open files on Windows again.
|
||||||
|
|
||||||
- Bug #1647541: Array module's buffer interface can now handle empty arrays.
|
- Bug #1647541: Array module's buffer interface can now handle empty arrays.
|
||||||
|
|
|
@ -1485,17 +1485,31 @@ strings.");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
s_unpack(PyObject *self, PyObject *inputstr)
|
s_unpack(PyObject *self, PyObject *inputstr)
|
||||||
{
|
{
|
||||||
|
char *start;
|
||||||
|
int len;
|
||||||
|
PyObject * args;
|
||||||
PyStructObject *soself = (PyStructObject *)self;
|
PyStructObject *soself = (PyStructObject *)self;
|
||||||
assert(PyStruct_Check(self));
|
assert(PyStruct_Check(self));
|
||||||
assert(soself->s_codes != NULL);
|
assert(soself->s_codes != NULL);
|
||||||
if (inputstr == NULL || !PyString_Check(inputstr) ||
|
if (inputstr != NULL && PyString_Check(inputstr) &&
|
||||||
PyString_GET_SIZE(inputstr) != soself->s_size) {
|
PyString_GET_SIZE(inputstr) == soself->s_size) {
|
||||||
|
return s_unpack_internal(soself, PyString_AS_STRING(inputstr));
|
||||||
|
}
|
||||||
|
args = PyTuple_Pack(1, inputstr);
|
||||||
|
if (args == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (!PyArg_ParseTuple(args, "s#:unpack", &start, &len)) {
|
||||||
|
Py_DECREF(args);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_DECREF(args);
|
||||||
|
if (soself->s_size != len) {
|
||||||
PyErr_Format(StructError,
|
PyErr_Format(StructError,
|
||||||
"unpack requires a string argument of length %zd",
|
"unpack requires a string argument of length %zd",
|
||||||
soself->s_size);
|
soself->s_size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return s_unpack_internal(soself, PyString_AS_STRING(inputstr));
|
return s_unpack_internal(soself, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(s_unpack_from__doc__,
|
PyDoc_STRVAR(s_unpack_from__doc__,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue