From c264e3ee206d5e5d1cb2aeff2cb0cd864dce83c8 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Wed, 25 Jan 2012 18:58:03 -0500 Subject: [PATCH] Move some code from importlib.__init__ to importlib._bootstrap that does not need to be exposed from C code for bootstrapping reasons. --- Lib/importlib/__init__.py | 43 +++++--------------- Lib/importlib/_bootstrap.py | 39 ++++++++++++++++-- Lib/importlib/abc.py | 4 +- Lib/importlib/test/source/test_abc_loader.py | 8 ++-- 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index 9b20367f35d..9672b36d438 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -26,8 +26,15 @@ import os import re import tokenize +# To simplify imports in test code +_w_long = _bootstrap._w_long +_r_long = _bootstrap._r_long + + # Bootstrap help ##################################################### +# TODO: Expose from import.c, else handle encode/decode as _os.environ returns +# bytes. def _case_ok(directory, check): """Check if the directory contains something matching 'check'. @@ -36,37 +43,13 @@ def _case_ok(directory, check): """ if 'PYTHONCASEOK' in os.environ: return True - elif check in os.listdir(directory if directory else os.getcwd()): + if not directory: + directory = os.getcwd() + if check in os.listdir(directory): return True return False - -def _w_long(x): - """Convert a 32-bit integer to little-endian. - - XXX Temporary until marshal's long functions are exposed. - - """ - x = int(x) - int_bytes = [] - int_bytes.append(x & 0xFF) - int_bytes.append((x >> 8) & 0xFF) - int_bytes.append((x >> 16) & 0xFF) - int_bytes.append((x >> 24) & 0xFF) - return bytearray(int_bytes) - - -def _r_long(int_bytes): - """Convert 4 bytes in little-endian to an integer. - - XXX Temporary until marshal's long function are exposed. - - """ - x = int_bytes[0] - x |= int_bytes[1] << 8 - x |= int_bytes[2] << 16 - x |= int_bytes[3] << 24 - return x +_bootstrap._case_ok = _case_ok # Required built-in modules. @@ -94,10 +77,6 @@ from os import sep # For os.path.join replacement; pull from Include/osdefs.h:SEP . _bootstrap.path_sep = sep -_bootstrap._case_ok = _case_ok -marshal._w_long = _w_long -marshal._r_long = _r_long - # Public API ######################################################### diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 11d7d0af942..e81fa9f74f7 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -18,6 +18,37 @@ work. One should use importlib as the public-facing version of this module. # Bootstrap-related code ###################################################### +# TODO: Expose from marshal +def _w_long(x): + """Convert a 32-bit integer to little-endian. + + XXX Temporary until marshal's long functions are exposed. + + """ + x = int(x) + int_bytes = [] + int_bytes.append(x & 0xFF) + int_bytes.append((x >> 8) & 0xFF) + int_bytes.append((x >> 16) & 0xFF) + int_bytes.append((x >> 24) & 0xFF) + return bytearray(int_bytes) + + +# TODO: Expose from marshal +def _r_long(int_bytes): + """Convert 4 bytes in little-endian to an integer. + + XXX Temporary until marshal's long function are exposed. + + """ + x = int_bytes[0] + x |= int_bytes[1] << 8 + x |= int_bytes[2] << 16 + x |= int_bytes[3] << 24 + return x + + + # XXX Could also expose Modules/getpath.c:joinpath() def _path_join(*args): """Replacement for os.path.join.""" @@ -353,14 +384,14 @@ class _LoaderBasics: except KeyError: pass else: - if marshal._r_long(raw_timestamp) != source_mtime: + if _r_long(raw_timestamp) != source_mtime: raise ImportError("bytecode is stale for {}".format(fullname)) try: source_size = source_stats['size'] & 0xFFFFFFFF except KeyError: pass else: - if marshal._r_long(raw_size) != source_size: + if _r_long(raw_size) != source_size: raise ImportError("bytecode is stale for {}".format(fullname)) # Can't return the code object as errors from marshal loading need to # propagate even when source is available. @@ -472,8 +503,8 @@ class SourceLoader(_LoaderBasics): # their own cached file format, this block of code will most likely # throw an exception. data = bytearray(imp.get_magic()) - data.extend(marshal._w_long(source_mtime)) - data.extend(marshal._w_long(len(source_bytes))) + data.extend(_w_long(source_mtime)) + data.extend(_w_long(len(source_bytes))) data.extend(marshal.dumps(code_object)) try: self.set_data(bytecode_path, data) diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index 0d376298c25..c4b7187d60d 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -260,7 +260,7 @@ class PyPycLoader(PyLoader): raw_timestamp = data[4:8] if len(raw_timestamp) < 4: raise EOFError("bad timestamp in {}".format(fullname)) - pyc_timestamp = marshal._r_long(raw_timestamp) + pyc_timestamp = _bootstrap._r_long(raw_timestamp) bytecode = data[8:] # Verify that the magic number is valid. if imp.get_magic() != magic: @@ -292,7 +292,7 @@ class PyPycLoader(PyLoader): # Generate bytecode and write it out. if not sys.dont_write_bytecode: data = bytearray(imp.get_magic()) - data.extend(marshal._w_long(source_timestamp)) + data.extend(_bootstrap._w_long(source_timestamp)) data.extend(marshal.dumps(code_object)) self.write_bytecode(fullname, data) return code_object diff --git a/Lib/importlib/test/source/test_abc_loader.py b/Lib/importlib/test/source/test_abc_loader.py index be81992fb2d..01acda4b9a6 100644 --- a/Lib/importlib/test/source/test_abc_loader.py +++ b/Lib/importlib/test/source/test_abc_loader.py @@ -42,8 +42,8 @@ class SourceLoaderMock(SourceOnlyLoaderMock): self.bytecode_path = imp.cache_from_source(self.path) self.source_size = len(self.source) data = bytearray(magic) - data.extend(marshal._w_long(self.source_mtime)) - data.extend(marshal._w_long(self.source_size)) + data.extend(importlib._w_long(self.source_mtime)) + data.extend(importlib._w_long(self.source_size)) code_object = compile(self.source, self.path, 'exec', dont_inherit=True) data.extend(marshal.dumps(code_object)) @@ -658,8 +658,8 @@ class SourceLoaderBytecodeTests(SourceLoaderTestHarness): if bytecode_written: self.assertIn(self.cached, self.loader.written) data = bytearray(imp.get_magic()) - data.extend(marshal._w_long(self.loader.source_mtime)) - data.extend(marshal._w_long(self.loader.source_size)) + data.extend(importlib._w_long(self.loader.source_mtime)) + data.extend(importlib._w_long(self.loader.source_size)) data.extend(marshal.dumps(code_object)) self.assertEqual(self.loader.written[self.cached], bytes(data))