You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
"""Compiler helpers for the debugger."""
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import tempfile
 | 
						|
 | 
						|
from IPython.core.compilerop import CachingCompiler
 | 
						|
 | 
						|
 | 
						|
def murmur2_x86(data, seed):
 | 
						|
    """Get the murmur2 hash."""
 | 
						|
    m = 0x5BD1E995
 | 
						|
    data = [chr(d) for d in str.encode(data, "utf8")]
 | 
						|
    length = len(data)
 | 
						|
    h = seed ^ length
 | 
						|
    rounded_end = length & 0xFFFFFFFC
 | 
						|
    for i in range(0, rounded_end, 4):
 | 
						|
        k = (
 | 
						|
            (ord(data[i]) & 0xFF)
 | 
						|
            | ((ord(data[i + 1]) & 0xFF) << 8)
 | 
						|
            | ((ord(data[i + 2]) & 0xFF) << 16)
 | 
						|
            | (ord(data[i + 3]) << 24)
 | 
						|
        )
 | 
						|
        k = (k * m) & 0xFFFFFFFF
 | 
						|
        k ^= k >> 24
 | 
						|
        k = (k * m) & 0xFFFFFFFF
 | 
						|
 | 
						|
        h = (h * m) & 0xFFFFFFFF
 | 
						|
        h ^= k
 | 
						|
 | 
						|
    val = length & 0x03
 | 
						|
    k = 0
 | 
						|
    if val == 3:
 | 
						|
        k = (ord(data[rounded_end + 2]) & 0xFF) << 16
 | 
						|
    if val in [2, 3]:
 | 
						|
        k |= (ord(data[rounded_end + 1]) & 0xFF) << 8
 | 
						|
    if val in [1, 2, 3]:
 | 
						|
        k |= ord(data[rounded_end]) & 0xFF
 | 
						|
        h ^= k
 | 
						|
        h = (h * m) & 0xFFFFFFFF
 | 
						|
 | 
						|
    h ^= h >> 13
 | 
						|
    h = (h * m) & 0xFFFFFFFF
 | 
						|
    h ^= h >> 15
 | 
						|
 | 
						|
    return h
 | 
						|
 | 
						|
 | 
						|
convert_to_long_pathname = lambda filename: filename  # noqa: E731
 | 
						|
 | 
						|
if sys.platform == "win32":
 | 
						|
    try:
 | 
						|
        import ctypes
 | 
						|
        from ctypes.wintypes import DWORD, LPCWSTR, LPWSTR, MAX_PATH
 | 
						|
 | 
						|
        _GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
 | 
						|
        _GetLongPathName.argtypes = [LPCWSTR, LPWSTR, DWORD]
 | 
						|
        _GetLongPathName.restype = DWORD
 | 
						|
 | 
						|
        def _convert_to_long_pathname(filename):
 | 
						|
            buf = ctypes.create_unicode_buffer(MAX_PATH)
 | 
						|
            rv = _GetLongPathName(filename, buf, MAX_PATH)
 | 
						|
            if rv != 0 and rv <= MAX_PATH:
 | 
						|
                filename = buf.value
 | 
						|
            return filename
 | 
						|
 | 
						|
        # test that it works so if there are any issues we fail just once here
 | 
						|
        _convert_to_long_pathname(__file__)
 | 
						|
    except Exception:
 | 
						|
        pass
 | 
						|
    else:
 | 
						|
        convert_to_long_pathname = _convert_to_long_pathname
 | 
						|
 | 
						|
 | 
						|
def get_tmp_directory():
 | 
						|
    """Get a temp directory."""
 | 
						|
    tmp_dir = convert_to_long_pathname(tempfile.gettempdir())
 | 
						|
    pid = os.getpid()
 | 
						|
    return tmp_dir + os.sep + "ipykernel_" + str(pid)
 | 
						|
 | 
						|
 | 
						|
def get_tmp_hash_seed():
 | 
						|
    """Get a temp hash seed."""
 | 
						|
    return 0xC70F6907
 | 
						|
 | 
						|
 | 
						|
def get_file_name(code):
 | 
						|
    """Get a file name."""
 | 
						|
    cell_name = os.environ.get("IPYKERNEL_CELL_NAME")
 | 
						|
    if cell_name is None:
 | 
						|
        name = murmur2_x86(code, get_tmp_hash_seed())
 | 
						|
        cell_name = get_tmp_directory() + os.sep + str(name) + ".py"
 | 
						|
    return cell_name
 | 
						|
 | 
						|
 | 
						|
class XCachingCompiler(CachingCompiler):
 | 
						|
    """A custom caching compiler."""
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        """Initialize the compiler."""
 | 
						|
        super().__init__(*args, **kwargs)
 | 
						|
        self.log = None
 | 
						|
 | 
						|
    def get_code_name(self, raw_code, code, number):
 | 
						|
        """Get the code name."""
 | 
						|
        return get_file_name(raw_code)
 |