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

pedronis at codespeak.net pedronis at codespeak.net
Mon Mar 19 19:03:09 CET 2007


Author: pedronis
Date: Mon Mar 19 19:03:09 2007
New Revision: 40790

Modified:
   pypy/dist/pypy/jit/TODO.txt
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
   pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
Log:
this one is done



Modified: pypy/dist/pypy/jit/TODO.txt
==============================================================================
--- pypy/dist/pypy/jit/TODO.txt	(original)
+++ pypy/dist/pypy/jit/TODO.txt	Mon Mar 19 19:03:09 2007
@@ -6,8 +6,6 @@
 
 - improve is_true()
 
-- some --jit option for translate.py
-
 - basic docs and examples
 
 - check that --jit works with --faassen; don't stop at

Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py	Mon Mar 19 19:03:09 2007
@@ -200,12 +200,13 @@
     VirtualStructCls = None # patched later with VirtualizableStruct
 
     _attrs_  =  """redirected_fielddescs
-                    base_desc rti_desc access_desc
-                    gv_access
-                    touch_update
-                    gv_access_is_null_ptr access_is_null_token
-                    get_rti set_rti
-                 """.split()
+                   redirected
+                   base_desc rti_desc access_desc
+                   gv_access
+                   touch_update
+                   gv_access_is_null_ptr access_is_null_token
+                   get_rti set_rti
+                """.split()
 
     def __init__(self, hrtyper, TYPE):
         RGenOp = hrtyper.RGenOp
@@ -213,10 +214,12 @@
         ACCESS = self.TYPE.ACCESS
         redirected_fields = ACCESS.redirected_fields
         self.redirected_fielddescs = []
+        self.redirected = {}
         i = 0
         for fielddesc in self.fielddescs:
             if fielddesc.fieldname in redirected_fields:
                 self.redirected_fielddescs.append((fielddesc, i))
+                self.redirected[i] = None
             i += 1
         self.base_desc = self.getfielddesc('vable_base')
         self.rti_desc = self.getfielddesc('vable_rti')
@@ -804,6 +807,28 @@
                         continue
                 boxes[i] = fielddesc.generate_get(jitstate, gv_outside)
 
+    def op_getfield(self, jitstate, fielddesc):
+        typedesc = self.typedesc
+        assert isinstance(typedesc, VirtualizableStructTypeDesc)        
+        fieldindex = fielddesc.fieldindex
+        if fieldindex in typedesc.redirected:
+            return self.content_boxes[fielddesc.fieldindex]
+        else:
+            gv_ptr = self.getgenvar(jitstate)
+            box = fielddesc.generate_get(jitstate, gv_ptr)
+            return box
+        
+    def op_setfield(self, jitstate, fielddesc, valuebox):
+        typedesc = self.typedesc
+        assert isinstance(typedesc, VirtualizableStructTypeDesc)
+        fieldindex = fielddesc.fieldindex
+        if fieldindex in typedesc.redirected:
+            self.content_boxes[fielddesc.fieldindex] = valuebox
+        else:
+            gv_ptr = self.getgenvar(jitstate)
+            fielddesc.generate_set(jitstate, gv_ptr,
+                                   valuebox.getgenvar(jitstate))
+            
 
 # patching VirtualStructCls
 StructTypeDesc.VirtualStructCls = VirtualStruct

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	Mon Mar 19 19:03:09 2007
@@ -759,6 +759,43 @@
         assert res == 42
         self.check_insns(getfield=0)
 
+    def test_simple__class__(self):
+        class V(object):
+            _virtualizable_ = True
+            def __init__(self, a):
+                self.a = a
+
+        class V1(V):
+            def __init__(self, b):
+                V.__init__(self, 1)
+                self.b = b
+
+        class V2(V):
+            def __init__(self):
+                V.__init__(self, 2)
+
+        def f(v):
+            hint(None, global_merge_point=True)
+            #V1(0).b
+            return v.__class__
+
+        def main(x, y):
+            if x:
+                v = V1(42)
+            else:
+                v = V2()
+            if y:
+                c = None
+            else:
+                c = f(v)
+            V2()
+            return c is not None
+
+        res = self.timeshift_from_portal(main, f, [0, 1], policy=P_OOPSPEC)
+        assert not res
+        res = self.timeshift_from_portal(main, f, [1, 0], policy=P_OOPSPEC)
+        assert res
+
     def test_simple_inheritance(self):
 
         class X(object):



More information about the Pypy-commit mailing list