[Python-checkins] r52925 - sandbox/trunk/import_in_py/importer.py sandbox/trunk/import_in_py/mock_importer.py sandbox/trunk/import_in_py/test_importer.py

brett.cannon python-checkins at python.org
Wed Dec 6 01:03:54 CET 2006


Author: brett.cannon
Date: Wed Dec  6 01:03:53 2006
New Revision: 52925

Modified:
   sandbox/trunk/import_in_py/importer.py
   sandbox/trunk/import_in_py/mock_importer.py
   sandbox/trunk/import_in_py/test_importer.py
Log:
Handle the case where the .pyc file has invalid bytecode (raises ImportError).


Modified: sandbox/trunk/import_in_py/importer.py
==============================================================================
--- sandbox/trunk/import_in_py/importer.py	(original)
+++ sandbox/trunk/import_in_py/importer.py	Wed Dec  6 01:03:53 2006
@@ -28,7 +28,7 @@
 
 XXX Semantics
 =============
-* When bad marshalled bytecode: ``ImportError: Non-code object in bad_bc.pyc``
+* If bad bytecode in .pyc but good source, is source used and bytecode recreated?
   
 
 Things to be exposed at the Python level
@@ -69,6 +69,7 @@
     + Explicit is better than implicit.
     + Can't entire remove without requiring ``import pkg.module as module``
       on imports instead of ``from pkg import module``.
+* Any way to replace imp.acquire_lock()/release_lock() with a context manager instead?
        
 Rejected Ideas
 --------------
@@ -411,7 +412,12 @@
         return imp.get_magic() == magic
         
     def code_from_bytecode(self, bytecode):
-        """Create a code object from bytecode."""
+        """Create a code object from bytecode.
+        
+        ValueError is expected to be raised if a code object can not be created
+        from the bytecode.
+        
+        """
         return marshal.loads(bytecode)
         
     def code_from_source(self, source, path):
@@ -489,7 +495,11 @@
                         raise ImportError("bytcode is stale")
                 # Bytecode is valid.
                 module.__file__ = path
-                code_object = self.code_from_bytecode(bytecode)
+                try:
+                    code_object = self.code_from_bytecode(bytecode)
+                except ValueError:
+                    raise ImportError('Non-code object in %s' %
+                                        str(bytecode_path))
                 exec code_object in module.__dict__
                 return module
             except ImportError:

Modified: sandbox/trunk/import_in_py/mock_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/mock_importer.py	(original)
+++ sandbox/trunk/import_in_py/mock_importer.py	Wed Dec  6 01:03:53 2006
@@ -65,7 +65,7 @@
 
     @classmethod
     def setup(cls, good_magic=True, good_timestamp=True, pyc_exists=True,
-                    py_exists=True):
+                    py_exists=True, good_bytecode=True):
         """Set up the mock loader based on possible scenarios of source and
         bytecode combinations/issues."""
         self = cls('<setup>', '<setup>')
@@ -90,7 +90,10 @@
         else:
             pyc += w_long(self.modification_time - 1)
         # Needed for read_data on .pyc path.
-        self.pyc = pyc + bytecode
+        if good_bytecode:
+            self.pyc = pyc + bytecode
+        else:
+            self.pyc = pyc + "asd4asfasd4ae4fds"
         self.log = []
         return self
         

Modified: sandbox/trunk/import_in_py/test_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/test_importer.py	(original)
+++ sandbox/trunk/import_in_py/test_importer.py	Wed Dec  6 01:03:53 2006
@@ -570,11 +570,14 @@
         self.failUnless(not self.handler.check_magic(larger_number))
         
     def test_code_from_bytecode(self):
-        # Create a code object from bytecode.
+        # Create a code object from bytecode; raises ValueError if code object
+        # cannot be created.
         code_object = self.handler.code_from_bytecode(self.bytecode)
         module = mock_importer.MockModule(self.module_name)
         exec code_object in module.__dict__
         self.verify_module(module)
+        self.failUnlessRaises(ValueError, self.handler.code_from_bytecode,
+                                "234lkjfdase4")
         
     def test_code_from_source(self):
         # Create a code object from source.
@@ -618,8 +621,12 @@
         self.failUnlessRaises(ImportError, loader._handle_pyc, handler)
         
     def test_bad_bytecode_no_py(self):
-        # XXX Will bad bytecode lead to an ImportError?
-        pass
+        # A .pyc file with bad bytecode (but good magic number and timestamp)
+        # should raise an ImportError.
+        loader = mock_importer.MockPyPycLoader.setup(py_exists=False,
+                                                     good_bytecode=False)
+        handler = loader._create_handler(importer.PyPycHandler)
+        self.failUnlessRaises(ImportError, loader._handle_pyc, handler)
         
     def test_bad_magic_w_py(self):
         # A .pyc file with a bad magic number should lead to the .py file being


More information about the Python-checkins mailing list