Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77580:f0a9e04de1bd
Date: 2015-05-26 14:57 +0200
http://bitbucket.org/pypy/pypy/changeset/f0a9e04de1bd/

Log:    finish with vref I hope

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -97,7 +97,10 @@
             assert optheap.getptrinfo(op.getarg(0)) is opinfo
             return optheap.get_box_replacement(self._getvalue(op))
         else:
-            return self._getfield(opinfo, descr, optheap)
+            res = self._getfield(opinfo, descr, optheap)
+            if res is not None:
+                return res.get_box_replacement()
+            return None
 
     def _getvalue(self, op):
         return op.getarg(1)
diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -134,10 +134,13 @@
             return
         lst = self.vdescr.all_fielddescrs
         assert self.is_virtual()
-        visitor.register_virtual_fields(instbox, [box for box in self._fields])
+        visitor.register_virtual_fields(instbox,
+                                        [optimizer.get_box_replacement(box)
+                                         for box in self._fields])
         for i in range(len(lst)):
             op = self._fields[i]
             if op and op.type == 'r':
+                op = op.get_box_replacement()
                 fieldinfo = optimizer.getptrinfo(op)
                 if fieldinfo and fieldinfo.is_virtual():
                     fieldinfo.visitor_walk_recursive(op, visitor, optimizer)
@@ -223,7 +226,8 @@
         return self.length
 
     def visitor_walk_recursive(self, instbox, visitor, optimizer):
-        itemops = [item for item in self._items if item]
+        itemops = [optimizer.get_box_replacement(item)
+                   for item in self._items if item]
         visitor.register_virtual_fields(instbox, itemops)
         for i in range(self.getlength()):
             itemop = self._items[i]
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -530,13 +530,9 @@
     ##     return value
 
     def get_box_replacement(self, op):
-        orig_op = op
-        while (op.get_forwarded() is not None and
-               not op.get_forwarded().is_info_class):
-            op = op.get_forwarded()
-        if op is not orig_op:
-            orig_op.set_forwarded(op)
-        return op
+        if op is None:
+            return op
+        return op.get_box_replacement()
 
     def force_box(self, op):
         op = self.get_box_replacement(op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -3168,9 +3168,9 @@
         expected = """
         [i1]
         p3 = force_token()
-        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p3, descr=virtualtokendescr)
         escape_n(p2)
         p1 = new_with_vtable(descr=nodesize)
         setfield_gc(p2, p1, descr=virtualforceddescr)
@@ -3194,9 +3194,9 @@
         expected = """
         [i1, p1]
         p3 = force_token()
-        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p3, descr=virtualtokendescr)
         escape_n(p2)
         setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p2, NULL, descr=virtualtokendescr)
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -25,6 +25,15 @@
     def set_forwarded(self, forwarded_to):
         raise Exception("oups")
 
+    def get_box_replacement(op):
+        orig_op = op
+        while (op.get_forwarded() is not None and
+               not op.get_forwarded().is_info_class):
+            op = op.get_forwarded()
+        if op is not orig_op:
+            orig_op.set_forwarded(op)
+        return op
+
 DONT_CHANGE = AbstractValue()
 
 def ResOperation(opnum, args, descr=None):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to