[pypy-svn] r18686 - in pypy/dist/pypy/rpython/l3interp: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Sun Oct 16 14:51:42 CEST 2005
Author: cfbolz
Date: Sun Oct 16 14:51:40 2005
New Revision: 18686
Added:
pypy/dist/pypy/rpython/l3interp/convertgraph.py
pypy/dist/pypy/rpython/l3interp/test/test_convert.py
Log:
(cfbolz and bits of pedronis and valentino):
start of a graph converter, that can convert very simple graphs + test
Added: pypy/dist/pypy/rpython/l3interp/convertgraph.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/l3interp/convertgraph.py Sun Oct 16 14:51:40 2005
@@ -0,0 +1,86 @@
+from pypy.rpython.l3interp import model
+from pypy.rpython.l3interp import l3interp
+from pypy.objspace.flow import model as flowmodel
+
+def convert(t):
+ cvter = LL2L3Converter(t)
+ return cvter.globals
+
+class LL2L3Converter(object):
+ def __init__(self, t):
+ self.translator = t
+ self.globals = model.Globals()
+ self.convert_graph(t.getflowgraph())
+
+ def convert_graph(self, graph):
+ graph_cvter = LL2L3GraphConverter(graph, self)
+ l3graph = graph_cvter.l3graph
+ self.globals.graphs.append(l3graph)
+ return l3graph
+
+class LL2L3GraphConverter(object):
+ def __init__(self, graph, cvter):
+ self.cvter = cvter
+ self.graph = graph
+ self.blocks_ll2l3 = {}
+ self.constants_to_index = {}
+ self.constants = []
+ startlink = self.convert_startlink(graph.startblock)
+ self.l3graph = model.Graph(graph.name, startlink)
+ self.l3graph.constants_int = self.constants
+
+ def convert_startlink(self, block):
+ var_to_register = dict([(var, i)
+ for i, var in enumerate(block.inputargs)])
+ target = self.convert_block(block, var_to_register)
+ startlink = model.Link(target)
+ startlink.move_int_register = [i // 2
+ for i in range(len(block.inputargs) * 2)]
+ return startlink
+
+ def convert_block(self, block, var_to_register):
+ if block in self.blocks_ll2l3:
+ return self.blocks_ll2l3[block]
+ def get_reg_number(var):
+ if var not in var_to_register:
+ var_to_register[var] = len(var_to_register)
+ return var_to_register[var]
+ l3ops = []
+ for op in block.operations:
+ l3ops.append(self.convert_op(op, get_reg_number))
+ assert block.exitswitch is None
+ l3block = model.Block()
+ self.blocks_ll2l3[block] = l3block
+ l3block.exitswitch = model.ONE_EXIT
+ l3block.exits = [self.convert_link(block.exits[0], var_to_register)]
+ l3block.operations = l3ops
+ return l3block
+
+ def convert_link(self, link, var_to_register):
+ if link.target is self.graph.returnblock:
+ l3link = model.ReturnLink(var_to_register[link.args[0]])
+ return l3link
+ assert 0, "not yet implemented"
+
+ def convert_op(self, op, get_reg_number):
+ c_op = getattr(self, "op_" + op.opname, None)
+ if c_op is not None:
+ return c_op(op, get_reg_number)
+ l3args = []
+ for arg in op.args:
+ if isinstance(arg, flowmodel.Variable):
+ l3args.append(get_reg_number(arg))
+ else:
+ l3args.append(self.convert_const(arg))
+ l3op = model.Operation(getattr(l3interp.LLFrame, "op_" + op.opname),
+ get_reg_number(op.result), l3args)
+ return l3op
+
+ def convert_const(self, arg):
+ arg = int(arg.value)
+ if arg in self.constants_to_index:
+ return self.constants_to_index[arg]
+ index = len(self.constants)
+ self.constants.append(arg)
+ self.constants_to_index[arg] = index
+ return ~index
Added: pypy/dist/pypy/rpython/l3interp/test/test_convert.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/l3interp/test/test_convert.py Sun Oct 16 14:51:40 2005
@@ -0,0 +1,14 @@
+from pypy.rpython.l3interp import convertgraph, l3interp
+from pypy.translator.translator import Translator
+
+def test_convert_add():
+ def f(x):
+ return x + 4
+ t = Translator(f)
+ t.annotate([int])
+ t.specialize()
+ globals = convertgraph.convert(t)
+ interp = l3interp.LLInterpreter(globals)
+ graph = globals.graphs[0]
+ result = interp.eval_graph_int(graph, [0])
+ assert result == 4
More information about the Pypy-commit
mailing list