[pypy-commit] pypy optimizeopt-cleanup: Replace method Optimization.getptrinfo() with function getptrinfo()

rlamy pypy.commits at gmail.com
Wed May 15 10:52:50 EDT 2019


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: optimizeopt-cleanup
Changeset: r96621:4d02009079d2
Date: 2019-05-15 15:51 +0100
http://bitbucket.org/pypy/pypy/changeset/4d02009079d2/

Log:	Replace method Optimization.getptrinfo() with function getptrinfo()

diff --git a/rpython/jit/metainterp/optimizeopt/bridgeopt.py b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
--- a/rpython/jit/metainterp/optimizeopt/bridgeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
@@ -3,6 +3,7 @@
 
 from rpython.jit.metainterp import resumecode
 from rpython.jit.metainterp.history import Const, ConstInt, CONST_NULL
+from .info import getptrinfo
 
 
 # adds the following sections at the end of the resume code:
@@ -75,7 +76,7 @@
     for box in liveboxes:
         if box is None or box.type != "r":
             continue
-        info = optimizer.getptrinfo(box)
+        info = getptrinfo(box)
         known_class = info is not None and info.get_known_class(optimizer.cpu) is not None
         bitfield <<= 1
         bitfield |= known_class
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
@@ -61,36 +61,28 @@
             info.produce_short_preamble_ops(structbox, descr, index, optimizer,
                                             shortboxes)
 
-    def possible_aliasing(self, optheap, opinfo):
+    def possible_aliasing(self, opinfo):
         # If lazy_set is set and contains a setfield on a different
         # structvalue, then we are annoyed, because it may point to either
         # the same or a different structure at runtime.
         # XXX constants?
         return (self._lazy_set is not None
-                and (not optheap.getptrinfo(
-                    self._lazy_set.getarg(0)).same_info(opinfo)))
+            and not info.getptrinfo(self._lazy_set.getarg(0)).same_info(opinfo))
 
     def do_setfield(self, optheap, op):
         # Update the state with the SETFIELD_GC/SETARRAYITEM_GC operation 'op'.
         structinfo = optheap.ensure_ptr_info_arg0(op)
         arg1 = get_box_replacement(self._get_rhs_from_set_op(op))
-        if self.possible_aliasing(optheap, structinfo):
+        if self.possible_aliasing(structinfo):
             self.force_lazy_set(optheap, op.getdescr())
-            assert not self.possible_aliasing(optheap, structinfo)
+            assert not self.possible_aliasing(structinfo)
         cached_field = self._getfield(structinfo, op.getdescr(), optheap, False)
         if cached_field is not None:
             cached_field = cached_field.get_box_replacement()
 
-        # Hack to ensure constants are imported from the preamble
-        # XXX no longer necessary?
-        #if cached_fieldvalue and fieldvalue.is_constant():
-        #    optheap.optimizer.ensure_imported(cached_fieldvalue)
-        #    cached_fieldvalue = self._cached_fields.get(structvalue, None)
-
         if not cached_field or not cached_field.same_box(arg1):
             # common case: store the 'op' as lazy_set
             self._lazy_set = op
-
         else:
             # this is the case where the pending setfield ends up
             # storing precisely the value that is already there,
@@ -105,7 +97,7 @@
 
     def getfield_from_cache(self, optheap, opinfo, descr):
         # Returns the up-to-date field's value, or None if not cached.
-        if self.possible_aliasing(optheap, opinfo):
+        if self.possible_aliasing(opinfo):
             self.force_lazy_set(optheap, descr)
         if self._lazy_set is not None:
             op = self._lazy_set
@@ -526,7 +518,7 @@
                 # guards' resume data is that of a virtual object that is stored
                 # into a field of a non-virtual object.  Here, 'op' in either
                 # SETFIELD_GC or SETARRAYITEM_GC.
-                opinfo = self.getptrinfo(op.getarg(0))
+                opinfo = info.getptrinfo(op.getarg(0))
                 assert not opinfo.is_virtual()      # it must be a non-virtual
                 if self.optimizer.is_virtual(op.getarg(2)):
                     pendingfields.append(op)
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
@@ -1,10 +1,11 @@
 
-from rpython.rlib.objectmodel import specialize, we_are_translated, compute_hash
-from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\
-     rop, OpHelpers
-from rpython.jit.metainterp.history import ConstInt, Const
-from rpython.rtyper.lltypesystem import lltype, llmemory
-from rpython.jit.metainterp.optimizeopt.rawbuffer import RawBuffer, InvalidRawOperation
+from rpython.rlib.objectmodel import specialize, compute_hash
+from rpython.jit.metainterp.resoperation import (
+    AbstractValue, ResOperation, rop, OpHelpers)
+from rpython.jit.metainterp.history import ConstInt, ConstPtr, Const
+from rpython.rtyper.lltypesystem import lltype
+from rpython.jit.metainterp.optimizeopt.rawbuffer import (
+    RawBuffer, InvalidRawOperation)
 from rpython.jit.metainterp.executor import execute
 from rpython.jit.metainterp.optimize import InvalidLoop
 from .util import get_box_replacement
@@ -84,7 +85,7 @@
 
     @specialize.arg(2)
     def get_constant_string_spec(self, string_optimizer, mode):
-        return None # can't be constant
+        return None  # can't be constant
 
 class NonNullPtrInfo(PtrInfo):
     _attrs_ = ('last_guard_pos',)
@@ -161,14 +162,14 @@
     def is_virtual(self):
         return self._is_virtual
 
-    def _visitor_walk_recursive(self, op, visitor, optimizer):
+    def _visitor_walk_recursive(self, op, visitor):
         raise NotImplementedError("abstract")
 
-    def visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def visitor_walk_recursive(self, instbox, visitor):
         instbox = instbox.get_box_replacement()
         if visitor.already_seen_virtual(instbox):
             return
-        return self._visitor_walk_recursive(instbox, visitor, optimizer)
+        return self._visitor_walk_recursive(instbox, visitor)
 
 
 class AbstractStructPtrInfo(AbstractVirtualPtrInfo):
@@ -181,7 +182,7 @@
             self.descr = descr
             self._fields = [None] * len(descr.get_all_fielddescrs())
         if index >= len(self._fields):
-            self.descr = descr # a more precise descr
+            self.descr = descr  # a more precise descr
             # we found out a subclass with more fields
             extra_len = len(descr.get_all_fielddescrs()) - len(self._fields)
             self._fields = self._fields + [None] * extra_len
@@ -232,14 +233,14 @@
         rec[self] = None
         for i, fldbox in enumerate(self._fields):
             if fldbox is not None:
-                info = optforce.optimizer.getptrinfo(fldbox)
+                info = getptrinfo(fldbox)
                 if info is not None:
                     fldbox = info.force_at_the_end_of_preamble(fldbox, optforce,
                                                                rec)
                     self._fields[i] = fldbox
         return op
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         lst = self.descr.get_all_fielddescrs()
         assert self.is_virtual()
         visitor.register_virtual_fields(
@@ -247,9 +248,9 @@
         for i in range(len(lst)):
             op = self._fields[i]
             if op:
-                fieldinfo = optimizer.getptrinfo(op)
+                fieldinfo = getptrinfo(op)
                 if fieldinfo and fieldinfo.is_virtual():
-                    fieldinfo.visitor_walk_recursive(op, visitor, optimizer)
+                    fieldinfo.visitor_walk_recursive(op, visitor)
 
     def produce_short_preamble_ops(self, structbox, fielddescr, index, optimizer,
                                    shortboxes):
@@ -289,7 +290,7 @@
             if op.is_constant():
                 pass            # it is a constant value: ok
             else:
-                fieldinfo = optimizer.getptrinfo(op)
+                fieldinfo = getptrinfo(op)
                 if fieldinfo and fieldinfo.is_virtual():
                     # recursive check
                     if memo is None:
@@ -434,7 +435,7 @@
                               [op, ConstInt(offset), itembox], descr=descr)
             optforce.emit_extra(setfield_op)
 
-    def _visitor_walk_recursive(self, op, visitor, optimizer):
+    def _visitor_walk_recursive(self, op, visitor):
         itemboxes = [get_box_replacement(box)
                      for box in self._get_buffer().values]
         visitor.register_virtual_fields(op, itemboxes)
@@ -464,7 +465,7 @@
         return self.parent is not None
 
     def getitem_raw(self, offset, itemsize, descr):
-        return self.parent.getitem_raw(self.offset+offset, itemsize, descr)
+        return self.parent.getitem_raw(self.offset + offset, itemsize, descr)
 
     def setitem_raw(self, offset, itemsize, descr, itemop):
         self.parent.setitem_raw(self.offset + offset, itemsize, descr, itemop)
@@ -474,11 +475,11 @@
             self.parent._force_elements(op, optforce, descr)
         self.parent = None
 
-    def _visitor_walk_recursive(self, op, visitor, optimizer):
+    def _visitor_walk_recursive(self, op, visitor):
         source_op = get_box_replacement(op.getarg(0))
         visitor.register_virtual_fields(op, [source_op])
         if self.parent.is_virtual():
-            self.parent.visitor_walk_recursive(source_op, visitor, optimizer)
+            self.parent.visitor_walk_recursive(source_op, visitor)
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -569,16 +570,15 @@
     def getlength(self):
         return self.length
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         itemops = [get_box_replacement(item) for item in self._items]
         visitor.register_virtual_fields(instbox, itemops)
         for i in range(self.getlength()):
             itemop = self._items[i]
-            if (itemop is not None and
-                not isinstance(itemop, Const)):
-                ptrinfo = optimizer.getptrinfo(itemop)
+            if (itemop is not None and not isinstance(itemop, Const)):
+                ptrinfo = getptrinfo(itemop)
                 if ptrinfo and ptrinfo.is_virtual():
-                    ptrinfo.visitor_walk_recursive(itemop, visitor, optimizer)
+                    ptrinfo.visitor_walk_recursive(itemop, visitor)
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -608,7 +608,7 @@
         rec[self] = None
         for i, fldbox in enumerate(self._items):
             if fldbox is not None:
-                info = optforce.getptrinfo(fldbox)
+                info = getptrinfo(fldbox)
                 if info is not None:
                     fldbox = info.force_at_the_end_of_preamble(fldbox, optforce,
                                                                rec)
@@ -666,7 +666,7 @@
                     # if it does, we would need a fix here
                 i += 1
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         itemops = [get_box_replacement(item) for item in self._items]
         visitor.register_virtual_fields(instbox, itemops)
         fielddescrs = self.descr.get_all_fielddescrs()
@@ -675,10 +675,9 @@
             for fielddescr in fielddescrs:
                 itemop = self._items[i]
                 if (itemop is not None and not isinstance(itemop, Const)):
-                    ptrinfo = optimizer.getptrinfo(itemop)
+                    ptrinfo = getptrinfo(itemop)
                     if ptrinfo and ptrinfo.is_virtual():
-                        ptrinfo.visitor_walk_recursive(itemop, visitor,
-                                                       optimizer)
+                        ptrinfo.visitor_walk_recursive(itemop, visitor)
                 i += 1
 
     @specialize.argtype(1)
@@ -862,3 +861,20 @@
         assert isinstance(fw, AbstractRawPtrInfo)
         return fw
     return None
+
+def getptrinfo(op):
+    if op.type == 'i':
+        return getrawptrinfo(op)
+    elif op.type == 'f':
+        return None
+    assert op.type == 'r'
+    op = get_box_replacement(op)
+    assert op.type == 'r'
+    if isinstance(op, ConstPtr):
+        return ConstPtrInfo(op)
+    fw = op.get_forwarded()
+    if fw is not None:
+        assert isinstance(fw, PtrInfo)
+        return fw
+    return None
+
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -7,6 +7,7 @@
     CONST_0)
 from rpython.jit.metainterp.optimizeopt.util import (
     make_dispatcher_method, get_box_replacement)
+from .info import getptrinfo
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.metainterp.optimizeopt import vstring
 from rpython.jit.codewriter.effectinfo import EffectInfo
@@ -443,7 +444,7 @@
 
     def postprocess_STRLEN(self, op):
         self.make_nonnull_str(op.getarg(0), vstring.mode_string)
-        array = self.getptrinfo(op.getarg(0))
+        array = getptrinfo(op.getarg(0))
         self.optimizer.setintbound(op, array.getlenbound(vstring.mode_string))
 
     def optimize_UNICODELEN(self, op):
@@ -451,7 +452,7 @@
 
     def postprocess_UNICODELEN(self, op):
         self.make_nonnull_str(op.getarg(0), vstring.mode_unicode)
-        array = self.getptrinfo(op.getarg(0))
+        array = getptrinfo(op.getarg(0))
         self.optimizer.setintbound(op, array.getlenbound(vstring.mode_unicode))
 
     def optimize_STRGETITEM(self, op):
@@ -459,7 +460,7 @@
 
     def postprocess_STRGETITEM(self, op):
         v1 = self.getintbound(op)
-        v2 = self.getptrinfo(op.getarg(0))
+        v2 = getptrinfo(op.getarg(0))
         intbound = self.getintbound(op.getarg(1))
         if (intbound.has_lower and v2 is not None and
             v2.getlenbound(vstring.mode_string) is not None):
@@ -524,7 +525,7 @@
     def postprocess_UNICODEGETITEM(self, op):
         b1 = self.getintbound(op)
         b1.make_ge(IntLowerBound(0))
-        v2 = self.getptrinfo(op.getarg(0))
+        v2 = getptrinfo(op.getarg(0))
         intbound = self.getintbound(op.getarg(1))
         if (intbound.has_lower and v2 is not None and
             v2.getlenbound(vstring.mode_unicode) is not None):
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
@@ -1,7 +1,7 @@
 from rpython.jit.metainterp import jitprof, resume, compile
 from rpython.jit.metainterp.executor import execute_nonspec_const
 from rpython.jit.metainterp.history import (
-    Const, ConstInt, ConstPtr, CONST_NULL, new_ref_dict)
+    Const, ConstInt, CONST_NULL, new_ref_dict)
 from rpython.jit.metainterp.optimizeopt.intutils import (
     IntBound, ConstIntBound, MININT, MAXINT, IntUnbounded)
 from rpython.jit.metainterp.optimizeopt.util import (
@@ -10,7 +10,7 @@
     deserialize_optimizer_knowledge)
 from rpython.jit.metainterp.resoperation import (
     rop, AbstractResOp, GuardResOp, OpHelpers)
-from .info import getrawptrinfo
+from .info import getrawptrinfo, getptrinfo
 from rpython.jit.metainterp.optimizeopt import info
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.rlib.objectmodel import specialize, we_are_translated
@@ -111,7 +111,7 @@
 
     def getnullness(self, op):
         if op.type == 'r' or self.is_raw_ptr(op):
-            ptrinfo = self.getptrinfo(op)
+            ptrinfo = getptrinfo(op)
             if ptrinfo is None:
                 return info.INFO_UNKNOWN
             return ptrinfo.getnullness()
@@ -120,7 +120,7 @@
         assert False
 
     def make_constant_class(self, op, class_const, update_last_guard=True):
-        op = get_box_replacement(op)
+        op = op.get_box_replacement()
         opinfo = op.get_forwarded()
         if isinstance(opinfo, info.InstancePtrInfo):
             opinfo._known_class = class_const
@@ -136,22 +136,6 @@
             opinfo.mark_last_guard(self.optimizer)
         return opinfo
 
-    def getptrinfo(self, op):
-        if op.type == 'i':
-            return getrawptrinfo(op)
-        elif op.type == 'f':
-            return None
-        assert op.type == 'r'
-        op = get_box_replacement(op)
-        assert op.type == 'r'
-        if isinstance(op, ConstPtr):
-            return info.ConstPtrInfo(op)
-        fw = op.get_forwarded()
-        if fw is not None:
-            assert isinstance(fw, info.PtrInfo)
-            return fw
-        return None
-
     def is_raw_ptr(self, op):
         fw = get_box_replacement(op).get_forwarded()
         if isinstance(fw, info.AbstractRawPtrInfo):
@@ -303,7 +287,7 @@
 
     def force_box_for_end_of_preamble(self, box):
         if box.type == 'r':
-            info = self.getptrinfo(box)
+            info = getptrinfo(box)
             if info is not None and info.is_virtual():
                 rec = {}
                 return info.force_at_the_end_of_preamble(box,
@@ -326,10 +310,10 @@
 
     def getinfo(self, op):
         if op.type == 'r':
-            return self.getptrinfo(op)
+            return getptrinfo(op)
         elif op.type == 'i':
             if self.is_raw_ptr(op):
-                return self.getptrinfo(op)
+                return getptrinfo(op)
             return self.getintbound(op)
         elif op.type == 'f':
             if get_box_replacement(op).is_constant():
@@ -424,7 +408,7 @@
             return
         if box.type == 'r' and box.get_forwarded() is not None:
             opinfo = box.get_forwarded()
-            opinfo.copy_fields_to_const(self.getptrinfo(constbox), self.optheap)
+            opinfo.copy_fields_to_const(getptrinfo(constbox), self.optheap)
         box.set_forwarded(constbox)
 
     def make_constant_int(self, box, intvalue):
@@ -833,13 +817,8 @@
                 <= expected_class.subclassrange_max)
 
     def is_virtual(self, op):
-        if op.type == 'r':
-            opinfo = self.getptrinfo(op)
-            return opinfo is not None and opinfo.is_virtual()
-        if op.type == 'i':
-            opinfo = getrawptrinfo(op)
-            return opinfo is not None and opinfo.is_virtual()
-        return False
+        opinfo = getptrinfo(op)
+        return opinfo is not None and opinfo.is_virtual()
 
     # These are typically removed already by OptRewrite, but it can be
     # dissabled and unrolling emits some SAME_AS ops to setup the
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -7,14 +7,13 @@
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
 from rpython.jit.metainterp.optimizeopt.optimizer import (
     Optimization, OptimizationResult, REMOVED, CONST_0, CONST_1)
-from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
+from rpython.jit.metainterp.optimizeopt.info import (
+    INFO_NONNULL, INFO_NULL, getptrinfo)
 from rpython.jit.metainterp.optimizeopt.util import (
     _findall, make_dispatcher_method, get_box_replacement)
-from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
-     OpHelpers
+from rpython.jit.metainterp.resoperation import (
+    rop, ResOperation, opclasses, OpHelpers)
 from rpython.rlib.rarithmetic import highest_bit
-from rpython.rtyper.lltypesystem import llmemory
-from rpython.rtyper import rclass
 import math
 
 
@@ -69,7 +68,6 @@
                 return True
         return False
 
-
     def find_rewritable_bool(self, op):
         oldopnum = op.boolinverse
         arg0 = op.getarg(0)
@@ -79,7 +77,7 @@
             if self.try_boolinvers(op, top):
                 return True
 
-        oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL
+        oldopnum = op.boolreflex  # FIXME: add INT_ADD, INT_MUL
         if oldopnum != -1:
             top = ResOperation(oldopnum, [arg1, arg0])
             oldop = self.get_pure_result(top)
@@ -344,7 +342,7 @@
         return self.emit(op)
 
     def optimize_GUARD_ISNULL(self, op):
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         if info is not None:
             if info.is_null():
                 return
@@ -358,7 +356,7 @@
         self.make_constant(op.getarg(0), CONST_NULL)
 
     def optimize_GUARD_IS_OBJECT(self, op):
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         if info and info.is_constant():
             if info.is_null():
                 raise InvalidLoop("A GUARD_IS_OBJECT(NULL) found")
@@ -374,7 +372,7 @@
         return self.emit(op)
 
     def optimize_GUARD_GC_TYPE(self, op):
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         if info and info.is_constant():
             c = get_box_replacement(op.getarg(0))
             tid = self.optimizer.cpu.get_actual_typeid(c.getref_base())
