Merge
This commit is contained in:
commit
7f2b576875
|
@ -26,8 +26,15 @@ import os
|
||||||
import re
|
import re
|
||||||
import tokenize
|
import tokenize
|
||||||
|
|
||||||
|
# To simplify imports in test code
|
||||||
|
_w_long = _bootstrap._w_long
|
||||||
|
_r_long = _bootstrap._r_long
|
||||||
|
|
||||||
|
|
||||||
# Bootstrap help #####################################################
|
# Bootstrap help #####################################################
|
||||||
|
|
||||||
|
# TODO: Expose from import.c, else handle encode/decode as _os.environ returns
|
||||||
|
# bytes.
|
||||||
def _case_ok(directory, check):
|
def _case_ok(directory, check):
|
||||||
"""Check if the directory contains something matching 'check'.
|
"""Check if the directory contains something matching 'check'.
|
||||||
|
|
||||||
|
@ -36,37 +43,13 @@ def _case_ok(directory, check):
|
||||||
"""
|
"""
|
||||||
if 'PYTHONCASEOK' in os.environ:
|
if 'PYTHONCASEOK' in os.environ:
|
||||||
return True
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
_bootstrap._case_ok = _case_ok
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
# Required built-in modules.
|
# Required built-in modules.
|
||||||
|
@ -94,10 +77,6 @@ from os import sep
|
||||||
# For os.path.join replacement; pull from Include/osdefs.h:SEP .
|
# For os.path.join replacement; pull from Include/osdefs.h:SEP .
|
||||||
_bootstrap.path_sep = sep
|
_bootstrap.path_sep = sep
|
||||||
|
|
||||||
_bootstrap._case_ok = _case_ok
|
|
||||||
marshal._w_long = _w_long
|
|
||||||
marshal._r_long = _r_long
|
|
||||||
|
|
||||||
|
|
||||||
# Public API #########################################################
|
# Public API #########################################################
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,37 @@ work. One should use importlib as the public-facing version of this module.
|
||||||
|
|
||||||
# Bootstrap-related code ######################################################
|
# 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()
|
# XXX Could also expose Modules/getpath.c:joinpath()
|
||||||
def _path_join(*args):
|
def _path_join(*args):
|
||||||
"""Replacement for os.path.join."""
|
"""Replacement for os.path.join."""
|
||||||
|
@ -353,14 +384,14 @@ class _LoaderBasics:
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if marshal._r_long(raw_timestamp) != source_mtime:
|
if _r_long(raw_timestamp) != source_mtime:
|
||||||
raise ImportError("bytecode is stale for {}".format(fullname))
|
raise ImportError("bytecode is stale for {}".format(fullname))
|
||||||
try:
|
try:
|
||||||
source_size = source_stats['size'] & 0xFFFFFFFF
|
source_size = source_stats['size'] & 0xFFFFFFFF
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if marshal._r_long(raw_size) != source_size:
|
if _r_long(raw_size) != source_size:
|
||||||
raise ImportError("bytecode is stale for {}".format(fullname))
|
raise ImportError("bytecode is stale for {}".format(fullname))
|
||||||
# Can't return the code object as errors from marshal loading need to
|
# Can't return the code object as errors from marshal loading need to
|
||||||
# propagate even when source is available.
|
# 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
|
# their own cached file format, this block of code will most likely
|
||||||
# throw an exception.
|
# throw an exception.
|
||||||
data = bytearray(imp.get_magic())
|
data = bytearray(imp.get_magic())
|
||||||
data.extend(marshal._w_long(source_mtime))
|
data.extend(_w_long(source_mtime))
|
||||||
data.extend(marshal._w_long(len(source_bytes)))
|
data.extend(_w_long(len(source_bytes)))
|
||||||
data.extend(marshal.dumps(code_object))
|
data.extend(marshal.dumps(code_object))
|
||||||
try:
|
try:
|
||||||
self.set_data(bytecode_path, data)
|
self.set_data(bytecode_path, data)
|
||||||
|
|
|
@ -260,7 +260,7 @@ class PyPycLoader(PyLoader):
|
||||||
raw_timestamp = data[4:8]
|
raw_timestamp = data[4:8]
|
||||||
if len(raw_timestamp) < 4:
|
if len(raw_timestamp) < 4:
|
||||||
raise EOFError("bad timestamp in {}".format(fullname))
|
raise EOFError("bad timestamp in {}".format(fullname))
|
||||||
pyc_timestamp = marshal._r_long(raw_timestamp)
|
pyc_timestamp = _bootstrap._r_long(raw_timestamp)
|
||||||
bytecode = data[8:]
|
bytecode = data[8:]
|
||||||
# Verify that the magic number is valid.
|
# Verify that the magic number is valid.
|
||||||
if imp.get_magic() != magic:
|
if imp.get_magic() != magic:
|
||||||
|
@ -292,7 +292,7 @@ class PyPycLoader(PyLoader):
|
||||||
# Generate bytecode and write it out.
|
# Generate bytecode and write it out.
|
||||||
if not sys.dont_write_bytecode:
|
if not sys.dont_write_bytecode:
|
||||||
data = bytearray(imp.get_magic())
|
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))
|
data.extend(marshal.dumps(code_object))
|
||||||
self.write_bytecode(fullname, data)
|
self.write_bytecode(fullname, data)
|
||||||
return code_object
|
return code_object
|
||||||
|
|
|
@ -42,8 +42,8 @@ class SourceLoaderMock(SourceOnlyLoaderMock):
|
||||||
self.bytecode_path = imp.cache_from_source(self.path)
|
self.bytecode_path = imp.cache_from_source(self.path)
|
||||||
self.source_size = len(self.source)
|
self.source_size = len(self.source)
|
||||||
data = bytearray(magic)
|
data = bytearray(magic)
|
||||||
data.extend(marshal._w_long(self.source_mtime))
|
data.extend(importlib._w_long(self.source_mtime))
|
||||||
data.extend(marshal._w_long(self.source_size))
|
data.extend(importlib._w_long(self.source_size))
|
||||||
code_object = compile(self.source, self.path, 'exec',
|
code_object = compile(self.source, self.path, 'exec',
|
||||||
dont_inherit=True)
|
dont_inherit=True)
|
||||||
data.extend(marshal.dumps(code_object))
|
data.extend(marshal.dumps(code_object))
|
||||||
|
@ -658,8 +658,8 @@ class SourceLoaderBytecodeTests(SourceLoaderTestHarness):
|
||||||
if bytecode_written:
|
if bytecode_written:
|
||||||
self.assertIn(self.cached, self.loader.written)
|
self.assertIn(self.cached, self.loader.written)
|
||||||
data = bytearray(imp.get_magic())
|
data = bytearray(imp.get_magic())
|
||||||
data.extend(marshal._w_long(self.loader.source_mtime))
|
data.extend(importlib._w_long(self.loader.source_mtime))
|
||||||
data.extend(marshal._w_long(self.loader.source_size))
|
data.extend(importlib._w_long(self.loader.source_size))
|
||||||
data.extend(marshal.dumps(code_object))
|
data.extend(marshal.dumps(code_object))
|
||||||
self.assertEqual(self.loader.written[self.cached], bytes(data))
|
self.assertEqual(self.loader.written[self.cached], bytes(data))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue