[pypy-svn] r53239 - in pypy/branch/jit-hotpath/pypy/jit: codegen codegen/llgraph rainbow/test timeshifter

antocuni at codespeak.net antocuni at codespeak.net
Tue Apr 1 23:51:56 CEST 2008


Author: antocuni
Date: Tue Apr  1 23:51:55 2008
New Revision: 53239

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py
   pypy/branch/jit-hotpath/pypy/jit/codegen/model.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py
Log:
implement forcing for virtual lists on ootype. 
test_force passes



Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py	Tue Apr  1 23:51:55 2008
@@ -146,10 +146,8 @@
                                     gv_Bool.v))
         return gv_res, gv_exc
 
-    def genop_call(self, (ARGS_gv, gv_RESULT, _), gv_callable, args_gv):
-        ll_assert(self.rgenop.currently_writing is self,
-                     "genop_call: bad currently_writing")
-        vars_gv = [gv_callable]
+    def _cast_args_gv(self, ARGS_gv, args_gv):
+        vars_gv = []
         j = 0
         for i in range(len(ARGS_gv)):
             if ARGS_gv[i] is gv_Void:
@@ -158,6 +156,13 @@
                 gv_arg = LLVar(llimpl.cast(self.b, ARGS_gv[i].v, args_gv[j].v))
                 j += 1
             vars_gv.append(gv_arg)
+        return vars_gv
+
+    def genop_call(self, (ARGS_gv, gv_RESULT, _), gv_callable, args_gv):
+        ll_assert(self.rgenop.currently_writing is self,
+                     "genop_call: bad currently_writing")
+        vars_gv = [gv_callable]
+        vars_gv += self._cast_args_gv(ARGS_gv, args_gv)
         if gv_callable.is_const:
             v = llimpl.genop(self.b, 'direct_call', vars_gv, gv_RESULT.v)
         else:
@@ -165,6 +170,14 @@
             v = llimpl.genop(self.b, 'indirect_call', vars_gv, gv_RESULT.v)
         return LLVar(v)
 
+    def genop_oosend(self, (gv_methname, (ARGS_gv, gv_RESULT, _)), gv_self, args_gv):
+        ll_assert(self.rgenop.currently_writing is self,
+                     "genop_oosend: bad currently_writing")
+        vars_gv = [gv_methname, gv_self]
+        vars_gv += self._cast_args_gv(ARGS_gv, args_gv)
+        v = llimpl.genop(self.b, 'oosend', vars_gv, gv_RESULT.v)
+        return LLVar(v)
+
     def genop_getfield(self, (gv_name, gv_PTRTYPE, gv_FIELDTYPE), gv_ptr):
         ll_assert(self.rgenop.currently_writing is self,
                      "genop_getfield: bad currently_writing")
@@ -459,6 +472,14 @@
                 gv_TYPE(FUNCTYPE.RESULT),
                 gv_TYPE(FUNCTYPE))
 
+    @staticmethod
+    @specialize.memo()
+    def methToken(TYPE, methname):
+        _, meth = TYPE._lookup(methname)
+        METH = ootype.typeOf(meth)
+        gv_methname = LLConst(llimpl.constFieldName(methname))
+        return (gv_methname, RGenOp.sigToken(METH))
+
     constPrebuiltGlobal = genconst
 
     @staticmethod

Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/model.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/model.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/model.py	Tue Apr  1 23:51:55 2008
@@ -349,6 +349,12 @@
     #    raise NotImplementedError
 
     #@staticmethod
+    #@specialize.memo()
+    #def methToken(TYPE, methname):
+    #    """Return a token describing the method methname of type TYPE."""
+    #    raise NotImplementedError
+
+    #@staticmethod
     #@specialize.arg(0)
     #def read_frame_var(T, base, info, index):
     #    """Read from the stack frame of a caller.  The 'base' is the

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py	Tue Apr  1 23:51:55 2008
@@ -195,7 +195,6 @@
     def _skip(self):
         py.test.skip('in progress')
 
-    test_force = _skip
     test_oop_vlist = _skip
     test_alloc_and_set = _skip
     test_lists_deepfreeze = _skip

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py	Tue Apr  1 23:51:55 2008
@@ -115,6 +115,16 @@
 
         self.devirtualize = make, fill_into
 
+    def gen_newlist(self, builder, args_gv):
+        return builder.genop_call(self.tok_ll_newlist,
+                                  self.gv_ll_newlist,
+                                  args_gv)
+
+    def gen_setitem_fast(self, builder, args_gv):
+        return builder.genop_call(self.tok_ll_setitem_fast,
+                                  self.gv_ll_setitem_fast,
+                                  args_gv)
+
         
 
 class OOTypeListTypeDesc(AbstractListTypeDesc):
@@ -123,11 +133,24 @@
     PtrRedBox = rvalue.InstanceRedBox
 
     def _setup(self, RGenOp, rtyper, LIST):
-        pass
+        self.alloctoken = RGenOp.allocToken(LIST)
+        self.tok_ll_resize = RGenOp.methToken(LIST, '_ll_resize')
+        self.tok_ll_setitem_fast = RGenOp.methToken(LIST,
+                                                    'll_setitem_fast')
 
     def _define_devirtualize(self):
         pass # XXX
 
+    def gen_newlist(self, builder, args_gv):
+        gv_lst = builder.genop_new(self.alloctoken)
+        builder.genop_oosend(self.tok_ll_resize, gv_lst, args_gv)
+        return gv_lst
+
+    def gen_setitem_fast(self, builder, args_gv):
+        gv_lst = args_gv.pop(0)
+        return builder.genop_oosend(self.tok_ll_setitem_fast,
+                                    gv_lst, args_gv)
+
 class FrozenVirtualList(FrozenContainer):
 
     def __init__(self, typedesc):
@@ -211,17 +234,13 @@
 
         debug_print(lltype.Void, "FORCE LIST (%d items)" % (len(boxes),))
         args_gv = [builder.rgenop.genconst(len(boxes))]
-        gv_list = builder.genop_call(typedesc.tok_ll_newlist,
-                                     typedesc.gv_ll_newlist,
-                                     args_gv)
+        gv_list = typedesc.gen_newlist(builder, args_gv)
         self.setforced(gv_list)
 
         for i in range(len(boxes)):
             gv_item = boxes[i].getgenvar(jitstate)
             args_gv = [gv_list, builder.rgenop.genconst(i), gv_item]
-            builder.genop_call(typedesc.tok_ll_setitem_fast,
-                               typedesc.gv_ll_setitem_fast,
-                               args_gv)
+            typedesc.gen_setitem_fast(builder, args_gv)
 
     def freeze(self, memo):
         contmemo = memo.containers



More information about the Pypy-commit mailing list