@@ -388,7 +386,7 @@
         return self.emit(op)
 
     def optimize_GUARD_SUBCLASS(self, op):
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         optimizer = self.optimizer
         # must raise 'InvalidLoop' in all cases where 'info' shows the
         # class cannot possibly match (see test_issue2926)
@@ -427,7 +425,7 @@
         return self.emit(op)
 
     def optimize_GUARD_NONNULL(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo is not None:
             if opinfo.is_nonnull():
                 return
@@ -439,12 +437,12 @@
 
     def postprocess_GUARD_NONNULL(self, op):
         self.make_nonnull(op.getarg(0))
-        self.getptrinfo(op.getarg(0)).mark_last_guard(self.optimizer)
+        getptrinfo(op.getarg(0)).mark_last_guard(self.optimizer)
 
     def optimize_GUARD_VALUE(self, op):
         arg0 = op.getarg(0)
         if arg0.type == 'r':
-            info = self.getptrinfo(arg0)
+            info = getptrinfo(arg0)
             if info:
                 if info.is_virtual():
                     raise InvalidLoop("promote of a virtual")
@@ -492,8 +490,8 @@
                                   'always fail' % r)
         descr = compile.ResumeGuardDescr()
         op = old_guard_op.copy_and_change(rop.GUARD_VALUE,
-                         args = [old_guard_op.getarg(0), op.getarg(1)],
-                         descr = descr)
+                         args=[old_guard_op.getarg(0), op.getarg(1)],
+                         descr=descr)
         # Note: we give explicitly a new descr for 'op'; this is why the
         # old descr must not be ResumeAtPositionDescr (checked above).
         # Better-safe-than-sorry but it should never occur: we should
