Files
m2dev-client/assets/root/system.py
d1str4ught 1b326373ea py fixes
2026-02-09 00:33:22 +01:00

370 lines
7.6 KiB
Python

import sys
import app
import dbg
import builtins
import _frozen_importlib as _bootstrap
import _frozen_importlib_external as _bootstrap_external
import marshal
import pack
import __main__
import re
# Keep import paths deterministic for the embedded runtime.
sys.path = [p for p in sys.path if isinstance(p, str)]
if "lib" not in sys.path:
sys.path.append("lib")
class TraceFile:
def write(self, msg):
dbg.Trace(msg)
class TraceErrorFile:
def write(self, msg):
dbg.TraceError(msg)
dbg.RegisterExceptionString(msg)
class LogBoxFile:
def __init__(self):
self.stderrSave = sys.stderr
self.msg = ""
def __del__(self):
self.restore()
def restore(self):
if sys:
sys.stderr = self.stderrSave
def write(self, msg):
self.msg = self.msg + msg
def show(self):
dbg.LogBox(self.msg,"Error")
sys.stdout = TraceFile()
sys.stderr = TraceErrorFile()
#
# pack file support (must move to system.py, systemrelease.pyc)
#
class pack_file_iterator(object):
def __init__(self, packfile):
self.pack_file = packfile
def __next__(self):
tmp = self.pack_file.readline()
if tmp:
return tmp
raise StopIteration
_chr = builtins.chr
_SOURCE_ENCODING_RE = re.compile(br"coding[:=]\s*([-\w.]+)")
def _extract_source_encoding(data):
for line in data.splitlines()[:2]:
match = _SOURCE_ENCODING_RE.search(line)
if not match:
continue
try:
return match.group(1).decode("ascii")
except Exception:
return None
return None
def _decode_pack_text(data):
if isinstance(data, str):
return data
if isinstance(data, bytearray):
data = bytes(data)
elif not isinstance(data, bytes):
data = bytes(data)
encodings = []
source_encoding = _extract_source_encoding(data)
if source_encoding:
encodings.append(source_encoding)
encodings.extend(("utf-8-sig", "cp949", "latin-1"))
seen = set()
for encoding in encodings:
if encoding in seen:
continue
seen.add(encoding)
try:
return data.decode(encoding)
except (LookupError, UnicodeDecodeError):
pass
return data.decode("utf-8", "replace")
class pack_file(object):
def __init__(self, filename, mode = 'rb'):
assert mode in ('r', 'rb')
if not pack.Exist(filename):
raise IOError('No file or directory')
self.mode = mode
self.data = pack.Get(filename)
if mode == 'r':
self.data = _decode_pack_text(self.data)
self.data = self.data.replace(_chr(13) + _chr(10), _chr(10)).replace(_chr(13), _chr(10))
def __iter__(self):
return pack_file_iterator(self)
def read(self, length = None):
empty = b'' if self.mode == 'rb' else ''
if not self.data:
return empty
if length:
tmp = self.data[:length]
self.data = self.data[length:]
return tmp
else:
tmp = self.data
self.data = b'' if self.mode == 'rb' else ''
return tmp
def readline(self):
newline = b'\n' if self.mode == 'rb' else _chr(10)
return self.read(self.data.find(newline)+1)
def readlines(self):
return [x for x in self]
builtins.pack_open = pack_open = pack_file
old_open = open
def open(filename, mode = 'rb'):
try:
if mode in ('r', 'rb') and pack.Exist(filename):
return pack_file(filename, mode)
except Exception:
pass
return old_open(filename, mode)
builtins.open = open
builtins.old_open = old_open
builtins.new_open = open
_ModuleType = type(sys)
module_do = lambda x:None
currentExecName = ""
class custom_import_hook(object):
def _pack_filename(self, name):
filename = name + ".py"
if pack.Exist(filename):
return filename
return None
def find_spec(self, fullname, path=None, target=None):
filename = self._pack_filename(fullname)
if not filename:
return None
return _bootstrap.spec_from_loader(fullname, self, origin=filename)
def create_module(self, spec):
return None
def exec_module(self, module):
global currentExecName
name = module.__name__
filename = self._pack_filename(name)
if not filename:
raise ImportError(name)
dbg.Trace('importing from pack %s\\n' % name)
currentExecName = name
execfile(filename, module.__dict__)
module_do(module)
def find_module(self, name, path=None):
if self._pack_filename(name):
return self
return None
def load_module(self, name):
if name in sys.modules:
return sys.modules[name]
module = _ModuleType(name)
sys.modules[name] = module
self.exec_module(module)
return sys.modules[name]
def splitext(p):
root, ext = '', ''
for c in p:
if c in ['/']:
root, ext = root + ext + c, ''
elif c == '.':
if ext:
root, ext = root + ext, c
else:
ext = c
elif ext:
ext = ext + c
else:
root = root + c
return root, ext
class PythonExecutioner:
def Run(kPESelf, sFileName, kDict):
if kPESelf.__IsCompiledFile__(sFileName):
kCode=kPESelf.__LoadCompiledFile__(sFileName)
else:
kCode=kPESelf.__LoadTextFile__(sFileName)
exec(kCode, kDict)
def __IsCompiledFile__(kPESelf, sFileName):
sBase, sExt = splitext(sFileName)
sExt=sExt.lower()
if sExt==".pyc" or sExt==".pyo":
return 1
else:
return 0
def __LoadTextFile__(kPESelf, sFileName):
sText=pack_open(sFileName,'r').read()
return compile(sText, sFileName, "exec")
def __LoadCompiledFile__(kPESelf, sFileName):
kFile=pack_open(sFileName)
magic = kFile.read(4)
if isinstance(magic, str):
magic = magic.encode("latin1")
if magic != _bootstrap_external.MAGIC_NUMBER:
raise
kFile.read(4)
kData=kFile.read()
if isinstance(kData, str):
kData = kData.encode("latin1")
return marshal.loads(kData)
def execfile(fileName, dict):
kPE=PythonExecutioner()
kPE.Run(fileName, dict)
def exec_add_module_do(mod):
global execfile
mod.__dict__['execfile'] = execfile
module_do = exec_add_module_do
meta_hook = custom_import_hook()
if meta_hook not in sys.meta_path:
sys.meta_path.insert(0, meta_hook)
"""
#
# PSYCO installation (must move to system.py, systemrelease.pyc)
#
try:
import psyco
#from psyco.classes import *
def bind_me(bindable_list):
try:
for x in bindable_list:
try:
psyco.bind(x)
except:
pass
except:
pass
_prev_psyco_old_module_do = module_do
def module_bind(module):
_prev_psyco_old_module_do(module)
#print 'start binding' + str(module)
try:
psyco.bind(module)
except:
pass
for x in module.__dict__.itervalues():
try:
psyco.bind(x)
except:
pass
#print 'end binding'
dbg.Trace("PSYCO installed\\n")
except Exception, msg:
bind_me = lambda x:None
dbg.Trace("No PSYCO support : %s\\n" % msg)
"""
def GetExceptionString(excTitle):
(excType, excMsg, excTraceBack)=sys.exc_info()
excText=""
excText+=_chr(10)
import traceback
traceLineList=traceback.extract_tb(excTraceBack)
for traceLine in traceLineList:
if traceLine[3]:
excText+="%s(line:%d) %s - %s" % (traceLine[0], traceLine[1], traceLine[2], traceLine[3])
else:
excText+="%s(line:%d) %s" % (traceLine[0], traceLine[1], traceLine[2])
excText+=_chr(10)
excText+=_chr(10)
excText+="%s - %s:%s" % (excTitle, excType, excMsg)
excText+=_chr(10)
return excText
def ShowException(excTitle):
excText=GetExceptionString(excTitle)
dbg.TraceError(excText)
app.Abort()
return 0
def RunMainScript(name):
try:
source = open(name, "rb").read()
if isinstance(source, (bytes, bytearray)):
source = _decode_pack_text(source)
exec(compile(source, name, 'exec'), __main__.__dict__)
except RuntimeError as msg:
msg = str(msg)
import locale
if locale.error:
msg = locale.error.get(msg, msg)
dbg.LogBox(msg)
app.Abort()
except:
msg = GetExceptionString("Run")
dbg.LogBox(msg)
app.Abort()
try:
import debugInfo
except ImportError:
import debuginfo as debugInfo
debugInfo.SetDebugMode(__DEBUG__)
loginMark = "-cs"
RunMainScript("prototype.py")