]> granicus.if.org Git - python/commitdiff
Support marshal.dump(x, f) where f is not a real file.
authorGuido van Rossum <guido@python.org>
Fri, 13 Apr 2007 03:31:13 +0000 (03:31 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 13 Apr 2007 03:31:13 +0000 (03:31 +0000)
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
Python/bltinmodule.c
Python/marshal.c

index dc51168896abc1adceb2aaf19992144bed7f66fe..d0a1f6549ab88a6fd067bc83cc60ecdb426d5dd5 100644 (file)
@@ -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)
index 4aa9c6290d32a1994eefc2e6f725a3ad768eda2b..20746fa4bfca67055c139b01dbe84e076d0bec41 100644 (file)
@@ -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);
index fd1bd72d3b387485c744b3284ee724c8b142f7f0..2fb47e7f8d97f1ec7ce7a8f8b57c4a40df4c13bc 100644 (file)
@@ -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;