[pypy-svn] r36475 - in pypy/dist/pypy/jit/timeshifter: . test

pedronis at codespeak.net pedronis at codespeak.net
Thu Jan 11 13:53:49 CET 2007


Author: pedronis
Date: Thu Jan 11 13:53:46 2007
New Revision: 36475

Modified:
   pypy/dist/pypy/jit/timeshifter/hrtyper.py
   pypy/dist/pypy/jit/timeshifter/oop.py
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/rvalue.py
   pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
   pypy/dist/pypy/jit/timeshifter/vdict.py
   pypy/dist/pypy/jit/timeshifter/vlist.py
Log:
(arre, pedronis)

- make escaping of virtualizable (getgenvar) schedule them for store_back with test

- more tests that already work about structure pointers inside a virtualizable struct



Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py	Thu Jan 11 13:53:46 2007
@@ -125,8 +125,8 @@
                 if not ll_etype:
                     return       # we known there is no exception set
             evaluebox = jitstate.exc_value_box
-            gv_etype  = etypebox .getgenvar(builder)
-            gv_evalue = evaluebox.getgenvar(builder)
+            gv_etype  = etypebox .getgenvar(jitstate)
+            gv_evalue = evaluebox.getgenvar(jitstate)
             builder.genop_call(tok_raise,
                                gv_rpyexc_raise, [gv_etype, gv_evalue])
         self.store_global_excdata = store_global_excdata
@@ -140,13 +140,13 @@
         def ll_finish_jitstate(jitstate, graphsigtoken):
             assert jitstate.resuming is None
             returnbox = rtimeshift.getreturnbox(jitstate)
-            gv_ret = returnbox.getgenvar(jitstate.curbuilder)
+            gv_ret = returnbox.getgenvar(jitstate)
             builder = jitstate.curbuilder
             for virtualizable_box in jitstate.virtualizables:
                 assert isinstance(virtualizable_box, rvalue.PtrRedBox)
                 content = virtualizable_box.content
                 assert isinstance(content, rcontainer.VirtualizableStruct)
-                content.store_back(builder)        
+                content.store_back(jitstate)        
             store_global_excdata(jitstate)
             jitstate.curbuilder.finish_and_return(graphsigtoken, gv_ret)
         self.ll_finish_jitstate = ll_finish_jitstate
@@ -354,7 +354,7 @@
                     key = key + (x,)
                 else:
                     box = args[i]
-                    args_gv.append(box.getgenvar(curbuilder))
+                    args_gv.append(box.getgenvar(jitstate))
                 i = i + 1
             sigtoken = rgenop.sigToken(FUNC)
             cache = state.cache

Modified: pypy/dist/pypy/jit/timeshifter/oop.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/oop.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/oop.py	Thu Jan 11 13:53:46 2007
@@ -118,7 +118,7 @@
         args_gv = []
         fold = deepfrozen
         for argsrc in self.residualargsources:
-            gv_arg = argboxes[argsrc].getgenvar(builder)
+            gv_arg = argboxes[argsrc].getgenvar(jitstate)
             args_gv.append(gv_arg)
             fold &= gv_arg.is_const
         if fold:

Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py	Thu Jan 11 13:53:46 2007
@@ -85,8 +85,9 @@
         self.null = self.PTRTYPE._defl()
         self.gv_null = RGenOp.constPrebuiltGlobal(self.null)
 
-        if TYPE._hints.get('virtualizable', False):
-            self.__class__ = VirtualizableStructTypeDesc
+
+        self.virtualizable = TYPE._hints.get('virtualizable', False)
+        if self.virtualizable:
             self.VStructCls = VirtualizableStruct
         else:
             self.VStructCls = VirtualStruct
@@ -108,9 +109,13 @@
         return self.fielddesc_by_name[name]
 
     def factory(self):
-        vstruct = VirtualStruct(self)
+        vstruct = self.VStructCls(self)
         vstruct.content_boxes = [desc.redboxcls(desc.kind, desc.gv_default)
                                  for desc in self.fielddescs]
