[Python-checkins] cpython: Move some code from importlib.__init__ to importlib._bootstrap that

brett.cannon python-checkins at python.org
Thu Jan 26 14:58:34 CET 2012


http://hg.python.org/cpython/rev/7d8f016784cd
changeset: 74630:7d8f016784cd
parent: 74624:e68ddfc193d5
user: Brett Cannon <brett at python.org>
date: Wed Jan 25 18:58:03 2012 -0500
summary:
 Move some code from importlib.__init__ to importlib._bootstrap that
does not need to be exposed from C code for bootstrapping reasons.
files:
 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
--- a/Lib/importlib/__init__.py
+++ b/Lib/importlib/__init__.py
@@ -26,8 +26,15 @@
 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 @@
 """
 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 @@
 # 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
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -18,6 +18,37 @@
 
 # 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 @@
 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 @@
 # 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
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -260,7 +260,7 @@
 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 @@
 # 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
--- a/Lib/importlib/test/source/test_abc_loader.py
+++ b/Lib/importlib/test/source/test_abc_loader.py
@@ -42,8 +42,8 @@
 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 @@
 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))
 
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /