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.
This commit is contained in:
Guido van Rossum 2007-04-13 03:31:13 +00:00
parent 84d79ddce2
commit 98f9746740
3 changed files with 27 additions and 6 deletions

View 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);

View 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;