+        if self.virtualizable:
+            outsidebox = rvalue.PtrRedBox(self.innermostdesc.ptrkind,
+                                          self.gv_null)
+            vstruct.content_boxes.append(outsidebox)     
         box = rvalue.PtrRedBox(self.innermostdesc.ptrkind)
         box.content = vstruct
         vstruct.ownbox = box
@@ -125,20 +130,6 @@
 
     def compact_repr(self): # goes in ll helper names
         return "Desc_%s" % (self.TYPE._short_name(),)
-
-class VirtualizableStructTypeDesc(StructTypeDesc):
-    
-    def factory(self):
-        vstruct = VirtualizableStruct(self)
-        vstruct.content_boxes = [desc.redboxcls(desc.kind, desc.gv_default)
-                                 for desc in self.fielddescs]
-        outsidebox = rvalue.PtrRedBox(self.innermostdesc.ptrkind,
-                                      self.gv_null)
-        vstruct.content_boxes.append(outsidebox)
-        box = rvalue.PtrRedBox(self.innermostdesc.ptrkind)
-        box.content = vstruct
-        vstruct.ownbox = box
-        return box
     
 # XXX basic field descs for now
 class FieldDesc(object):
@@ -176,8 +167,8 @@
         gv_item = builder.genop_getfield(self.fieldtoken, genvar)
         return self.redboxcls(self.kind, gv_item)
 
-    def generate_set(self, builder, genvar, box):
-        builder.genop_setfield(self.fieldtoken, genvar, box.getgenvar(builder))
+    def generate_set(self, builder, genvar, gv_value):
+        builder.genop_setfield(self.fieldtoken, genvar, gv_value)
 
     def generate_getsubstruct(self, builder, genvar):
         gv_sub = builder.genop_getsubstruct(self.fieldtoken, genvar)
@@ -271,9 +262,10 @@
             for box in self.content_boxes:
                 box.enter_block(incoming, memo)
 
-    def force_runtime_container(self, builder):
+    def force_runtime_container(self, jitstate):
         typedesc = self.typedesc
         assert typedesc is not None
+        builder = jitstate.curbuilder
         boxes = self.content_boxes
         self.content_boxes = None
         if typedesc.materialize is not None:
@@ -295,7 +287,7 @@
         for i in range(len(fielddescs)):
             fielddesc = fielddescs[i]
             box = boxes[i]
-            fielddesc.generate_set(builder, genvar, box)
+            fielddesc.generate_set(builder, genvar, box.getgenvar(jitstate))
 
     def freeze(self, memo):
         contmemo = memo.containers
@@ -338,27 +330,29 @@
 
 class VirtualizableStruct(VirtualStruct):
 
-    def force_runtime_container(self, builder):
+    def force_runtime_container(self, jitstate):
         assert 0
 
-    def getgenvar(self, builder):
+    def getgenvar(self, jitstate):
         typedesc = self.typedesc
         assert typedesc is not None
+        builder = jitstate.curbuilder
         gv_outside = self.content_boxes[-1].genvar
         if gv_outside is typedesc.gv_null:
             gv_outside = builder.genop_malloc_fixedsize(typedesc.alloctoken)
             self.content_boxes[-1].genvar = gv_outside
-            # xxx jitstate please
+            jitstate.add_virtualizable(self.ownbox)
         return gv_outside
 
-    def store_back(self, builder):
+    def store_back(self, jitstate):
         fielddescs = self.typedesc.fielddescs
         boxes = self.content_boxes
         gv_outside = boxes[-1].genvar
         for i in range(1, len(fielddescs)):
             fielddesc = fielddescs[i]
             box = boxes[i]
-            fielddesc.generate_set(builder, gv_outside, box)
+            fielddesc.generate_set(jitstate.curbuilder, gv_outside,
+                                   box.getgenvar(jitstate))
 
 # ____________________________________________________________
 

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Thu Jan 11 13:53:46 2007
@@ -74,7 +74,7 @@
         arg = rvalue.ll_getvalue(argbox, ARG0)
         res = opdesc.llop(RESULT, arg)
         return rvalue.ll_fromvalue(jitstate, res)
-    gv_arg = argbox.getgenvar(jitstate.curbuilder)
+    gv_arg = argbox.getgenvar(jitstate)
     genvar = jitstate.curbuilder.genop1(opdesc.opname, gv_arg)
     return opdesc.redboxcls(opdesc.result_kind, genvar)
 
