diff options
Diffstat (limited to 'Lib/idlelib/Remote.py')
-rw-r--r-- | Lib/idlelib/Remote.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Lib/idlelib/Remote.py b/Lib/idlelib/Remote.py new file mode 100644 index 0000000..facba78 --- /dev/null +++ b/Lib/idlelib/Remote.py @@ -0,0 +1,101 @@ +"""Remote + This module is imported by the loader and serves to control + the execution of the user program. It presently executes files + and reports exceptions to IDLE. It could be extended to provide + other services, such as interactive mode and debugging. To that + end, it could be a subclass of e.g. InteractiveInterpreter. + + Two other classes, pseudoIn and pseudoOut, are file emulators also + used by loader. +""" +import sys, os +import traceback + +class Remote: + def __init__(self, main, master): + self.main = main + self.master = master + self.this_file = self.canonic( self.__init__.im_func.func_code.co_filename ) + + def canonic(self, path): + return os.path.normcase(os.path.abspath(path)) + + def mainloop(self): + while 1: + args = self.master.get_command() + + try: + f = getattr(self,args[0]) + apply(f,args[1:]) + except: + if not self.report_exception(): raise + + def finish(self): + sys.exit() + + def run(self, *argv): + sys.argv = argv + + path = self.canonic( argv[0] ) + dir = self.dir = os.path.dirname(path) + os.chdir(dir) + + sys.path[0] = dir + + usercode = open(path) + exec usercode in self.main + + def report_exception(self): + try: + type, value, tb = sys.exc_info() + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + + tblist = traceback.extract_tb(tb) + + # Look through the traceback, canonicalizing filenames and + # eliminating leading and trailing system modules. + first = last = 1 + for i in range(len(tblist)): + filename, lineno, name, line = tblist[i] + filename = self.canonic(filename) + tblist[i] = filename, lineno, name, line + + dir = os.path.dirname(filename) + if filename == self.this_file: + first = i+1 + elif dir==self.dir: + last = i+1 + + # Canonicalize the filename in a syntax error, too: + if type is SyntaxError: + try: + msg, (filename, lineno, offset, line) = value + filename = self.canonic(filename) + value = msg, (filename, lineno, offset, line) + except: + pass + + return self.master.program_exception( type, value, tblist, first, last ) + finally: + # avoid any circular reference through the traceback + del tb + +class pseudoIn: + def __init__(self, readline): + self.readline = readline + def isatty(): + return 1 + +class pseudoOut: + def __init__(self, func, **kw): + self.func = func + self.kw = kw + def write(self, *args): + return apply( self.func, args, self.kw ) + def writelines(self, l): + map(self.write, l) + def flush(self): + pass + |