[pypy-commit] pypy heapcache-refactor: fixes for consts

fijal pypy.commits at gmail.com
Fri Mar 18 18:40:27 EDT 2016


Author: fijal
Branch: heapcache-refactor
Changeset: r83152:042155266b53
Date: 2016-03-19 00:39 +0200
http://bitbucket.org/pypy/pypy/changeset/042155266b53/

Log:	fixes for consts

diff --git a/rpython/jit/metainterp/heapcache.py b/rpython/jit/metainterp/heapcache.py
--- a/rpython/jit/metainterp/heapcache.py
+++ b/rpython/jit/metainterp/heapcache.py
@@ -35,7 +35,7 @@
     return bool(f & r_uint(flags))
 
 def maybe_replace_with_const(box):
-    if box.is_replaced_with_const():
+    if not isinstance(box, Const) and box.is_replaced_with_const():
         return constant_from_op(box)
     else:
         return box
@@ -58,7 +58,8 @@
         self.cache_anything.clear()
 
     def _seen_alloc(self, ref_box):
-        assert isinstance(ref_box, RefFrontendOp)
+        if not isinstance(ref_box, RefFrontendOp):
+            return False
         return self.heapcache._check_flag(ref_box, HF_SEEN_ALLOCATION)
 
     def _getdict(self, seen_alloc):
@@ -105,6 +106,18 @@
     def setfield(self, fieldbox):
         self.cache.do_write_with_aliasing(self.ref_box, fieldbox)
 
+class DummyFieldUpdater(FieldUpdater):
+    def __init__(self):
+        self.currfieldbox = None
+
+    def getfield_now_known(self, fieldbox):
+        pass
+
+    def setfield(self, fieldbox):
+        pass
+
+dummy_field_updater = DummyFieldUpdater()
+
 
 class HeapCache(object):
     def __init__(self):
@@ -342,12 +355,18 @@
         return self._check_flag(box, HF_KNOWN_CLASS)
 
     def class_now_known(self, box):
+        if isinstance(box, Const):
+            return
         self._set_flag(box, HF_KNOWN_CLASS)
 
     def is_nullity_known(self, box):
+        if isinstance(box, Const):
+            return bool(box.getref_base())
         return self._check_flag(box, HF_KNOWN_NULLITY)
 
     def nullity_now_known(self, box):
+        if isinstance(box, Const):
+            return
         self._set_flag(box, HF_KNOWN_NULLITY)
 
     def is_nonstandard_virtualizable(self, box):
@@ -381,7 +400,8 @@
         return None
 
     def get_field_updater(self, box, descr):
-        assert isinstance(box, RefFrontendOp)
+        if not isinstance(box, RefFrontendOp):
+            return dummy_field_updater
         cache = self.heap_cache.get(descr, None)
         if cache is None:
             cache = self.heap_cache[descr] = CacheEntry(self)
@@ -448,6 +468,8 @@
         # we store in '_heapc_deps' a list of boxes: the *first* box is
         # the known length or None, and the remaining boxes are the
         # regular dependencies.
+        if isinstance(box, Const):
+            return
         deps = self._get_deps(box)
         assert deps is not None
         deps[0] = lengthbox
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -695,7 +695,7 @@
         self.trace.cut_at(cut_at)
 
     def any_operation(self):
-        return self.trace._count > 0
+        return self.trace._count > self.trace._start
 
     @specialize.argtype(2)
     def set_op_value(self, op, value):


More information about the pypy-commit mailing list