@@ -89,13 +89,13 @@
         arg1 = rvalue.ll_getvalue(argbox1, ARG1)
         res = opdesc.llop(RESULT, arg0, arg1)
         return rvalue.ll_fromvalue(jitstate, res)
-    gv_arg0 = argbox0.getgenvar(jitstate.curbuilder)
-    gv_arg1 = argbox1.getgenvar(jitstate.curbuilder)
+    gv_arg0 = argbox0.getgenvar(jitstate)
+    gv_arg1 = argbox1.getgenvar(jitstate)
     genvar = jitstate.curbuilder.genop2(opdesc.opname, gv_arg0, gv_arg1)
     return opdesc.redboxcls(opdesc.result_kind, genvar)
 
 def ll_genmalloc_varsize(jitstate, contdesc, sizebox):
-    gv_size = sizebox.getgenvar(jitstate.curbuilder)
+    gv_size = sizebox.getgenvar(jitstate)
     alloctoken = contdesc.varsizealloctoken
     genvar = jitstate.curbuilder.genop_malloc_varsize(alloctoken, gv_size)
     return rvalue.PtrRedBox(contdesc.ptrkind, genvar)
@@ -125,8 +125,8 @@
         return rvalue.ll_fromvalue(jitstate, res)
     genvar = jitstate.curbuilder.genop_getarrayitem(
         fielddesc.arraytoken,
-        argbox.getgenvar(jitstate.curbuilder),
-        indexbox.getgenvar(jitstate.curbuilder))
+        argbox.getgenvar(jitstate),
+        indexbox.getgenvar(jitstate))
                                                     
     return fielddesc.redboxcls(fielddesc.kind, genvar)
 
@@ -137,8 +137,8 @@
         return rvalue.ll_fromvalue(jitstate, res)
     genvar = jitstate.curbuilder.genop_getarraysubstruct(
         fielddesc.arraytoken,
-        argbox.getgenvar(jitstate.curbuilder),
-        indexbox.getgenvar(jitstate.curbuilder))
+        argbox.getgenvar(jitstate),
+        indexbox.getgenvar(jitstate))
                                                     
     return fielddesc.redboxcls(fielddesc.kind, genvar)
 
@@ -146,9 +146,9 @@
 def ll_gensetarrayitem(jitstate, fielddesc, destbox, indexbox, valuebox):
     genvar = jitstate.curbuilder.genop_setarrayitem(
         fielddesc.arraytoken,
-        destbox.getgenvar(jitstate.curbuilder),
-        indexbox.getgenvar(jitstate.curbuilder),
-        valuebox.getgenvar(jitstate.curbuilder)
+        destbox.getgenvar(jitstate),
+        indexbox.getgenvar(jitstate),
+        valuebox.getgenvar(jitstate)
         )
                                                     
     return fielddesc.redboxcls(fielddesc.kind, genvar)
@@ -160,7 +160,7 @@
         return rvalue.ll_fromvalue(jitstate, res)
     genvar = jitstate.curbuilder.genop_getarraysize(
         fielddesc.arraytoken,
-        argbox.getgenvar(jitstate.curbuilder))
+        argbox.getgenvar(jitstate))
     return rvalue.IntRedBox(fielddesc.indexkind, genvar)
 
 def ll_genptrnonzero(jitstate, argbox, reverse):
@@ -169,7 +169,7 @@
         return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
     builder = jitstate.curbuilder
     if argbox.content is None:
-        gv_addr = argbox.getgenvar(builder)
+        gv_addr = argbox.getgenvar(jitstate)
         if reverse:
             gv_res = builder.genop1("ptr_iszero", gv_addr)
         else:
@@ -187,8 +187,8 @@
         addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)
         addr1 = rvalue.ll_getvalue(argbox1, llmemory.Address)
         return rvalue.ll_fromvalue(jitstate, (addr0 == addr1) ^ reverse)
-    gv_addr0 = argbox0.getgenvar(builder)
-    gv_addr1 = argbox1.getgenvar(builder)
+    gv_addr0 = argbox0.getgenvar(jitstate)
+    gv_addr1 = argbox1.getgenvar(jitstate)
     if reverse:
         gv_res = builder.genop2("ptr_ne", gv_addr0, gv_addr1)
     else:
@@ -260,7 +260,7 @@
         if match:
             linkargs = []
             for box in outgoingvarboxes:
-                linkargs.append(box.getgenvar(jitstate.curbuilder))
+                linkargs.append(box.getgenvar(jitstate))
             jitstate.curbuilder.finish_and_goto(linkargs, oldblock)
             return True    # finished
         # A mergable blook found
@@ -270,7 +270,7 @@
         cleanup_partial_data(memo.partialdatamatch)
         replace_memo = rvalue.copy_memo()
         for box in outgoingvarboxes:
-            box.forcevar(jitstate.curbuilder, replace_memo)
+            box.forcevar(jitstate, replace_memo)
         if replace_memo.boxes:
             jitstate.replace(replace_memo)
         start_new_block(states_dic, jitstate, key, global_resumer, index=i)
@@ -317,7 +317,7 @@
     jitstate.resumepoint = resumepoint
 
 def split(jitstate, switchredbox, resumepoint, *greens_gv):
-    exitgvar = switchredbox.getgenvar(jitstate.curbuilder)
+    exitgvar = switchredbox.getgenvar(jitstate)
     if exitgvar.is_const:
         return exitgvar.revealconst(lltype.Bool)
     else:
@@ -446,7 +446,7 @@
     dispatchqueue.return_chain = jitstate
 
 ##def ll_gvar_from_redbox(jitstate, redbox):
-##    return redbox.getgenvar(jitstate.curbuilder)
+##    return redbox.getgenvar(jitstate)
 
 ##def ll_gvar_from_constant(jitstate, ll_value):
 ##    return jitstate.curbuilder.rgenop.genconst(ll_value)
@@ -464,9 +464,9 @@
 
 def ll_gen_residual_call(jitstate, calldesc, funcbox):
     builder = jitstate.curbuilder
-    gv_funcbox = funcbox.getgenvar(builder)
+    gv_funcbox = funcbox.getgenvar(jitstate)
     argboxes = jitstate.frame.local_boxes
-    args_gv = [argbox.getgenvar(builder) for argbox in argboxes]
+    args_gv = [argbox.getgenvar(jitstate) for argbox in argboxes]
     gv_result = builder.genop_call(calldesc.sigtoken, gv_funcbox, args_gv)
     return calldesc.redboxbuilder(calldesc.result_kind, gv_result)
 
@@ -621,7 +621,7 @@
 
 def ll_promote(jitstate, promotebox, promotiondesc):
     builder = jitstate.curbuilder
-    gv_switchvar = promotebox.getgenvar(builder)
+    gv_switchvar = promotebox.getgenvar(jitstate)
     if gv_switchvar.is_const:
         return False
     else:
@@ -645,7 +645,7 @@
                                [gv_pm, gv_switchvar])
             linkargs = []
             for box in incoming:
-                linkargs.append(box.getgenvar(default_builder))
+                linkargs.append(box.getgenvar(jitstate))
             default_builder.finish_and_goto(linkargs, switchblock)
             return True
         else:
@@ -774,6 +774,7 @@
         for fz_virtualizable_box in self.fz_virtualizables:
             virtualizable_box = fz_virtualizable_box.unfreeze(incomingvarboxes,
                                                               memo)
+            assert isinstance(virtualizable_box, rvalue.PtrRedBox)
             virtualizables[virtualizable_box] = None
         return JITState(None, frame, exc_type_box, exc_value_box,
                         virtualizables=virtualizables)
@@ -837,13 +838,16 @@
         self.virtualizables = virtualizables
 
     def add_virtualizable(self, virtualizable_box):
+        assert isinstance(virtualizable_box, rvalue.PtrRedBox)
         self.virtualizables[virtualizable_box] = None
 
     def split(self, newbuilder, newresumepoint, newgreens):
         memo = rvalue.copy_memo()
         virtualizables = {}
         for virtualizable_box in self.virtualizables:
