NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)