Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77806:240e3bad4204
Date: 2015-06-03 09:38 +0200
http://bitbucket.org/pypy/pypy/changeset/240e3bad4204/
Log: fight resume of virtual arrays of structs
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -219,6 +219,9 @@
def get_arraydescr(self):
return self.arraydescr
+ def get_fielddescr(self):
+ return self.fielddescr
+
def __repr__(self):
return 'InteriorFieldDescr(%r, %r)' % (self.A, self.fieldname)
diff --git a/rpython/jit/metainterp/optimizeopt/info.py
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -238,7 +238,7 @@
def visitor_walk_recursive(self, instbox, visitor, optimizer):
itemops = [optimizer.get_box_replacement(item)
- for item in self._items if item]
+ for item in self._items]
visitor.register_virtual_fields(instbox, itemops)
for i in range(self.getlength()):
itemop = self._items[i]
@@ -289,6 +289,29 @@
i += 1
return count
+ def visitor_walk_recursive(self, instbox, visitor, optimizer):
+ itemops = [optimizer.get_box_replacement(item)
+ for item in self._items]
+ visitor.register_virtual_fields(instbox, itemops)
+ fielddescrs = self.vdescr.get_all_fielddescrs()
+ i = 0
+ for index in range(self.getlength()):
+ for flddescr in fielddescrs:
+ itemop = self._items[i]
+ if (itemop is not None and itemop.type == 'r' and
+ not isinstance(itemop, Const)):
+ ptrinfo = optimizer.getptrinfo(itemop)
+ if ptrinfo and ptrinfo.is_virtual():
+ ptrinfo.visitor_walk_recursive(itemop, visitor,
+ optimizer)
+ i += 1
+
+ @specialize.argtype(1)
+ def visitor_dispatch_virtual_type(self, visitor):
+ flddescrs = self.vdescr.get_all_fielddescrs()
+ return visitor.visit_varraystruct(self.vdescr, self.getlength(),
+ flddescrs)
+
class ConstPtrInfo(PtrInfo):
_attrs_ = ('_const',)
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
@@ -314,8 +314,8 @@
else:
return VArrayInfoNotClear(arraydescr)
- def visit_varraystruct(self, arraydescr, fielddescrs):
- return VArrayStructInfo(arraydescr, fielddescrs)
+ def visit_varraystruct(self, arraydescr, size, fielddescrs):
+ return VArrayStructInfo(arraydescr, size, fielddescrs)
def visit_vrawbuffer(self, size, offsets, descrs):
return VRawBufferInfo(size, offsets, descrs)
@@ -676,7 +676,8 @@
class VArrayStructInfo(AbstractVirtualInfo):
- def __init__(self, arraydescr, fielddescrs):
+ def __init__(self, arraydescr, size, fielddescrs):
+ self.size = size
self.arraydescr = arraydescr
self.fielddescrs = fielddescrs
@@ -687,14 +688,16 @@
@specialize.argtype(1)
def allocate(self, decoder, index):
- array = decoder.allocate_array(len(self.fielddescrs), self.arraydescr,
+ array = decoder.allocate_array(self.size, self.arraydescr,
clear=True)
decoder.virtuals_cache.set_ptr(index, array)
p = 0
- for i in range(len(self.fielddescrs)):
- for j in range(len(self.fielddescrs[i])):
- decoder.setinteriorfield(i, array, self.fieldnums[p],
- self.fielddescrs[i][j])
+ for i in range(self.size):
+ for j in range(len(self.fielddescrs)):
+ num = self.fieldnums[p]
+ if not tagged_eq(num, UNINITIALIZED):
+ decoder.setinteriorfield(i, array, num,
+ self.fielddescrs[j])
p += 1
return array
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit