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

Reply via email to