Commit 98f97467 authored by Guido van Rossum's avatar Guido van Rossum

Support marshal.dump(x, f) where f is not a real file.

Support ord(b) where b is a 1-byte string.
In zipfile.py, work around bytes being ints instead of chars, sometimes.
parent 84d79ddc
...@@ -348,7 +348,13 @@ class _ZipDecrypter: ...@@ -348,7 +348,13 @@ class _ZipDecrypter:
def __call__(self, c): def __call__(self, c):
"""Decrypt a single character.""" """Decrypt a single character."""
# XXX When this is called with a byte instead of a char, ord()
# isn't needed. Don't die in that case. In the future we should
# just leave this out, once we're always using bytes.
try:
c = ord(c) c = ord(c)
except TypeError:
pass
k = self.key2 | 2 k = self.key2 | 2
c = c ^ (((k * (k^1)) >> 8) & 255) c = c ^ (((k * (k^1)) >> 8) & 255)
c = chr(c) c = chr(c)
......
...@@ -1451,14 +1451,24 @@ builtin_ord(PyObject *self, PyObject* obj) ...@@ -1451,14 +1451,24 @@ builtin_ord(PyObject *self, PyObject* obj)
return PyInt_FromLong(ord); return PyInt_FromLong(ord);
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
} else if (PyUnicode_Check(obj)) { }
else if (PyUnicode_Check(obj)) {
size = PyUnicode_GET_SIZE(obj); size = PyUnicode_GET_SIZE(obj);
if (size == 1) { if (size == 1) {
ord = (long)*PyUnicode_AS_UNICODE(obj); ord = (long)*PyUnicode_AS_UNICODE(obj);
return PyInt_FromLong(ord); return PyInt_FromLong(ord);
} }
#endif #endif
} else { }
else if (PyBytes_Check(obj)) {
/* XXX Hopefully this is temporary */
size = PyBytes_GET_SIZE(obj);
if (size == 1) {
ord = (long)*PyBytes_AS_STRING(obj);
return PyInt_FromLong(ord);
}
}
else {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"ord() expected string of length 1, but " \ "ord() expected string of length 1, but " \
"%.200s found", obj->ob_type->tp_name); "%.200s found", obj->ob_type->tp_name);
......
...@@ -1062,9 +1062,14 @@ marshal_dump(PyObject *self, PyObject *args) ...@@ -1062,9 +1062,14 @@ marshal_dump(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version)) if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
return NULL; return NULL;
if (!PyFile_Check(f)) { if (!PyFile_Check(f)) {
PyErr_SetString(PyExc_TypeError, /* XXX Quick hack -- need to do this differently */
"marshal.dump() 2nd arg must be file"); PyObject *s = PyMarshal_WriteObjectToString(x, version);
return NULL; PyObject *res = NULL;
if (s != NULL) {
res = PyObject_CallMethod(f, "write", "O", s);
Py_DECREF(s);
}
return res;
} }
wf.fp = PyFile_AsFile(f); wf.fp = PyFile_AsFile(f);
wf.str = NULL; wf.str = NULL;
......
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