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