Kaydet (Commit) d6ca5460 authored tarafından Guido van Rossum's avatar Guido van Rossum

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.
üst 94ca1c62
...@@ -72,10 +72,10 @@ else: ...@@ -72,10 +72,10 @@ else:
def wr_long(f, x): def wr_long(f, x):
"""Internal; write a 32-bit int to a file in little-endian order.""" """Internal; write a 32-bit int to a file in little-endian order."""
f.write(chr( x & 0xff)) f.write(bytes([x & 0xff,
f.write(chr((x >> 8) & 0xff)) (x >> 8) & 0xff,
f.write(chr((x >> 16) & 0xff)) (x >> 16) & 0xff,
f.write(chr((x >> 24) & 0xff)) (x >> 24) & 0xff]))
def compile(file, cfile=None, dfile=None, doraise=False): def compile(file, cfile=None, dfile=None, doraise=False):
"""Byte-compile one Python source file to Python bytecode. """Byte-compile one Python source file to Python bytecode.
...@@ -133,7 +133,7 @@ def compile(file, cfile=None, dfile=None, doraise=False): ...@@ -133,7 +133,7 @@ def compile(file, cfile=None, dfile=None, doraise=False):
if cfile is None: if cfile is None:
cfile = file + (__debug__ and 'c' or 'o') cfile = file + (__debug__ and 'c' or 'o')
fc = open(cfile, 'wb') fc = open(cfile, 'wb')
fc.write('\0\0\0\0') fc.write(b'\0\0\0\0')
wr_long(fc, timestamp) wr_long(fc, timestamp)
marshal.dump(codeobject, fc) marshal.dump(codeobject, fc)
fc.flush() fc.flush()
......
This diff is collapsed.
This diff is collapsed.
...@@ -1635,27 +1635,57 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) ...@@ -1635,27 +1635,57 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf)
const formatdef *e = code->fmtdef; const formatdef *e = code->fmtdef;
char *res = buf + code->offset; char *res = buf + code->offset;
if (e->format == 's') { 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, PyErr_SetString(StructError,
"argument for 's' must be a string"); "argument for 's' must be a string");
return -1; 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) if (n > code->size)
n = code->size; n = code->size;
if (n > 0) if (n > 0)
memcpy(res, PyString_AS_STRING(v), n); memcpy(res, p, n);
} else if (e->format == 'p') { } 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, PyErr_SetString(StructError,
"argument for 'p' must be a string"); "argument for 'p' must be a string");
return -1; 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)) if (n > (code->size - 1))
n = code->size - 1; n = code->size - 1;
if (n > 0) if (n > 0)
memcpy(res + 1, PyString_AS_STRING(v), n); memcpy(res + 1, p, n);
if (n > 255) if (n > 255)
n = 255; n = 255;
*res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char); *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment