[pypy-commit] pypy gc_no_cleanup_nursery: Tweaks tweaks tweaks: pass around the 'clear' information to resume.py.

arigo noreply at buildbot.pypy.org
Thu Sep 25 20:03:40 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: gc_no_cleanup_nursery
Changeset: r73709:2e8918763cd6
Date: 2014-09-25 19:59 +0200
http://bitbucket.org/pypy/pypy/changeset/2e8918763cd6/

Log:	Tweaks tweaks tweaks: pass around the 'clear' information to
	resume.py. Don't pass it around to virtualstate.py, but that might
	just be ok; see comment added to this file.

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
@@ -279,7 +279,14 @@
         return len(self._items)
 
     def get_item_value(self, i):
-        return self._items[i]
+        """Return the i'th item, unless it is 'constvalue' on a 'clear'
+        array.  In that case, return None.  The idea is that this
+        method returns the value that must be set into an array that
+        was allocated with zero=True if 'clear' is True."""
+        subvalue = self._items[i]
+        if self.clear and subvalue is self.constvalue:
+            subvalue = None
+        return subvalue
 
     def set_item_value(self, i, newval):
         self._items[i] = newval
@@ -300,7 +307,7 @@
             return self
         already_forced[self] = self
         for index in range(self.getlength()):
-            itemval = self.get_item_value(index)
+            itemval = self._items[index]
             # XXX should be skip alltogether, but I don't wanna know or
             #     fight unrolling just yet
             if itemval is None:
@@ -330,7 +337,7 @@
 
     @specialize.argtype(1)
     def _visitor_dispatch_virtual_type(self, visitor):
-        return visitor.visit_varray(self.arraydescr)
+        return visitor.visit_varray(self.arraydescr, self.clear)
 
 
 class VArrayStructValue(AbstractVirtualValue):
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
@@ -563,7 +563,10 @@
     def visit_vstruct(self, typedescr, fielddescrs):
         return VStructStateInfo(typedescr, fielddescrs)
 
-    def visit_varray(self, arraydescr):
+    def visit_varray(self, arraydescr, clear):
+        # 'clear' is ignored here.  I *think* it is correct, because so
+        # far in force_at_end_of_preamble() we force all array values
+        # to be non-None, so clearing is not important any more
         return VArrayStateInfo(arraydescr)
 
     def visit_varraystruct(self, arraydescr, fielddescrs):
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
@@ -295,8 +295,11 @@
     def visit_vstruct(self, typedescr, fielddescrs):
         return VStructInfo(typedescr, fielddescrs)
 
-    def visit_varray(self, arraydescr):
-        return VArrayInfo(arraydescr)
+    def visit_varray(self, arraydescr, clear):
+        if clear:
+            return VArrayInfoClear(arraydescr)
+        else:
+            return VArrayInfoNotClear(arraydescr)
 
     def visit_varraystruct(self, arraydescr, fielddescrs):
         return VArrayStructInfo(arraydescr, fielddescrs)
@@ -545,7 +548,7 @@
         debug_print("\tvstructinfo", self.typedescr.repr_rpython(), " at ",  compute_unique_id(self))
         AbstractVirtualStructInfo.debug_prints(self)
 
-class VArrayInfo(AbstractVirtualInfo):
+class AbstractVArrayInfo(AbstractVirtualInfo):
     def __init__(self, arraydescr):
         self.arraydescr = arraydescr
         #self.fieldnums = ...
@@ -554,7 +557,7 @@
     def allocate(self, decoder, index):
         length = len(self.fieldnums)
         arraydescr = self.arraydescr
-        array = decoder.allocate_array(length, arraydescr)
+        array = decoder.allocate_array(length, arraydescr, self.clear)
         decoder.virtuals_cache.set_ptr(index, array)
         # NB. the check for the kind of array elements is moved out of the loop
         if arraydescr.is_array_of_pointers():
@@ -572,11 +575,19 @@
         return array
 
     def debug_prints(self):
-        debug_print("\tvarrayinfo", self.arraydescr, " at ",  compute_unique_id(self))
+        debug_print("\tvarrayinfo", self.arraydescr, " at ",
+                    compute_unique_id(self), " clear=", self.clear)
         for i in self.fieldnums:
             debug_print("\t\t", str(untag(i)))
 
 
+class VArrayInfoClear(AbstractVArrayInfo):
+    clear = True
+
+class VArrayInfoNotClear(AbstractVArrayInfo):
+    clear = False
+
+
 class VAbstractRawInfo(AbstractVirtualInfo):
     kind = INT
     is_about_raw = True
@@ -637,7 +648,8 @@
 
     @specialize.argtype(1)
     def allocate(self, decoder, index):
-        array = decoder.allocate_array(len(self.fielddescrs), self.arraydescr)
+        array = decoder.allocate_array(len(self.fielddescrs), self.arraydescr,
+                                       clear=True)
         decoder.virtuals_cache.set_ptr(index, array)
         p = 0
         for i in range(len(self.fielddescrs)):
@@ -979,13 +991,12 @@
     def allocate_struct(self, typedescr):
         return self.metainterp.execute_new(typedescr)
 
-    def allocate_array(self, length, arraydescr):
+    def allocate_array(self, length, arraydescr, clear):
         lengthbox = ConstInt(length)
-        if (arraydescr.is_array_of_structs() or
-            arraydescr.is_array_of_pointers()):
+        if clear:
             return self.metainterp.execute_new_array_clear(arraydescr,
                                                            lengthbox)
-        return self.metainterp.execute_new_array(arraydescr, lengthbox)        
+        return self.metainterp.execute_new_array(arraydescr, lengthbox)
 
     def allocate_raw_buffer(self, size):
         cic = self.metainterp.staticdata.callinfocollection
@@ -1306,9 +1317,8 @@
     def allocate_struct(self, typedescr):
         return self.cpu.bh_new(typedescr)
 
-    def allocate_array(self, length, arraydescr):
-        if (arraydescr.is_array_of_structs() or
-            arraydescr.is_array_of_pointers()):
+    def allocate_array(self, length, arraydescr, clear):
+        if clear:
             return self.cpu.bh_new_array_clear(length, arraydescr)
         return self.cpu.bh_new_array(length, arraydescr)
 
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
@@ -354,7 +354,8 @@
         return FakeBuiltObject(vtable=known_class)
     def allocate_struct(self, typedescr):
         return FakeBuiltObject(typedescr=typedescr)
-    def allocate_array(self, length, arraydescr):
+    def allocate_array(self, length, arraydescr, clear):
+        assert not clear     # the only test uses VArrayInfoNotClear
         return FakeBuiltObject(arraydescr=arraydescr, items=[None]*length)
     def setfield(self, struct, fieldnum, descr):
         setattr(struct, descr, fieldnum)
@@ -419,7 +420,7 @@
 
 def test_varrayinfo():
     arraydescr = FakeArrayDescr()
-    info = VArrayInfo(arraydescr)
+    info = VArrayInfoNotClear(arraydescr)
     info.fieldnums = [tag(456, TAGINT)]
     reader = FakeResumeDataReader()
     reader._prepare_virtuals([info])


More information about the pypy-commit mailing list