From 98f9746740e95bd0307a4a1a1f1adf69cc585e61 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 13 Apr 2007 03:31:13 +0000 Subject: 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. --- Lib/zipfile.py | 8 +++++++- Python/bltinmodule.c | 14 ++++++++++++-- Python/marshal.c | 11 ++++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index dc51168..d0a1f65 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -348,7 +348,13 @@ class _ZipDecrypter: def __call__(self, c): """Decrypt a single character.""" - c = ord(c) + # 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) + except TypeError: + pass k = self.key2 | 2 c = c ^ (((k * (k^1)) >> 8) & 255) c = chr(c) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 4aa9c62..20746fa 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1451,14 +1451,24 @@ builtin_ord(PyObject *self, PyObject* obj) return PyInt_FromLong(ord); } #ifdef Py_USING_UNICODE - } else if (PyUnicode_Check(obj)) { + } + else if (PyUnicode_Check(obj)) { size = PyUnicode_GET_SIZE(obj); if (size == 1) { ord = (long)*PyUnicode_AS_UNICODE(obj); return PyInt_FromLong(ord); } #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, "ord() expected string of length 1, but " \ "%.200s found", obj->ob_type->tp_name); diff --git a/Python/marshal.c b/Python/marshal.c index fd1bd72..2fb47e7 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1062,9 +1062,14 @@ marshal_dump(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version)) return NULL; if (!PyFile_Check(f)) { - PyErr_SetString(PyExc_TypeError, - "marshal.dump() 2nd arg must be file"); - return NULL; + /* XXX Quick hack -- need to do this differently */ + PyObject *s = PyMarshal_WriteObjectToString(x, version); + PyObject *res = NULL; + if (s != NULL) { + res = PyObject_CallMethod(f, "write", "O", s); + Py_DECREF(s); + } + return res; } wf.fp = PyFile_AsFile(f); wf.str = NULL; -- cgit v0.12