churchyard / rpms / python38

Forked from rpms/python38 5 years ago
Clone
Matej Stuchlik 11fb599
Matej Stuchlik 11fb599
# HG changeset patch
Matej Stuchlik 11fb599
# User Brett Cannon <brett@python.org>
Matej Stuchlik 11fb599
# Date 1393602285 18000
Matej Stuchlik 11fb599
# Node ID 432cb56db05d73f55d211501bf0dfc767768923b
Matej Stuchlik 11fb599
# Parent  ade5e4922a54cb84c99ec924ab7c700a014893da
Matej Stuchlik 11fb599
Issue #20778: Fix modulefinder to work with bytecode-only modules.
Matej Stuchlik 11fb599
Matej Stuchlik 11fb599
Bug filed and initial attempt at a patch by Bohuslav Kabrda.
Matej Stuchlik 11fb599
Matej Stuchlik 11fb599
diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
Matej Stuchlik 11fb599
--- a/Lib/modulefinder.py
Matej Stuchlik 11fb599
+++ b/Lib/modulefinder.py
Matej Stuchlik 11fb599
@@ -290,7 +290,7 @@ class ModuleFinder:
Matej Stuchlik 11fb599
             if fp.read(4) != imp.get_magic():
Matej Stuchlik 11fb599
                 self.msgout(2, "raise ImportError: Bad magic number", pathname)
Matej Stuchlik 11fb599
                 raise ImportError("Bad magic number in %s" % pathname)
Matej Stuchlik 11fb599
-            fp.read(4)
Matej Stuchlik 11fb599
+            fp.read(8)  # Skip mtime and size.
Matej Stuchlik 11fb599
             co = marshal.load(fp)
Matej Stuchlik 11fb599
         else:
Matej Stuchlik 11fb599
             co = None
Matej Stuchlik 11fb599
diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
Matej Stuchlik 11fb599
--- a/Lib/test/test_modulefinder.py
Matej Stuchlik 11fb599
+++ b/Lib/test/test_modulefinder.py
Matej Stuchlik 11fb599
@@ -1,5 +1,7 @@
Matej Stuchlik 11fb599
 import os
Matej Stuchlik 11fb599
 import errno
Matej Stuchlik 11fb599
+import importlib.machinery
Matej Stuchlik 11fb599
+import py_compile
Matej Stuchlik 11fb599
 import shutil
Matej Stuchlik 11fb599
 import unittest
Matej Stuchlik 11fb599
 import tempfile
Matej Stuchlik 11fb599
@@ -208,6 +210,14 @@ a/module.py
Matej Stuchlik 11fb599
                                 from . import *
Matej Stuchlik 11fb599
 """]
Matej Stuchlik 11fb599
 
Matej Stuchlik 11fb599
+bytecode_test = [
Matej Stuchlik 11fb599
+    "a",
Matej Stuchlik 11fb599
+    ["a"],
Matej Stuchlik 11fb599
+    [],
Matej Stuchlik 11fb599
+    [],
Matej Stuchlik 11fb599
+    ""
Matej Stuchlik 11fb599
+]
Matej Stuchlik 11fb599
+
Matej Stuchlik 11fb599
 
Matej Stuchlik 11fb599
 def open_file(path):
Matej Stuchlik 11fb599
     dirname = os.path.dirname(path)
Matej Stuchlik 11fb599
@@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase
Matej Stuchlik 11fb599
     def test_relative_imports_4(self):
Matej Stuchlik 11fb599
         self._do_test(relative_import_test_4)
Matej Stuchlik 11fb599
 
Matej Stuchlik 11fb599
+    def test_bytecode(self):
Matej Stuchlik 11fb599
+        base_path = os.path.join(TEST_DIR, 'a')
Matej Stuchlik 11fb599
+        source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
Matej Stuchlik 11fb599
+        bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
Matej Stuchlik 11fb599
+        with open_file(source_path) as file:
Matej Stuchlik 11fb599
+            file.write('testing_modulefinder = True\n')
Matej Stuchlik 11fb599
+        py_compile.compile(source_path, cfile=bytecode_path)
Matej Stuchlik 11fb599
+        os.remove(source_path)
Matej Stuchlik 11fb599
+        self._do_test(bytecode_test)
Matej Stuchlik 11fb599
+
Matej Stuchlik 11fb599
 
Matej Stuchlik 11fb599
 def test_main():
Matej Stuchlik 11fb599
     support.run_unittest(ModuleFinderTest)