-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backport patch to fix hash-based pyc's with imp module
For background, see python/cpython#8130 Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com>
- Loading branch information
Showing
3 changed files
with
55 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
From c16fead8678e080c076ccd57fcb7437698a6636f Mon Sep 17 00:00:00 2001 | ||
From: Benjamin Peterson <benjamin@python.org> | ||
Date: Thu, 5 Jul 2018 22:27:48 -0700 | ||
Subject: [PATCH] Always return bytes from _HackedGetData.get_data(). | ||
|
||
Ensure the imp.load_source shim always returns bytes by reopening the file in | ||
binary mode if needed. Hash-based pycs have to receive the source code in bytes. | ||
|
||
It's tempting to change imp.get_suffixes() to always return 'rb' as a mode, but | ||
that breaks some stdlib tests and likely 3rdparty code, too. | ||
|
||
Closes bpo-34056. | ||
--- | ||
Lib/imp.py | 11 ++++------- | ||
.../next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst | 3 +++ | ||
2 files changed, 7 insertions(+), 7 deletions(-) | ||
create mode 100644 Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst | ||
|
||
diff --git a/Lib/imp.py b/Lib/imp.py | ||
index 866464b245b2..fb83e91810f7 100644 | ||
--- a/Lib/imp.py | ||
+++ b/Lib/imp.py | ||
@@ -144,15 +144,12 @@ def get_data(self, path): | ||
if self.file and path == self.path: | ||
if not self.file.closed: | ||
file = self.file | ||
- else: | ||
- self.file = file = open(self.path, 'r') | ||
+ if 'b' not in file.mode: | ||
+ file.close() | ||
+ if self.file.closed: | ||
+ self.file = file = open(self.path, 'rb') | ||
|
||
with file: | ||
- # Technically should be returning bytes, but | ||
- # SourceLoader.get_code() just passed what is returned to | ||
- # compile() which can handle str. And converting to bytes would | ||
- # require figuring out the encoding to decode to and | ||
- # tokenize.detect_encoding() only accepts bytes. | ||
return file.read() | ||
else: | ||
return super().get_data(path) | ||
diff --git a/Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst b/Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst | ||
new file mode 100644 | ||
index 000000000000..edc0135efc60 | ||
--- /dev/null | ||
+++ b/Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst | ||
@@ -0,0 +1,3 @@ | ||
+Ensure the loader shim created by ``imp.load_module`` always returns bytes | ||
+from its ``get_data()`` function. This fixes using ``imp.load_module`` with | ||
+:pep:`552` hash-based pycs. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
155 | ||
156 |