[pypy-commit] pypy gc_no_cleanup_nursery: fix

arigo noreply at buildbot.pypy.org
Sun Sep 28 19:09:09 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: gc_no_cleanup_nursery
Changeset: r73737:bf3432da552c
Date: 2014-09-28 18:45 +0200
http://bitbucket.org/pypy/pypy/changeset/bf3432da552c/

Log:	fix

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
@@ -254,7 +254,10 @@
         for i in range(self.getlength()):
             itemvalue = self.get_item_value(i)
             if itemvalue is not None:
-                itemboxes.append(itemvalue.get_key_box())
+                box = itemvalue.get_key_box()
+            else:
+                box = None
+            itemboxes.append(box)
         visitor.register_virtual_fields(self.keybox, itemboxes)
         for i in range(self.getlength()):
             itemvalue = self.get_item_value(i)
@@ -280,9 +283,10 @@
 
     def get_item_value(self, 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."""
+        array.  In that case (or if the i'th item is already None),
+        return None.  The idea is that this method returns the value
+        that must be set into an array that was allocated "correctly",
+        i.e. if 'clear' is True, that means with zero=True."""
         subvalue = self._items[i]
         if self.clear and subvalue is self.constvalue:
             subvalue = None
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
@@ -562,16 +562,19 @@
         # NB. the check for the kind of array elements is moved out of the loop
         if arraydescr.is_array_of_pointers():
             for i in range(length):
-                decoder.setarrayitem_ref(array, i, self.fieldnums[i],
-                                         arraydescr)
+                num = self.fieldnums[i]
+                if not tagged_eq(num, UNINITIALIZED):
+                    decoder.setarrayitem_ref(array, i, num, arraydescr)
         elif arraydescr.is_array_of_floats():
             for i in range(length):
-                decoder.setarrayitem_float(array, i, self.fieldnums[i],
-                                           arraydescr)
+                num = self.fieldnums[i]
+                if not tagged_eq(num, UNINITIALIZED):
+                    decoder.setarrayitem_float(array, i, num, arraydescr)
         else:
             for i in range(length):
-                decoder.setarrayitem_int(array, i, self.fieldnums[i],
-                                         arraydescr)
+                num = self.fieldnums[i]
+                if not tagged_eq(num, UNINITIALIZED):
+                    decoder.setarrayitem_int(array, i, num, arraydescr)
         return array
 
     def debug_prints(self):


More information about the pypy-commit mailing list