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