[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