Example #1
0
 def dispatch(self, node, *args):
     mutils.print_debug('dispatching for ' + repr(node.__class__) )
     mutils.print_debug( '   ' + repr(node) + ' in ' \
               + self.__class__.__name__)
     self.node = node
     klass = node.__class__
     meth = self._cache.get(klass, None)
     if meth is None:
         classList = [] # This is really a stack for the dfs search we're about to perform.
         classList.append(klass)
         
         while len(classList) >0 and meth is None:
             sklass = classList.pop()
             if hasattr(self.visitor, 'visit' + sklass.__name__):
                 meth = getattr(self.visitor,'visit'+sklass.__name__, self.default)
                 classList = []
             else:
                 # Ensures we parse classes _exactly_ like python does -- dfs, ltr.
                 classList = classList + [b for b in reversed(list(sklass.__bases__)) ]
             
         if meth is None:
             meth = self.default
         
         self._cache[klass] = meth
         
     ret = meth(node, *args)
     mutils.print_debug( 'finished with ' + repr(node.__class__) )
     return ret
Example #2
0
 def dispatch(self, node, *args):
   
     if type(node) is list:
       try:
         import multiprocessing as mp
         from multiprocessing import Pool
         
         p = Pool(4)
         return p.map(lambda t: self.dispatch(t,*args),node)
         
       except Exception:
         return [self.dispatch(sn,*args) for sn in node]
     mutils.print_debug( 'dispatching for ' + repr(node.__class__) )
     mutils.print_debug('   ' + repr(node) + ' in ' \
               + self.__class__.__name__ )
     self.node = node
     klass = node.__class__
     meth = self._cache.get(klass, None)
     if meth is None:
         className = klass.__name__
         meth = getattr(self.visitor, 'visit' + className, self.default)
         self._cache[klass] = meth
     ret = meth(node, *args)
     mutils.print_debug('finished with ' + repr(node.__class__) )
     return ret
Example #3
0
 def dispatch(self, node, *args):
     mutils.print_debug( 'dispatching for ' + repr(node.__class__) )
     mutils.print_debug('   ' + repr(node) + ' in ' \
               + self.__class__.__name__ )
     self.node = node
     klass = node.__class__
     meth = self._cache.get(klass, None)
     if meth is None:
         className = klass.__name__
         meth = getattr(self.visitor, 'visit' + className, self.default)
         self._cache[klass] = meth
     ret = meth(node, *args)
     mutils.print_debug('finished with ' + repr(node.__class__) )
     return ret
from generate_x86 import GenX86Visitor4,string_constants
from generate_x86 import fun_prefix
from remove_structured_control import RemoveStructuredControl
from uniquify import UniquifyVisitor
from os.path import splitext
from declassify import DeclassifyVisitor

debug = mutils.debug()

try:
    input_file_name = sys.argv[1]
    fbase = os.path.splitext(input_file_name)[0]
    ast = compiler.parseFile(input_file_name)
    
    if debug:
      mutils.print_debug('finished parsing')
      mutils.write_debug(repr(ast),fbase+'.00.prsr.ast')
      mutils.write_debug(ASTPyPrinter().preorder(ast),fbase+'.01.prsr.apy')
    
    
    
    ast = DeclassifyVisitor().preorder(ast)
    if debug:
      mutils.print_debug('finished declassifying')
      mutils.write_debug(repr(ast),fbase+'.02.dcls.ast')
      mutils.write_debug(ASTPyPrinter().preorder(ast),fbase+'.03.dcls.apy')
    ast.node.nodes += [Discard(CallFunc(Name('gc_collect_all'),[]))]

    ast = UniquifyVisitor().preorder(ast)
    if debug:
      mutils.print_debug('finished uniquifying')