From ad8d30092ccebad0f940fe0ed3ff25a18c25dddf Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 3 Aug 2007 18:40:49 +0000 Subject: SF patch# 1766592 by Paul Colomiets. Fix test_zipimport. --- Lib/doctest.py | 2 +- Lib/test/test_zipimport.py | 21 +++++++++------------ Modules/zipimport.c | 31 ++++++++++++++++++++----------- Python/import.c | 2 +- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index 3f139fc..bc30a1a 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -209,7 +209,7 @@ def _load_testfile(filename, package, module_relative): filename = _module_relative_path(package, filename) if hasattr(package, '__loader__'): if hasattr(package.__loader__, 'get_data'): - return package.__loader__.get_data(filename), filename + return package.__loader__.get_data(filename).decode('utf-8'), filename return open(filename, encoding="utf-8").read(), filename def _indent(s, indent=4): diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 8daac4b..bae2172 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -153,18 +153,16 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): def testBadMagic(self): # make pyc magic word invalid, forcing loading from .py - m0 = ord(test_pyc[0]) - m0 ^= 0x04 # flip an arbitrary bit - badmagic_pyc = chr(m0) + test_pyc[1:] + badmagic_pyc = bytes(test_pyc) + badmagic_pyc[0] ^= 0x04 # flip an arbitrary bit files = {TESTMOD + ".py": (NOW, test_src), TESTMOD + pyc_ext: (NOW, badmagic_pyc)} self.doTest(".py", files, TESTMOD) def testBadMagic2(self): # make pyc magic word invalid, causing an ImportError - m0 = ord(test_pyc[0]) - m0 ^= 0x04 # flip an arbitrary bit - badmagic_pyc = chr(m0) + test_pyc[1:] + badmagic_pyc = bytes(test_pyc) + badmagic_pyc[0] ^= 0x04 # flip an arbitrary bit files = {TESTMOD + pyc_ext: (NOW, badmagic_pyc)} try: self.doTest(".py", files, TESTMOD) @@ -174,10 +172,9 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): self.fail("expected ImportError; import from bad pyc") def testBadMTime(self): - t3 = ord(test_pyc[7]) - t3 ^= 0x02 # flip the second bit -- not the first as that one - # isn't stored in the .py's mtime in the zip archive. - badtime_pyc = test_pyc[:7] + chr(t3) + test_pyc[8:] + badtime_pyc = bytes(test_pyc) + badtime_pyc[7] ^= 0x02 # flip the second bit -- not the first as that one + # isn't stored in the .py's mtime in the zip archive. files = {TESTMOD + ".py": (NOW, test_src), TESTMOD + pyc_ext: (NOW, badtime_pyc)} self.doTest(".py", files, TESTMOD) @@ -232,7 +229,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): z.compression = self.compression try: name = "testdata.dat" - data = "".join([chr(x) for x in range(256)]) * 500 + data = bytes(x for x in range(256)) z.writestr(name, data) z.close() zi = zipimport.zipimporter(TEMP_ZIP) @@ -246,7 +243,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): src = """if 1: # indent hack def get_file(): return __file__ - if __loader__.get_data("some.data") != "some data": + if __loader__.get_data("some.data") != b"some data": raise AssertionError, "bad data"\n""" pyc = make_pyc(compile(src, "", "exec"), NOW) files = {TESTMOD + pyc_ext: (NOW, pyc), diff --git a/Modules/zipimport.c b/Modules/zipimport.c index bf913f3..fc93011 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -475,8 +475,12 @@ zipimporter_get_source(PyObject *obj, PyObject *args) strcpy(path + len, ".py"); toc_entry = PyDict_GetItemString(self->files, path); - if (toc_entry != NULL) - return get_data(PyString_AsString(self->archive), toc_entry); + if (toc_entry != NULL) { + PyObject *bytes = get_data(PyString_AsString(self->archive), toc_entry); + PyObject *res = PyUnicode_FromString(PyBytes_AsString(bytes)); + Py_XDECREF(bytes); + return res; + } /* we have the module, but no source */ Py_INCREF(Py_None); @@ -857,8 +861,10 @@ get_data(char *archive, PyObject *toc_entry) } buf[data_size] = '\0'; - if (compress == 0) /* data is not compressed */ + if (compress == 0) { /* data is not compressed */ + raw_data = PyBytes_FromStringAndSize(buf, data_size); return raw_data; + } /* Decompress with zlib */ decompress = get_decompress_func(); @@ -896,8 +902,8 @@ static PyObject * unmarshal_code(char *pathname, PyObject *data, time_t mtime) { PyObject *code; - char *buf = PyString_AsString(data); - Py_ssize_t size = PyString_Size(data); + char *buf = PyBytes_AsString(data); + Py_ssize_t size = PyBytes_Size(data); if (size <= 9) { PyErr_SetString(ZipImportError, @@ -942,14 +948,16 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime) static PyObject * normalize_line_endings(PyObject *source) { - char *buf, *q, *p = PyString_AsString(source); + char *buf, *q, *p = PyBytes_AsString(source); PyObject *fixed_source; + int len = 0; - if (!p) - return NULL; + if (!p) { + return PyBytes_FromStringAndSize("\n\0", 2); + } /* one char extra for trailing \n and one for terminating \0 */ - buf = (char *)PyMem_Malloc(PyString_Size(source) + 2); + buf = (char *)PyMem_Malloc(PyBytes_Size(source) + 2); if (buf == NULL) { PyErr_SetString(PyExc_MemoryError, "zipimport: no memory to allocate " @@ -965,10 +973,11 @@ normalize_line_endings(PyObject *source) } else *q++ = *p; + len++; } *q++ = '\n'; /* add trailing \n */ *q = '\0'; - fixed_source = PyString_FromString(buf); + fixed_source = PyBytes_FromStringAndSize(buf, len + 2); PyMem_Free(buf); return fixed_source; } @@ -984,7 +993,7 @@ compile_source(char *pathname, PyObject *source) if (fixed_source == NULL) return NULL; - code = Py_CompileString(PyString_AsString(fixed_source), pathname, + code = Py_CompileString(PyBytes_AsString(fixed_source), pathname, Py_file_input); Py_DECREF(fixed_source); return code; diff --git a/Python/import.c b/Python/import.c index 25c768f..bb40b68 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2620,7 +2620,7 @@ imp_get_magic(PyObject *self, PyObject *noargs) buf[2] = (char) ((pyc_magic >> 16) & 0xff); buf[3] = (char) ((pyc_magic >> 24) & 0xff); - return PyString_FromStringAndSize(buf, 4); + return PyBytes_FromStringAndSize(buf, 4); } static PyObject * -- cgit v0.12