[pypy-svn] r37324 - in pypy/dist/pypy/jit/codegen/llgraph: . test
ac at codespeak.net
ac at codespeak.net
Thu Jan 25 13:19:33 CET 2007
Author: ac
Date: Thu Jan 25 13:19:32 2007
New Revision: 37324
Modified:
pypy/dist/pypy/jit/codegen/llgraph/llimpl.py
pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
Log:
(arre, pedronis)
fix same_as in the llgraph backend to really return a variable in the graph
sense.
support for writing back into frames on the llgraph backend with test.
Modified: pypy/dist/pypy/jit/codegen/llgraph/llimpl.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/llimpl.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/llimpl.py Thu Jan 25 13:19:32 2007
@@ -608,3 +608,13 @@
_callable=read_frame_var)
cfunc = hop.inputconst(lltype.Ptr(FUNCTYPE), funcptr)
return hop.genop('direct_call', [cfunc] + args_v, hop.r_result)
+
+def write_frame_var(base, info, index, value):
+ vars = info._obj.info.args
+ v = vars[index]
+ assert isinstance(v, flowmodel.Variable)
+ llframe = base.ptr
+ llframe.setvar(v, value)
+
+
+setannotation(write_frame_var, None)
Modified: pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/rgenop.py Thu Jan 25 13:19:32 2007
@@ -193,7 +193,7 @@
def genop_same_as(self, gv_TYPE, gv_value):
debug_assert(self.rgenop.currently_writing is self,
"genop_same_as: bad currently_writing")
- return LLVar(gv_value.v)
+ return LLVar(llimpl.genop(self.b, 'same_as', [gv_value], gv_TYPE.v))
def _newblock(self, kinds):
self.b = newb = llimpl.newblock()
@@ -370,5 +370,10 @@
def read_frame_var(T, base, info, index):
return llimpl.read_frame_var(T, base, info, index)
+ @staticmethod
+ @specialize.arg(0)
+ def write_frame_var(T, base, info, index, value):
+ llimpl.write_frame_var(base, info, index, value)
+
rgenop = RGenOp() # no real point in using a full class in llgraph
Modified: pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py Thu Jan 25 13:19:32 2007
@@ -58,6 +58,41 @@
res = testgengraph(ptr._obj.graph, [21])
assert res == 42
+def test_write_frame_var():
+ from pypy.annotation import model as annmodel
+
+ def writer(base, info, value):
+ RGenOp.write_frame_var(lltype.Signed, base, info, 0, value)
+
+ t, rtyper, writer_graph = gengraph(writer,
+ [annmodel.SomeAddress(),
+ annmodel.SomePtr(llmemory.GCREF),
+ annmodel.SomeInteger()])
+ writer_ptr = rtyper.getcallable(writer_graph)
+
+ F1 = lltype.FuncType([lltype.Signed], lltype.Signed)
+ rgenop = RGenOp()
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(F1)
+ gv_writer = RGenOp.constPrebuiltGlobal(writer_ptr)
+ writertoken = rgenop.sigToken(lltype.typeOf(writer_ptr).TO)
+
+ builder, gv_f, [gv_x] = rgenop.newgraph(sigtoken, "f")
+ builder.start_writing()
+
+ gv_y = builder.genop_same_as(signed_kind, rgenop.genconst(0))
+ gv_base = builder.genop_get_frame_base()
+ info = builder.get_frame_info([gv_y])
+ gv_info = RGenOp.constPrebuiltGlobal(info)
+ gv_42 = rgenop.genconst(42)
+ builder.genop_call(writertoken, gv_writer, [gv_base, gv_info, gv_42])
+ builder.finish_and_return(sigtoken, gv_y)
+ builder.end()
+
+ ptr = gv_f.revealconst(lltype.Ptr(F1))
+ res = testgengraph(ptr._obj.graph, [-1])
+ assert res == 42
+
def test_not_calling_end_explodes():
F1 = lltype.FuncType([lltype.Signed], lltype.Signed)
rgenop = RGenOp()
More information about the pypy-svn
mailing list