-            virtualizables[virtualizable_box.copy(memo)] = None
+            new_virtualizable_box = virtualizable_box.copy(memo)
+            assert isinstance(new_virtualizable_box, rvalue.PtrRedBox)
+            virtualizables[new_virtualizable_box] = None
         later_jitstate = JITState(newbuilder,
                                   self.frame.copy(memo),
                                   self.exc_type_box .copy(memo),
@@ -872,10 +876,9 @@
         for virtualizable_box in virtualizables.keys():
             if virtualizable_box.content not in memo.containers:
                 del virtualizables[virtualizable_box]
-                assert isinstance(virtualizable_box, rvalue.PtrRedBox)
                 content = virtualizable_box.content
                 assert isinstance(content, rcontainer.VirtualizableStruct)
-                content.store_back(builder)
+                content.store_back(self)
         return incoming
 
     def freeze(self, memo):
@@ -895,7 +898,9 @@
         self.exc_value_box = self.exc_value_box.replace(memo)
         virtualizables = {}
         for virtualizable_box in self.virtualizables:
-            virtualizables[virtualizable_box.replace(memo)] = None
+            new_virtualizable_box = virtualizable_box.replace(memo)
+            assert isinstance(new_virtualizable_box, rvalue.PtrRedBox)
+            virtualizables[new_virtualizable_box] = None
         self.virtualizables = virtualizables
             
     def get_locals_gv(self): # xxx

Modified: pypy/dist/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rvalue.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rvalue.py	Thu Jan 11 13:53:46 2007
@@ -44,7 +44,7 @@
     def is_constant(self):
         return bool(self.genvar) and self.genvar.is_const
 
-    def getgenvar(self, builder):
+    def getgenvar(self, jitstate):
         return self.genvar
 
     def enter_block(self, incoming, memo):
@@ -53,7 +53,8 @@
             incoming.append(self)
             memo[self] = None
 
-    def forcevar(self, builder, memo):
+    def forcevar(self, jitstate, memo):
+        builder = jitstate.curbuilder
         if self.is_constant():
             # cannot mutate constant boxes in-place
             box = self.copy(memo)
@@ -61,7 +62,7 @@
             return box
         else:
             # force virtual containers
-            self.getgenvar(builder)
+            self.getgenvar(jitstate)
             return self
 
     def replace(self, memo):
@@ -188,7 +189,7 @@
             box = self.content.op_getfield(jitstate, fielddesc)
             if box is not None:
                 return box
-        gv_ptr = self.getgenvar(jitstate.curbuilder)
+        gv_ptr = self.getgenvar(jitstate)
         box = fielddesc.generate_get(jitstate.curbuilder, gv_ptr)
         if fielddesc.immutable:
             self.remember_field(fielddesc, box)
@@ -197,7 +198,8 @@
     def op_setfield(self, jitstate, fielddesc, valuebox):
         gv_ptr = self.genvar
         if gv_ptr:
-            fielddesc.generate_set(jitstate.curbuilder, gv_ptr, valuebox)
+            fielddesc.generate_set(jitstate.curbuilder, gv_ptr,
+                                   valuebox.getgenvar(jitstate))
         else:
             assert self.content is not None
             self.content.op_setfield(jitstate, fielddesc, valuebox)
@@ -270,22 +272,22 @@
             boxmemo[self] = result
             return result
 
-    def getgenvar(self, builder):
+    def getgenvar(self, jitstate):
         if not self.genvar:
             content = self.content
             from pypy.jit.timeshifter import rcontainer
             if isinstance(content, rcontainer.VirtualizableStruct):
-                return content.getgenvar(builder)
+                return content.getgenvar(jitstate)
             assert isinstance(content, rcontainer.VirtualContainer)
-            content.force_runtime_container(builder)
+            content.force_runtime_container(jitstate)
             assert self.genvar
         return self.genvar
 
-    def forcevar(self, builder, memo):
+    def forcevar(self, jitstate, memo):
         from pypy.jit.timeshifter import rcontainer
         # xxx
         assert not isinstance(self.content, rcontainer.VirtualizableStruct)
-        return RedBox.forcevar(self, builder, memo)
+        return RedBox.forcevar(self, jitstate, memo)
 
     def enter_block(self, incoming, memo):
         if self.genvar:

Modified: pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	Thu Jan 11 13:53:46 2007
@@ -3,15 +3,35 @@
 
 import py
 
+S = lltype.GcStruct('s', ('a', lltype.Signed), ('b', lltype.Signed))
+PS = lltype.Ptr(S)
+
 XY = lltype.GcForwardReference()
-GETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY)], lltype.Signed))
-SETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY), lltype.Signed],
-                                    lltype.Void))
-XY_ACCESS = lltype.Struct('xy',
-                          ('get_x', GETTER),
-                          ('set_x', SETTER),
-                          ('get_y', GETTER),
-                          ('set_y', SETTER),
+GETTER = lambda STRUC: lltype.Ptr(lltype.FuncType([lltype.Ptr(STRUC)],
+                                                  lltype.Signed))
+SETTER = lambda STRUC: lltype.Ptr(lltype.FuncType([lltype.Ptr(STRUC),
+                                                  lltype.Signed],
+                                                 lltype.Void))
+
+XP = lltype.GcForwardReference()
+PGETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XP)], PS))
+PSETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XP), PS],
+                                   lltype.Void))
+
+XY_ACCESS = lltype.Struct('xy_access',
+                          ('get_x', GETTER(XY)),
+                          ('set_x', SETTER(XY)),
+                          ('get_y', GETTER(XY)),
+                          ('set_y', SETTER(XY)),
+                          hints = {'immutable': True},
+                          )
+
+
+XP_ACCESS = lltype.Struct('xp_access',
+                          ('get_x', GETTER(XP)),
+                          ('set_x', SETTER(XP)),
+                          ('get_p', PGETTER),
+                          ('set_p', PSETTER),
                           hints = {'immutable': True},
                           )
 
