diff options
author | Guido van Rossum <guido@python.org> | 2007-05-09 00:01:30 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-05-09 00:01:30 (GMT) |
commit | e6d3904c224b6c53abc3a807158e677f0233d143 (patch) | |
tree | dc6c7cac2173201b63c41165e7bacec6ce9fb8bb | |
parent | bc14efbd08a0f9fce88b13b670df26e70f912104 (diff) | |
download | cpython-e6d3904c224b6c53abc3a807158e677f0233d143.zip cpython-e6d3904c224b6c53abc3a807158e677f0233d143.tar.gz cpython-e6d3904c224b6c53abc3a807158e677f0233d143.tar.bz2 |
Make test_marshal pass. Not my best work. :-(
-rw-r--r-- | Lib/test/test_marshal.py | 10 | ||||
-rw-r--r-- | Python/marshal.c | 43 |
2 files changed, 43 insertions, 10 deletions
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index 7f7c5e6..2af6ae7 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -27,18 +27,18 @@ class IntTestCase(unittest.TestCase): # we're running the test on a 32-bit box, of course. def to_little_endian_string(value, nbytes): - bytes = [] + b = bytes() for i in range(nbytes): - bytes.append(chr(value & 0xff)) + b.append(value & 0xff) value >>= 8 - return ''.join(bytes) + return b maxint64 = (1 << 63) - 1 minint64 = -maxint64-1 for base in maxint64, minint64, -maxint64, -(minint64 >> 1): while base: - s = 'I' + to_little_endian_string(base, 8) + s = b'I' + to_little_endian_string(base, 8) got = marshal.loads(s) self.assertEqual(base, got) if base == -1: # a fixed-point for shifting right 1 @@ -128,7 +128,7 @@ class StringTestCase(unittest.TestCase): os.unlink(test_support.TESTFN) def test_buffer(self): - for s in ["", "Andrč Previn", "abc", " "*10000]: + for s in [b"", b"Andr\xe8 Previn", b"abc", b" "*10000]: b = buffer(s) new = marshal.loads(marshal.dumps(b)) self.assertEqual(s, new) diff --git a/Python/marshal.c b/Python/marshal.c index 9243798..72253ea 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1014,6 +1014,8 @@ PyObject * PyMarshal_WriteObjectToString(PyObject *x, int version) { WFILE wf; + PyObject *res = NULL; + wf.fp = NULL; wf.str = PyString_FromStringAndSize((char *)NULL, 50); if (wf.str == NULL) @@ -1034,7 +1036,8 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) "too much marshal data for a string"); return NULL; } - _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)); + if (_PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) + return NULL; } if (wf.error) { Py_XDECREF(wf.str); @@ -1043,7 +1046,12 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) :"object too deeply nested to marshal"); return NULL; } - return wf.str; + if (wf.str != NULL) { + /* XXX Quick hack -- need to do this differently */ + res = PyBytes_FromObject(wf.str); + Py_DECREF(wf.str); + } + return res; } /* And an interface for Python programs... */ @@ -1092,9 +1100,34 @@ marshal_load(PyObject *self, PyObject *f) RFILE rf; PyObject *result; if (!PyFile_Check(f)) { - PyErr_SetString(PyExc_TypeError, - "marshal.load() arg must be file"); - return NULL; + /* XXX Quick hack -- need to do this differently */ + PyObject *data, *result; + RFILE rf; + data = PyObject_CallMethod(f, "read", ""); + if (data == NULL) + return NULL; + rf.fp = NULL; + if (PyString_Check(data)) { + rf.ptr = PyString_AS_STRING(data); + rf.end = rf.ptr + PyString_GET_SIZE(data); + } + else if (PyBytes_Check(data)) { + rf.ptr = PyBytes_AS_STRING(data); + rf.end = rf.ptr + PyBytes_GET_SIZE(data); + } + else { + PyErr_Format(PyExc_TypeError, + "f.read() returned neither string " + "nor bytes but %.100s", + data->ob_type->tp_name); + Py_DECREF(data); + return NULL; + } + rf.strings = PyList_New(0); + result = read_object(&rf); + Py_DECREF(rf.strings); + Py_DECREF(data); + return result; } rf.fp = PyFile_AsFile(f); rf.strings = PyList_New(0); |