Staging
v0.5.1
https://github.com/python/cpython
Raw File
Tip revision: 8c83ec63f59b5a9512f907aa4f2c63d3ed7af7a0 authored by cvs2svn on 16 April 2001, 02:07:08 UTC
This commit was manufactured by cvs2svn to create tag 'r21c2'.
Tip revision: 8c83ec6
Remote.py
"""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

back to top