summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-05-22 01:29:33 (GMT)
committerGuido van Rossum <guido@python.org>2007-05-22 01:29:33 (GMT)
commitd6ca5460914926e54c2a063728a6c785ced8a702 (patch)
tree2d56c7e93b4cc7b37233d6fd33b5b035d8445945 /Modules
parent94ca1c620ebc63b0860579835f2c16fe056e1225 (diff)
downloadcpython-d6ca5460914926e54c2a063728a6c785ced8a702.zip
cpython-d6ca5460914926e54c2a063728a6c785ced8a702.tar.gz
cpython-d6ca5460914926e54c2a063728a6c785ced8a702.tar.bz2
Make test_zipfile pass.
The zipfile module now does all I/O in binary mode using bytes. (Maybe we should support wrapping a TextIOWrapper around it when text mode reading is requested?) Even the password is a bytes array now. Had to fix py_compile.py to use bytes while I was at it. The _struct needed a patch to support bytes, str8 and str for the 's' and 'p' formats.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_struct.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c
index a790e52..b9c29d5 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1635,27 +1635,57 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf)
const formatdef *e = code->fmtdef;
char *res = buf + code->offset;
if (e->format == 's') {
- if (!PyString_Check(v)) {
+ int isstring;
+ void *p;
+ if (PyUnicode_Check(v)) {
+ v = _PyUnicode_AsDefaultEncodedString(v, NULL);
+ if (v == NULL)
+ return -1;
+ }
+ isstring = PyString_Check(v);
+ if (!isstring && !PyBytes_Check(v)) {
PyErr_SetString(StructError,
"argument for 's' must be a string");
return -1;
}
- n = PyString_GET_SIZE(v);
+ if (isstring) {
+ n = PyString_GET_SIZE(v);
+ p = PyString_AS_STRING(v);
+ }
+ else {
+ n = PyBytes_GET_SIZE(v);
+ p = PyBytes_AS_STRING(v);
+ }
if (n > code->size)
n = code->size;
if (n > 0)
- memcpy(res, PyString_AS_STRING(v), n);
+ memcpy(res, p, n);
} else if (e->format == 'p') {
- if (!PyString_Check(v)) {
+ int isstring;
+ void *p;
+ if (PyUnicode_Check(v)) {
+ v = _PyUnicode_AsDefaultEncodedString(v, NULL);
+ if (v == NULL)
+ return -1;
+ }
+ isstring = PyString_Check(v);
+ if (!isstring && !PyBytes_Check(v)) {
PyErr_SetString(StructError,
"argument for 'p' must be a string");
return -1;
}
- n = PyString_GET_SIZE(v);
+ if (isstring) {
+ n = PyString_GET_SIZE(v);
+ p = PyString_AS_STRING(v);
+ }
+ else {
+ n = PyBytes_GET_SIZE(v);
+ p = PyBytes_AS_STRING(v);
+ }
if (n > (code->size - 1))
n = code->size - 1;
if (n > 0)
- memcpy(res + 1, PyString_AS_STRING(v), n);
+ memcpy(res + 1, p, n);
if (n > 255)
n = 255;
*res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);