Author: Armin Rigo <[email protected]>
Branch: gc_no_cleanup_nursery
Changeset: r73739:baa552df4768
Date: 2014-09-28 19:04 +0200
http://bitbucket.org/pypy/pypy/changeset/baa552df4768/

Log:    Merge heads, and fix the test

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
@@ -257,6 +257,9 @@
     def setinteriorfield(self, index, ofs, value):
         raise NotImplementedError
 
+    def get_missing_null_value(self):
+        raise NotImplementedError    # only for VArrayValue
+
 
 class ConstantValue(OptValue):
     def __init__(self, box):
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)
@@ -278,11 +281,15 @@
     def getlength(self):
         return len(self._items)
 
+    def get_missing_null_value(self):
+        return self.constvalue
+
     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 or
                            subvalue.is_null()):
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
@@ -535,9 +535,14 @@
             self.info[box] = info = value.visitor_dispatch_virtual_type(self)
             if value.is_virtual():
                 flds = self.fieldboxes[box]
-                info.fieldstate = [self.state(b) for b in flds]
+                info.fieldstate = [self.state_or_none(b, value) for b in flds]
         return info
 
+    def state_or_none(self, box, value):
+        if box is None:
+            box = value.get_missing_null_value().box
+        return self.state(box)
+
     def get_virtual_state(self, jump_args):
         self.optimizer.force_at_end_of_preamble()
         already_forced = {}
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):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to