@@ -21,6 +41,14 @@
                           ('y', lltype.Signed),
                           hints = {'virtualizable': True}
               ))
+
+XP.become(lltype.GcStruct('xp',
+                          ('access', lltype.Ptr(XP_ACCESS)),
+                          ('x', lltype.Signed),
+                          ('p', PS),
+                          hints = {'virtualizable': True}
+              ))
+
      
 class TestVirtualizable(PortalTest):
 
@@ -216,7 +244,6 @@
         self.check_insns(getfield=0)
 
     def test_simple_explicit_construct_escape(self):
-        py.test.skip("in-progress")
    
         def f(x, y):
             xy = lltype.malloc(XY)
@@ -242,3 +269,139 @@
         res = self.timeshift_from_portal(main, f, [20, 22], policy=P_NOVIRTUAL)
         assert res == 42
         self.check_insns(getfield=0)
+
+    def test_simple_with_struct_explicit(self):
+   
+        def f(xp):
+            xp_access = xp.access
+            if xp_access:
+                x = xp_access.get_x(xp)
+            else:
+                x = xp.x
+            xp_access = xp.access
+            if xp_access:
+                p = xp_access.get_p(xp)
+            else:
+                p = xp.p
+            return x+p.a+p.b
+
+        def main(x, a, b):
+            xp = lltype.malloc(XP)
+            xp.access = lltype.nullptr(XP_ACCESS)
+            xp.x = x
+            s = lltype.malloc(S)
+            s.a = a
+            s.b = b
+            xp.p = s
+            return f(xp)
+
+        res = self.timeshift_from_portal(main, f, [20, 10, 12],
+                                         policy=P_NOVIRTUAL)
+        assert res == 42
+        self.check_insns(getfield=2)    
+
+    def test_simple_with_setting_struct_explicit(self):
+   
+        def f(xp, s):
+            xp_access = xp.access
+            if xp_access:
+                xp_access.set_p(xp, s)
+            else:
+                xp.p = s
+            if xp_access:
+                x = xp_access.get_x(xp)
+            else:
+                x = xp.x
+            xp_access = xp.access
+            if xp_access:
+                p = xp_access.get_p(xp)
+            else:
+                p = xp.p
+            p.b = p.b*2
+            return x+p.a+p.b
+
+        def main(x, a, b):
+            xp = lltype.malloc(XP)
+            xp.access = lltype.nullptr(XP_ACCESS)
+            xp.x = x
+            s = lltype.malloc(S)
+            s.a = a
+            s.b = b
+            v = f(xp, s)
+            return v+xp.p.b
+
+        res = self.timeshift_from_portal(main, f, [20, 10, 3],
+                                         policy=P_NOVIRTUAL)
+        assert res == 42
+        self.check_insns(getfield=3)
+
+    def test_simple_with_setting_new_struct_explicit(self):
+   
+        def f(xp, a, b):
+            s = lltype.malloc(S)
+            s.a = a
+            s.b = b            
+            xp_access = xp.access
+            if xp_access:
+                xp_access.set_p(xp, s)
+            else:
+                xp.p = s
+            xp_access = xp.access
+            if xp_access:
+                p = xp_access.get_p(xp)
+            else:
+                p = xp.p
+            p.b = p.b*2
+            if xp_access:
+                x = xp_access.get_x(xp)
+            else:
+                x = xp.x
+            return x+p.a+p.b
+
+        def main(x, a, b):
+            xp = lltype.malloc(XP)
+            xp.access = lltype.nullptr(XP_ACCESS)
+            xp.x = x
+            v = f(xp, a, b)
+            return v+xp.p.b
+
+        res = self.timeshift_from_portal(main, f, [20, 10, 3],
+                                         policy=P_NOVIRTUAL)
+        assert res == 42
+        self.check_insns(getfield=2, malloc=1)
+
+
+    def test_simple_constr_with_setting_new_struct_explicit(self):
+   
+        def f(x, a, b):
+            xp = lltype.malloc(XP)
+            xp.access = lltype.nullptr(XP_ACCESS)
+            xp.x = x
+            s = lltype.malloc(S)
+            s.a = a
+            s.b = b            
+            xp_access = xp.access
+            if xp_access:
+                xp_access.set_p(xp, s)
+            else:
+                xp.p = s
+            xp_access = xp.access
+            if xp_access:
+                p = xp_access.get_p(xp)
+            else:
+                p = xp.p
+            p.b = p.b*2
+            if xp_access:
+                x = xp_access.get_x(xp)
+            else:
+                x = xp.x
+            return xp
+
+        def main(x, a, b):
+            xp = f(x, a, b)
+            return xp.x+xp.p.a+xp.p.b+xp.p.b
+
+        res = self.timeshift_from_portal(main, f, [20, 10, 3],
+                                         policy=P_NOVIRTUAL)
+        assert res == 42
+        self.check_insns(getfield=0, malloc=2)

