[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