@@ -532,7 +530,7 @@
         self.make_nonnull(op.getarg(0))
 
     def optimize_RECORD_EXACT_CLASS(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         expectedclassbox = op.getarg(1)
         assert isinstance(expectedclassbox, Const)
         if opinfo is not None:
@@ -563,8 +561,8 @@
                 # it was a guard_nonnull, which we replace with a
                 # guard_nonnull_class.
                 descr = compile.ResumeGuardDescr()
-                op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS,
-                            args = [old_guard_op.getarg(0), op.getarg(1)],
+                op = old_guard_op.copy_and_change(rop.GUARD_NONNULL_CLASS,
+                            args=[old_guard_op.getarg(0), op.getarg(1)],
                             descr=descr)
                 # Note: we give explicitly a new descr for 'op'; this is why the
                 # old descr must not be ResumeAtPositionDescr (checked above).
@@ -577,14 +575,14 @@
 
     def postprocess_GUARD_CLASS(self, op):
         expectedclassbox = op.getarg(1)
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         old_guard_op = info.get_last_guard(self.optimizer)
         update_last_guard = not old_guard_op or isinstance(
             old_guard_op.getdescr(), compile.ResumeAtPositionDescr)
         self.make_constant_class(op.getarg(0), expectedclassbox, update_last_guard)
 
     def optimize_GUARD_NONNULL_CLASS(self, op):
-        info = self.getptrinfo(op.getarg(0))
+        info = getptrinfo(op.getarg(0))
         if info and info.is_null():
             r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op)
             raise InvalidLoop('A GUARD_NONNULL_CLASS (%s) was proven to '
@@ -663,8 +661,8 @@
     def _optimize_oois_ooisnot(self, op, expect_isnot, instance):
         arg0 = get_box_replacement(op.getarg(0))
         arg1 = get_box_replacement(op.getarg(1))
-        info0 = self.getptrinfo(arg0)
-        info1 = self.getptrinfo(arg1)
+        info0 = getptrinfo(arg0)
+        info1 = getptrinfo(arg1)
         if info0 and info0.is_virtual():
             if info1 and info1.is_virtual():
                 intres = (info0 is info1) ^ expect_isnot
@@ -724,8 +722,8 @@
         if length and length.getint() == 0:
             return None  # 0-length arraycopy
 
-        source_info = self.getptrinfo(op.getarg(1))
-        dest_info = self.getptrinfo(op.getarg(2))
+        source_info = getptrinfo(op.getarg(1))
+        dest_info = getptrinfo(op.getarg(2))
         source_start_box = self.get_constant_box(op.getarg(3))
         dest_start_box = self.get_constant_box(op.getarg(4))
         extrainfo = op.getdescr().get_extra_info()
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -25,9 +25,6 @@
     class cpu:
         remove_gctypeptr = True
 
-    def getptrinfo(self, box):
-        return box.get_forwarded()
-
     def setinfo_from_preamble(self, *args):
         pass
 
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -6,7 +6,7 @@
 from rpython.jit.metainterp.optimizeopt.util import (
     make_dispatcher_method, get_box_replacement)
 from rpython.jit.metainterp.optimizeopt.rawbuffer import InvalidRawOperation
-from .info import getrawptrinfo
+from .info import getrawptrinfo, getptrinfo
 from rpython.jit.metainterp.resoperation import rop, ResOperation
 
 
@@ -101,7 +101,7 @@
         effectinfo = op.getdescr().get_extra_info()
         oopspecindex = effectinfo.oopspecindex
         if oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE:
-            opinfo = self.getptrinfo(op.getarg(2))
+            opinfo = getptrinfo(op.getarg(2))
             if opinfo and opinfo.is_virtual():
                 return
         return self.emit(op)
@@ -161,17 +161,17 @@
         # was already forced).
 
     def _optimize_JIT_FORCE_VIRTUAL(self, op):
-        vref = self.getptrinfo(op.getarg(1))
+        vref = getptrinfo(op.getarg(1))
         vrefinfo = self.optimizer.metainterp_sd.virtualref_info
         if vref and vref.is_virtual():
             tokenop = vref.getfield(vrefinfo.descr_virtual_token, None)
             if tokenop is None:
                 return False
-            tokeninfo = self.getptrinfo(tokenop)
+            tokeninfo = getptrinfo(tokenop)
             if (tokeninfo is not None and tokeninfo.is_constant() and
                     not tokeninfo.is_nonnull()):
                 forcedop = vref.getfield(vrefinfo.descr_forced, None)
-                forcedinfo = self.getptrinfo(forcedop)
+                forcedinfo = getptrinfo(forcedop)
                 if forcedinfo is not None and not forcedinfo.is_null():
                     self.make_equal_to(op, forcedop)
                     self.last_emitted_operation = REMOVED
@@ -179,7 +179,7 @@
         return False
 
     def optimize_GETFIELD_GC_I(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             fieldop = opinfo.getfield(op.getdescr())
             if fieldop is None:
@@ -193,7 +193,7 @@
 
     def optimize_SETFIELD_GC(self, op):
         struct = op.getarg(0)
-        opinfo = self.getptrinfo(struct)
+        opinfo = getptrinfo(struct)
         if opinfo is not None and opinfo.is_virtual():
             opinfo.setfield(op.getdescr(), struct,
                             get_box_replacement(op.getarg(1)))
@@ -230,7 +230,7 @@
             return self.do_RAW_FREE(op)
         elif effectinfo.oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE:
             # we might end up having CALL here instead of COND_CALL
-            info = self.getptrinfo(op.getarg(1))
+            info = getptrinfo(op.getarg(1))
             if info and info.is_virtual():
                 return
         else:
@@ -265,7 +265,7 @@
         return self.emit(op)
 
     def optimize_ARRAYLEN_GC(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             self.make_constant_int(op, opinfo.getlength())
         else:
@@ -273,7 +273,7 @@
             return self.emit(op)
 
     def optimize_GETARRAYITEM_GC_I(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
@@ -295,7 +295,7 @@
     optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_I
 
     def optimize_SETARRAYITEM_GC(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
@@ -384,7 +384,7 @@
         return self.emit(op)
 
     def optimize_GETINTERIORFIELD_GC_I(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
@@ -402,7 +402,7 @@
     optimize_GETINTERIORFIELD_GC_F = optimize_GETINTERIORFIELD_GC_I
 
     def optimize_SETINTERIORFIELD_GC(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -6,6 +6,7 @@
      MININT, MAXINT, IntBound, IntLowerBound
 from rpython.jit.metainterp.resoperation import rop, ResOperation, \
      InputArgInt, InputArgRef, InputArgFloat
+from .info import getptrinfo
 from .util import get_box_replacement
 from rpython.rlib.debug import debug_print
 
@@ -145,7 +146,7 @@
         assert len(self.fielddescrs) == len(self.fieldstate)
         assert len(other.fielddescrs) == len(other.fieldstate)
         if runtime_box is not None:
-            opinfo = state.optimizer.getptrinfo(box)
+            opinfo = getptrinfo(box)
             assert opinfo.is_virtual()
             assert isinstance(opinfo, AbstractStructPtrInfo)
         else:
@@ -180,7 +181,7 @@
 
     def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
         box = get_box_replacement(box)
-        info = optimizer.getptrinfo(box)
+        info = getptrinfo(box)
         if info is None or not info.is_virtual():
             raise VirtualStatesCantMatch()
         else:
@@ -248,7 +249,7 @@
         fieldbox_runtime = None
         for i in range(len(self.fieldstate)):
             if runtime_box is not None:
-                opinfo = state.optimizer.getptrinfo(box)
+                opinfo = getptrinfo(box)
                 assert isinstance(opinfo, ArrayPtrInfo)
                 fieldbox = opinfo._items[i]
                 fieldbox_runtime = state.get_runtime_item(runtime_box,
@@ -261,7 +262,7 @@
 
     def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
         box = get_box_replacement(box)
-        info = optimizer.getptrinfo(box)
+        info = getptrinfo(box)
         if info is None or not info.is_virtual():
             raise VirtualStatesCantMatch()
         if len(self.fieldstate) > info.getlength():
@@ -305,7 +306,7 @@
         fieldbox = None
         fieldbox_runtime = None
         if box is not None:
-            opinfo = state.optimizer.getptrinfo(box)
+            opinfo = getptrinfo(box)
             assert isinstance(opinfo, ArrayPtrInfo)
         else:
             opinfo = None
@@ -330,7 +331,7 @@
                 s.enum(virtual_state)
 
     def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
-        opinfo = optimizer.getptrinfo(box)
+        opinfo = getptrinfo(box)
         if not isinstance(opinfo, ArrayStructInfo):
             raise VirtualStatesCantMatch
         if not opinfo.is_virtual():
@@ -412,15 +413,15 @@
         if self.level == LEVEL_CONSTANT:
             return
         assert 0 <= self.position_in_notvirtuals
-        if optimizer is not None:
-            box = get_box_replacement(box)
-            if box.type == 'r':
-                info = optimizer.getptrinfo(box)
-                if info and info.is_virtual():
-                    if force_boxes:
-                        info.force_box(box, optimizer)
-                    else:
-                        raise VirtualStatesCantMatch
+        assert optimizer is not None
+        box = get_box_replacement(box)
+        if box.type == 'r':
+            info = getptrinfo(box)
+            if info and info.is_virtual():
+                if force_boxes:
+                    info.force_box(box, optimizer)
+                else:
+                    raise VirtualStatesCantMatch
         boxes[self.position_in_notvirtuals] = box
 
     def _enum(self, virtual_state):
@@ -714,11 +715,11 @@
         except KeyError:
             pass
         if box.type == 'r':
-            info = opt.getptrinfo(box)
+            info = getptrinfo(box)
             if info is not None and info.is_virtual():
                 result = info.visitor_dispatch_virtual_type(self)
                 self.info[box] = result
-                info.visitor_walk_recursive(box, self, opt)
+                info.visitor_walk_recursive(box, self)
                 result.fieldstate = [self.create_state_or_none(b, opt)
                                      for b in self.fieldboxes[box]]
             else:
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -7,7 +7,7 @@
 from rpython.jit.metainterp.optimizeopt.util import (
     make_dispatcher_method, get_box_replacement)
 from rpython.jit.metainterp.resoperation import rop, ResOperation
-from rpython.jit.metainterp.optimizeopt import info
+from .info import AbstractVirtualPtrInfo, getptrinfo
 from rpython.rlib.objectmodel import specialize, we_are_translated
 from rpython.rlib.unroll import unrolling_iterable
 from rpython.rtyper import annlowlevel
@@ -47,7 +47,7 @@
 # ____________________________________________________________
 
 
-class StrPtrInfo(info.AbstractVirtualPtrInfo):
+class StrPtrInfo(AbstractVirtualPtrInfo):
     #_attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo', '_is_virtual')
 
     lenbound = None
@@ -119,7 +119,7 @@
         return lengthop
 
     def make_guards(self, op, short, optimizer):
-        info.AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
+        AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
         if (self.lenbound and
                 self.lenbound.has_lower and self.lenbound.lower >= 1):
             if self.mode is mode_string:
@@ -205,7 +205,7 @@
             offsetbox = _int_add(optstring, offsetbox, CONST_1)
         return offsetbox
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         visitor.register_virtual_fields(instbox, self._chars)
 
     @specialize.argtype(1)
@@ -238,7 +238,7 @@
         vstart = optstring.getintbound(self.start)
         vlength = optstring.getintbound(self.lgtop)
         if vstart.is_constant() and vlength.is_constant():
-            vstr = optstring.getptrinfo(self.s)
+            vstr = getptrinfo(self.s)
             s1 = vstr.get_constant_string_spec(optstring, mode)
             if s1 is None:
                 return None
@@ -253,12 +253,12 @@
         assert op is not None
         return self.lgtop
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         boxes = [self.s, self.start, self.lgtop]
         visitor.register_virtual_fields(instbox, boxes)
-        opinfo = optimizer.getptrinfo(self.s)
+        opinfo = getptrinfo(self.s)
         if opinfo and opinfo.is_virtual():
-            opinfo.visitor_walk_recursive(self.s, visitor, optimizer)
+            opinfo.visitor_walk_recursive(self.s, visitor)
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -283,11 +283,11 @@
         assert op is not None
         if self.lgtop is not None:
             return self.lgtop
-        lefti = optstring.getptrinfo(self.vleft)
+        lefti = getptrinfo(self.vleft)
         len1box = lefti.getstrlen(self.vleft, optstring, mode)
         if len1box is None:
             return None
-        righti = optstring.getptrinfo(self.vright)
+        righti = getptrinfo(self.vright)
         len2box = righti.getstrlen(self.vright, optstring, mode)
         if len2box is None:
             return None
@@ -297,11 +297,11 @@
 
     @specialize.arg(2)
     def get_constant_string_spec(self, optstring, mode):
-        ileft = optstring.getptrinfo(self.vleft)
+        ileft = getptrinfo(self.vleft)
         s1 = ileft.get_constant_string_spec(optstring, mode)
         if s1 is None:
             return None
-        iright = optstring.getptrinfo(self.vright)
+        iright = getptrinfo(self.vright)
         s2 = iright.get_constant_string_spec(optstring, mode)
         if s2 is None:
             return None
@@ -309,26 +309,26 @@
 
     def string_copy_parts(self, op, optstring, targetbox, offsetbox,
                           mode):
-        lefti = optstring.getptrinfo(self.vleft)
+        lefti = getptrinfo(self.vleft)
         offsetbox = lefti.string_copy_parts(self.vleft, optstring,
                                             targetbox, offsetbox, mode)
-        righti = optstring.getptrinfo(self.vright)
+        righti = getptrinfo(self.vright)
         offsetbox = righti.string_copy_parts(self.vright, optstring,
                                              targetbox, offsetbox, mode)
         return offsetbox
 
-    def _visitor_walk_recursive(self, instbox, visitor, optimizer):
+    def _visitor_walk_recursive(self, instbox, visitor):
         # we don't store the lengthvalue in guards, because the
         # guard-failed code starts with a regular STR_CONCAT again
         leftbox = self.vleft
         rightbox = self.vright
         visitor.register_virtual_fields(instbox, [leftbox, rightbox])
-        leftinfo = optimizer.getptrinfo(leftbox)
-        rightinfo = optimizer.getptrinfo(rightbox)
+        leftinfo = getptrinfo(leftbox)
+        rightinfo = getptrinfo(rightbox)
         if leftinfo and leftinfo.is_virtual():
-            leftinfo.visitor_walk_recursive(leftbox, visitor, optimizer)
+            leftinfo.visitor_walk_recursive(leftbox, visitor)
         if rightinfo and rightinfo.is_virtual():
-            rightinfo.visitor_walk_recursive(rightbox, visitor, optimizer)
+            rightinfo.visitor_walk_recursive(rightbox, visitor)
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -463,7 +463,7 @@
         self.pure_from_args(mode_unicode.STRLEN, [op], op.getarg(0))
 
     def optimize_STRSETITEM(self, op):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo:
             assert not opinfo.is_constant()
             # strsetitem(ConstPtr) never makes sense
@@ -489,12 +489,12 @@
 
     def strgetitem(self, op, s, index, mode):
         self.make_nonnull_str(s, mode)
-        sinfo = self.getptrinfo(s)
+        sinfo = getptrinfo(s)
         #
         if isinstance(sinfo, VStringSliceInfo) and sinfo.is_virtual(): # slice
             index = _int_add(self.optimizer, sinfo.start, index)
             s = sinfo.s
-            sinfo = self.getptrinfo(sinfo.s)
+            sinfo = getptrinfo(sinfo.s)
         #
         if isinstance(sinfo, VStringPlainInfo):
             # even if no longer virtual
@@ -508,7 +508,7 @@
         #
         vindex = self.getintbound(index)
         if isinstance(sinfo, VStringConcatInfo) and vindex.is_constant():
-            leftinfo = self.getptrinfo(sinfo.vleft)
+            leftinfo = getptrinfo(sinfo.vleft)
             len1box = leftinfo.getstrlen(sinfo.vleft, self, mode)
             if isinstance(len1box, ConstInt):
                 raw_index = vindex.getint()
@@ -529,7 +529,7 @@
 
     def _optimize_STRLEN(self, op, mode):
         arg1 = get_box_replacement(op.getarg(0))
-        opinfo = self.getptrinfo(arg1)
+        opinfo = getptrinfo(arg1)
         if opinfo:
             lgtop = opinfo.getstrlen(arg1, self, mode)
             if lgtop is not None:
@@ -544,7 +544,7 @@
         return self._optimize_STRHASH(op, mode_unicode)
 
     def _optimize_STRHASH(self, op, mode):
-        opinfo = self.getptrinfo(op.getarg(0))
+        opinfo = getptrinfo(op.getarg(0))
         if opinfo:
             lgtop = opinfo.getstrhash(op, mode)
             if lgtop is not None:
@@ -565,8 +565,8 @@
         assert op.getarg(2).type == INT
         assert op.getarg(3).type == INT
         assert op.getarg(4).type == INT
-        src = self.getptrinfo(op.getarg(0))
-        dst = self.getptrinfo(op.getarg(1))
+        src = getptrinfo(op.getarg(0))
+        dst = getptrinfo(op.getarg(1))
         srcstart = self.getintbound(op.getarg(2))
         dststart = self.getintbound(op.getarg(3))
         length = self.getintbound(op.getarg(4))
@@ -641,7 +641,7 @@
         # More generally, supporting non-constant but virtual cases is
         # not obvious, because of the exception UnicodeDecodeError that
         # can be raised by ll_str2unicode()
-        varg = self.getptrinfo(op.getarg(1))
+        varg = getptrinfo(op.getarg(1))
         s = None
         if varg:
             s = varg.get_constant_string_spec(self, mode_string)
@@ -666,7 +666,7 @@
 
     def opt_call_stroruni_STR_SLICE(self, op, mode):
         self.make_nonnull_str(op.getarg(1), mode)
-        vstr = self.getptrinfo(op.getarg(1))
+        vstr = getptrinfo(op.getarg(1))
         vstart = self.getintbound(op.getarg(2))
         vstop = self.getintbound(op.getarg(3))
         #
@@ -697,8 +697,8 @@
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
         arg1 = get_box_replacement(op.getarg(1))
         arg2 = get_box_replacement(op.getarg(2))
-        i1 = self.getptrinfo(arg1)
-        i2 = self.getptrinfo(arg2)
+        i1 = getptrinfo(arg1)
+        i2 = getptrinfo(arg2)
         #
         if i1:
             l1box = i1.getstrlen(arg1, self, mode)
@@ -738,8 +738,8 @@
         return False, None
 
     def handle_str_equal_level1(self, arg1, arg2, resultop, mode):
-        i1 = self.getptrinfo(arg1)
-        i2 = self.getptrinfo(arg2)
+        i1 = getptrinfo(arg1)
+        i2 = getptrinfo(arg2)
         l2box = None
         l1box = None
         if i2:
@@ -748,7 +748,7 @@
             if l2box.value == 0:
                 if i1 and i1.is_nonnull():
                     self.make_nonnull_str(arg1, mode)
-                    i1 = self.getptrinfo(arg1)
+                    i1 = getptrinfo(arg1)
                     lengthbox = i1.getstrlen(arg1, self, mode)
                 else:
                     lengthbox = None
@@ -792,8 +792,8 @@
         return False, None
 
     def handle_str_equal_level2(self, arg1, arg2, resultbox, mode):
-        i1 = self.getptrinfo(arg1)
-        i2 = self.getptrinfo(arg2)
+        i1 = getptrinfo(arg1)
+        i2 = getptrinfo(arg2)
         l2box = None
         if i2:
             l2box = i2.getstrlen(arg1, self, mode)
@@ -821,8 +821,8 @@
     def opt_call_stroruni_STR_CMP(self, op, mode):
         arg1 = get_box_replacement(op.getarg(1))
         arg2 = get_box_replacement(op.getarg(2))
-        i1 = self.getptrinfo(arg1)
-        i2 = self.getptrinfo(arg2)
+        i1 = getptrinfo(arg1)
+        i2 = getptrinfo(arg2)
         if not i1 or not i2:
             return False, None
         l1box = i1.getstrlen(arg1, self, mode)
@@ -842,7 +842,7 @@
         return False, None
 
     def opt_call_SHRINK_ARRAY(self, op):
-        i1 = self.getptrinfo(op.getarg(1))
+        i1 = getptrinfo(op.getarg(1))
         i2 = self.getintbound(op.getarg(2))
         # If the index is constant, if the argument is virtual (we only support
         # VStringPlainValue for now) we can optimize away the call.
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -221,10 +221,11 @@
 
     # env numbering
 
-    def _number_boxes(self, iter, arr, optimizer, numb_state):
+    def _number_boxes(self, iter, arr, numb_state):
         """ Number boxes from one snapshot
         """
-        from rpython.jit.metainterp.optimizeopt.info import getrawptrinfo
+        from rpython.jit.metainterp.optimizeopt.info import (
+            getrawptrinfo, getptrinfo)
         num_boxes = numb_state.num_boxes
         num_virtuals = numb_state.num_virtuals
         liveboxes = numb_state.liveboxes
@@ -239,7 +240,7 @@
             else:
                 is_virtual = False
                 if box.type == 'r':
-                    info = optimizer.getptrinfo(box)
+                    info = getptrinfo(box)
                     is_virtual = (info is not None and info.is_virtual())
                 if box.type == 'i':
                     info = getrawptrinfo(box)
@@ -264,21 +265,20 @@
         arr = snapshot_iter.vable_array
 
         numb_state.append_int(len(arr))
-        self._number_boxes(snapshot_iter, arr, optimizer, numb_state)
+        self._number_boxes(snapshot_iter, arr, numb_state)
 
         arr = snapshot_iter.vref_array
         n = len(arr)
         assert not (n & 1)
         numb_state.append_int(n >> 1)
 
-        self._number_boxes(snapshot_iter, arr, optimizer, numb_state)
+        self._number_boxes(snapshot_iter, arr, numb_state)
 
         for snapshot in snapshot_iter.framestack:
             jitcode_index, pc = snapshot_iter.unpack_jitcode_pc(snapshot)
             numb_state.append_int(jitcode_index)
             numb_state.append_int(pc)
-            self._number_boxes(
-                    snapshot_iter, snapshot.box_array, optimizer, numb_state)
+            self._number_boxes(snapshot_iter, snapshot.box_array, numb_state)
         numb_state.patch_current_size(0)
 
         return numb_state
@@ -415,7 +415,8 @@
         return tagbits == TAGVIRTUAL
 
     def finish(self, pending_setfields=[]):
-        from rpython.jit.metainterp.optimizeopt.info import getrawptrinfo
+        from rpython.jit.metainterp.optimizeopt.info import (
+            getrawptrinfo, getptrinfo)
         optimizer = self.optimizer
         # compute the numbering
         storage = self.storage
@@ -441,12 +442,12 @@
             else:
                 assert tagbits == TAGVIRTUAL
                 if box.type == 'r':
-                    info = optimizer.getptrinfo(box)
+                    info = getptrinfo(box)
                 else:
                     assert box.type == 'i'
                     info = getrawptrinfo(box)
                 assert info.is_virtual()
-                info.visitor_walk_recursive(box, self, optimizer)
+                info.visitor_walk_recursive(box, self)
 
         for setfield_op in pending_setfields:
             box = setfield_op.getarg(0)
@@ -458,11 +459,11 @@
             fieldbox = optimizer.get_box_replacement(fieldbox)
             self.register_box(box)
             self.register_box(fieldbox)
-            info = optimizer.getptrinfo(fieldbox)
+            info = getptrinfo(fieldbox)
             assert info is not None and info.is_virtual()
-            info.visitor_walk_recursive(fieldbox, self, optimizer)
+            info.visitor_walk_recursive(fieldbox, self)
 
-        self._number_virtuals(liveboxes, optimizer, num_virtuals)
+        self._number_virtuals(liveboxes, num_virtuals)
         self._add_pending_fields(optimizer, pending_setfields)
 
         numb_state.patch(1, len(liveboxes))
@@ -472,8 +473,9 @@
         storage.rd_consts = self.memo.consts
         return liveboxes[:]
 
-    def _number_virtuals(self, liveboxes, optimizer, num_env_virtuals):
-        from rpython.jit.metainterp.optimizeopt.info import AbstractVirtualPtrInfo
+    def _number_virtuals(self, liveboxes, num_env_virtuals):
+        from rpython.jit.metainterp.optimizeopt.info import (
+            AbstractVirtualPtrInfo, getptrinfo)
 
         # !! 'liveboxes' is a list that is extend()ed in-place !!
         memo = self.memo
@@ -514,7 +516,7 @@
             memo.nvholes += length - len(vfieldboxes)
             for virtualbox, fieldboxes in vfieldboxes.iteritems():
                 num, _ = untag(self.liveboxes[virtualbox])
-                info = optimizer.getptrinfo(virtualbox)
+                info = getptrinfo(virtualbox)
                 assert info.is_virtual()
                 assert isinstance(info, AbstractVirtualPtrInfo)
                 fieldnums = [self._gettagged(box)
diff --git a/rpython/jit/metainterp/test/test_bridgeopt.py b/rpython/jit/metainterp/test/test_bridgeopt.py
--- a/rpython/jit/metainterp/test/test_bridgeopt.py
+++ b/rpython/jit/metainterp/test/test_bridgeopt.py
@@ -28,14 +28,10 @@
     optheap = None
     optrewrite = None
 
-    def __init__(self, dct={}, cpu=None):
-        self.dct = dct
+    def __init__(self, cpu=None):
         self.constant_classes = {}
         self.cpu = cpu
 
-    def getptrinfo(self, arg):
-        return self.dct.get(arg, None)
-
     def make_constant_class(self, arg, cls):
         self.constant_classes[arg] = cls
 
@@ -47,13 +43,12 @@
         self.rd_numb = numb
 
 def test_known_classes():
+    cls = FakeClass()
     box1 = InputArgRef()
+    box1.set_forwarded(InstancePtrInfo(known_class=cls))
     box2 = InputArgRef()
     box3 = InputArgRef()
-
-    cls = FakeClass()
-    dct = {box1: InstancePtrInfo(known_class=cls)}
-    optimizer = FakeOptimizer(dct)
+    optimizer = FakeOptimizer()
 
     numb_state = NumberingState(4)
     numb_state.append_int(1) # size of resume block
@@ -87,10 +82,10 @@
 @given(boxes_known_classes)
 def test_random_class_knowledge(boxes_known_classes):
     cls = FakeClass()
-    dct1 = {box: InstancePtrInfo(known_class=cls)
-              for box, known_class in boxes_known_classes
-                  if known_class}
-    optimizer = FakeOptimizer(dct1)
+    for box, known_class in boxes_known_classes:
+        if known_class:
+            box.set_forwarded(InstancePtrInfo(known_class=cls))
+    optimizer = FakeOptimizer()
 
     refboxes = [box for (box, _) in boxes_known_classes
                     if isinstance(box, InputArgRef)]
diff --git a/rpython/jit/metainterp/test/test_resume.py b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 import py
 import sys
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
@@ -15,7 +14,7 @@
     unpack_numbering, create_numbering)
 from rpython.jit.metainterp.opencoder import Trace
 
-from rpython.jit.metainterp.optimizeopt import info, util
+from rpython.jit.metainterp.optimizeopt import info
 from rpython.jit.metainterp.history import (
     ConstInt, Const, AbstractDescr, ConstPtr, ConstFloat, IntFrontendOp,
     RefFrontendOp, CONST_NULL)
@@ -51,10 +50,6 @@
             op = op.get_forwarded()
         return op
 
-    def getptrinfo(self, op):
-        op = util.get_box_replacement(op)
-        return op.get_forwarded()
-
 
 # ____________________________________________________________
 
@@ -872,12 +867,12 @@
                                   False, [], env3)
     snap3.prev = snap
 
-    class FakeVirtualInfo(info.AbstractInfo):
+    class FakeVirtualInfo(info.AbstractVirtualPtrInfo):
         def __init__(self, virt):
-            self.virt = virt
+            self._is_virtual = virt
 
         def is_virtual(self):
-            return self.virt
+            return self._is_virtual
 
     # renamed
     b3.set_forwarded(c4)
@@ -1195,7 +1190,7 @@
 
 
 def test_virtual_adder_make_virtual():
-    b2s, b3s, b4s, b5s = [IntFrontendOp(0), IntFrontendOp(0), RefFrontendOp(0),
+    b2s, b3s, b4s, b5s = [RefFrontendOp(0), IntFrontendOp(0), RefFrontendOp(0),
                           RefFrontendOp(0)]
     c1s = ConstInt(111)
     storage = Storage()
@@ -1222,7 +1217,7 @@
     modifier.register_virtual_fields(b4s, [b3s, None, None, None, b2s, b5s])
 
     liveboxes = []
-    modifier._number_virtuals(liveboxes, FakeOptimizer(), 0)
+    modifier._number_virtuals(liveboxes, 0)
     storage.rd_consts = memo.consts[:]
     storage.rd_numb = Numbering([0])
     # resume
@@ -1277,7 +1272,7 @@
         del Const.__eq__
 
 def test_virtual_adder_make_varray():
-    b2s, b4s = [IntFrontendOp(0), IntFrontendOp(0)]
+    b2s, b4s = [RefFrontendOp(0), IntFrontendOp(0)]
     b4s.setint(4)
     c1s = ConstInt(111)
     storage = Storage()
@@ -1292,7 +1287,7 @@
     v2._items = [b4s, c1s]
     modifier.register_virtual_fields(b2s, [b4s, c1s])
     liveboxes = []
-    modifier._number_virtuals(liveboxes, FakeOptimizer(), 0)
+    modifier._number_virtuals(liveboxes, 0)
     dump_storage(storage, liveboxes)
     storage.rd_consts = memo.consts[:]
     storage.rd_numb = Numbering([0])
@@ -1345,7 +1340,7 @@
     v2.setfield(LLtypeMixin.bdescr, b2s, b4s)
     modifier.register_virtual_fields(b2s, [c1s, c1s, b4s])
     liveboxes = []
-    modifier._number_virtuals(liveboxes, FakeOptimizer(), 0)
+    modifier._number_virtuals(liveboxes, 0)
     dump_storage(storage, liveboxes)
     storage.rd_consts = memo.consts[:]
     storage.rd_numb = Numbering([0])
@@ -1389,7 +1384,7 @@
     modifier.register_box(b4s)
 
     liveboxes = []
-    modifier._number_virtuals(liveboxes, FakeOptimizer(), 0)
+    modifier._number_virtuals(liveboxes, 0)
     assert liveboxes == [b2s, b4s] or liveboxes == [b4s, b2s]
     modifier._add_pending_fields(FakeOptimizer(), [
         ResOperation(rop.SETFIELD_GC, [b2s, b4s], descr=LLtypeMixin.nextdescr)])


More information about the pypy-commit mailing list