Modified: pypy/dist/pypy/jit/timeshifter/vdict.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vdict.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/vdict.py	Thu Jan 11 13:53:46 2007
@@ -199,8 +199,9 @@
             for box in self.getboxes():
                 box.enter_block(incoming, memo)
 
-    def force_runtime_container(self, builder):
+    def force_runtime_container(self, jitstate):
         typedesc = self.typedesc
+        builder = jitstate.curbuilder
         items = self.getitems_and_makeempty(builder.rgenop)
 
         args_gv = []
@@ -211,7 +212,7 @@
         self.ownbox.content = None
         for gv_key, valuebox, hash in items:
             gv_hash = builder.rgenop.genconst(hash)
-            gv_value = valuebox.getgenvar(builder)
+            gv_value = valuebox.getgenvar(jitstate)
             args_gv = [gv_dict, gv_key, gv_value, gv_hash]
             builder.genop_call(typedesc.tok_ll_insertclean,
                                typedesc.gv_ll_insertclean,

Modified: pypy/dist/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vlist.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/vlist.py	Thu Jan 11 13:53:46 2007
@@ -107,8 +107,9 @@
             for box in self.item_boxes:
                 box.enter_block(incoming, memo)
 
-    def force_runtime_container(self, builder):
+    def force_runtime_container(self, jitstate):
         typedesc = self.typedesc
+        builder = jitstate.curbuilder
         boxes = self.item_boxes
         self.item_boxes = None
 
@@ -119,7 +120,7 @@
         self.ownbox.genvar = gv_list
         self.ownbox.content = None
         for i in range(len(boxes)):
-            gv_item = boxes[i].getgenvar(builder)
+            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,



More information about the Pypy-commit mailing list