import autopath from pypy.translator.translator import Translator from pypy.objspace.flow.model import Variable, Constant, Block, Link from pypy.objspace.flow.model import traverse, mkentrymap, checkgraph def valueset_variables(graph): entrymap = mkentrymap(graph) consider_blocks = entrymap while consider_blocks: blocklist = consider_blocks.keys() consider_blocks = {} for block in blocklist: if block is graph.startblock: continue links = entrymap[block] assert links mapping = {} for i in range(len(block.inputargs)): # list of possible vars that can arrive in i'th position v1 = block.inputargs[i] names = {v1.name: True} key = [] for link in links: v = link.args[i] if not isinstance(v, Variable): break names[v.name] = True else: if len(names) == 2: del names[v1.name] v1._name, = names.keys() # mark all the following block as subject to # possible further optimization for link in block.exits: consider_blocks[link.target] = True # ____________________________________________________________ if __name__ == '__main__': def is_perfect_number(n=int): div = 1 sum = 0 while div < n: if n % div == 0: sum += div div += 1 return n == sum t = Translator(is_perfect_number) #a = t.annotate([int]) #a.simplify() #a.specialize() valueset_variables(t.getflowgraph()) t.view() #f = t.ccompile() #for i in range(1, 33): # print '%3d' % i, is_perfect_number(i)