diff options
| -rw-r--r-- | Lib/doctest.py | 2 | ||||
| -rw-r--r-- | Lib/test/test_zipimport.py | 21 | ||||
| -rw-r--r-- | Modules/zipimport.c | 31 | ||||
| -rw-r--r-- | Python/import.c | 2 | 
4 files changed, 31 insertions, 25 deletions
| diff --git a/Lib/doctest.py b/Lib/doctest.py index 3f139fc555..bc30a1a14a 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 8daac4b499..bae2172d9c 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 bf913f3d7f..fc93011eb7 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 25c768fea4..bb40b685a5 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 * | 
