diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-09-18 22:22:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-18 22:22:29 +0300 |
commit | 79d1c2e6c9d1bc1cf41ec3041801ca1a2b9a995b (patch) | |
tree | 024dfc74ad7bd5290180638b1290301ef928426f /Lib/importlib | |
parent | 4ba3b50bfe6d50cd82d208023ea23e203ab50589 (diff) | |
download | cpython-git-79d1c2e6c9d1bc1cf41ec3041801ca1a2b9a995b.tar.gz |
bpo-25711: Rewrite zipimport in pure Python. (GH-6809)
Diffstat (limited to 'Lib/importlib')
-rw-r--r-- | Lib/importlib/__init__.py | 4 | ||||
-rw-r--r-- | Lib/importlib/_bootstrap_external.py | 26 |
2 files changed, 18 insertions, 12 deletions
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index cb37d246a7..0c73c505f9 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -48,8 +48,8 @@ else: sys.modules['importlib._bootstrap_external'] = _bootstrap_external # To simplify imports in test code -_w_long = _bootstrap_external._w_long -_r_long = _bootstrap_external._r_long +_pack_uint32 = _bootstrap_external._pack_uint32 +_unpack_uint32 = _bootstrap_external._unpack_uint32 # Fully bootstrapped at this point, import whatever you like, circular # dependencies and startup overhead minimisation permitting :) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 7f8bc2167c..6ef6bf8ab6 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -43,14 +43,20 @@ def _make_relax_case(): return _relax_case -def _w_long(x): +def _pack_uint32(x): """Convert a 32-bit integer to little-endian.""" return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') -def _r_long(int_bytes): +def _unpack_uint32(data): """Convert 4 bytes in little-endian to an integer.""" - return int.from_bytes(int_bytes, 'little') + assert len(data) == 4 + return int.from_bytes(data, 'little') + +def _unpack_uint16(data): + """Convert 2 bytes in little-endian to an integer.""" + assert len(data) == 2 + return int.from_bytes(data, 'little') def _path_join(*path_parts): @@ -503,7 +509,7 @@ def _classify_pyc(data, name, exc_details): message = f'reached EOF while reading pyc header of {name!r}' _bootstrap._verbose_message('{}', message) raise EOFError(message) - flags = _r_long(data[4:8]) + flags = _unpack_uint32(data[4:8]) # Only the first two flags are defined. if flags & ~0b11: message = f'invalid flags {flags!r} in {name!r}' @@ -530,12 +536,12 @@ def _validate_timestamp_pyc(data, source_mtime, source_size, name, An ImportError is raised if the bytecode is stale. """ - if _r_long(data[8:12]) != (source_mtime & 0xFFFFFFFF): + if _unpack_uint32(data[8:12]) != (source_mtime & 0xFFFFFFFF): message = f'bytecode is stale for {name!r}' _bootstrap._verbose_message('{}', message) raise ImportError(message, **exc_details) if (source_size is not None and - _r_long(data[12:16]) != (source_size & 0xFFFFFFFF)): + _unpack_uint32(data[12:16]) != (source_size & 0xFFFFFFFF)): raise ImportError(f'bytecode is stale for {name!r}', **exc_details) @@ -579,9 +585,9 @@ def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None): def _code_to_timestamp_pyc(code, mtime=0, source_size=0): "Produce the data for a timestamp-based pyc." data = bytearray(MAGIC_NUMBER) - data.extend(_w_long(0)) - data.extend(_w_long(mtime)) - data.extend(_w_long(source_size)) + data.extend(_pack_uint32(0)) + data.extend(_pack_uint32(mtime)) + data.extend(_pack_uint32(source_size)) data.extend(marshal.dumps(code)) return data @@ -590,7 +596,7 @@ def _code_to_hash_pyc(code, source_hash, checked=True): "Produce the data for a hash-based pyc." data = bytearray(MAGIC_NUMBER) flags = 0b1 | checked << 1 - data.extend(_w_long(flags)) + data.extend(_pack_uint32(flags)) assert len(source_hash) == 8 data.extend(source_hash) data.extend(marshal.dumps(code)) |