codeop.py (1889B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\codeop.py 2 import __future__ 3 _features = [ getattr(__future__, fname) for fname in __future__.all_feature_names ] 4 __all__ = ['compile_command', 'Compile', 'CommandCompiler'] 5 PyCF_DONT_IMPLY_DEDENT = 512 6 7 def _maybe_compile(compiler, source, filename, symbol): 8 for line in source.split('\n'): 9 line = line.strip() 10 if line and line[0] != '#': 11 break 12 else: 13 if symbol != 'eval': 14 source = 'pass' 15 16 err = err1 = err2 = None 17 code = code1 = code2 = None 18 try: 19 code = compiler(source, filename, symbol) 20 except SyntaxError as err: 21 pass 22 23 try: 24 code1 = compiler(source + '\n', filename, symbol) 25 except SyntaxError as err1: 26 pass 27 28 try: 29 code2 = compiler(source + '\n\n', filename, symbol) 30 except SyntaxError as err2: 31 pass 32 33 if code: 34 return code 35 if not code1 and repr(err1) == repr(err2): 36 raise SyntaxError, err1 37 38 39 def _compile(source, filename, symbol): 40 return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) 41 42 43 def compile_command(source, filename = '<input>', symbol = 'single'): 44 return _maybe_compile(_compile, source, filename, symbol) 45 46 47 class Compile: 48 49 def __init__(self): 50 self.flags = PyCF_DONT_IMPLY_DEDENT 51 52 def __call__(self, source, filename, symbol): 53 codeob = compile(source, filename, symbol, self.flags, 1) 54 for feature in _features: 55 if codeob.co_flags & feature.compiler_flag: 56 self.flags |= feature.compiler_flag 57 58 return codeob 59 60 61 class CommandCompiler: 62 63 def __init__(self): 64 self.compiler = Compile() 65 66 def __call__(self, source, filename = '<input>', symbol = 'single'): 67 return _maybe_compile(self.compiler, source, filename, symbol)