[pypy-commit] pypy optresult: whack whack whack

fijal noreply at buildbot.pypy.org
Tue May 26 14:07:12 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77574:5dd0334a5f3b
Date: 2015-05-26 14:07 +0200
http://bitbucket.org/pypy/pypy/changeset/5dd0334a5f3b/

Log:	whack whack whack

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
@@ -126,6 +126,19 @@
                 count += 1
         return count
 
+    def visitor_walk_recursive(self, instbox, visitor, optimizer):
+        if visitor.already_seen_virtual(instbox):
+            return
+        lst = self.vdescr.all_fielddescrs
+        assert self.is_virtual()
+        visitor.register_virtual_fields(instbox, [box for box in self._fields])
+        for i in range(len(lst)):
+            op = self._fields[i]
+            if op and op.type == 'r':
+                fieldinfo = optimizer.getptrinfo(op)
+                if fieldinfo and fieldinfo.is_virtual():
+                    fieldinfo.visitor_walk_recursive(op, visitor, optimizer)
+
 class InstancePtrInfo(AbstractStructPtrInfo):
     _attrs_ = ('_known_class',)
     _fields = None
@@ -137,18 +150,6 @@
     def get_known_class(self, cpu):
         return self._known_class
 
-    def visitor_walk_recursive(self, instbox, visitor):
-        if visitor.already_seen_virtual(instbox):
-            return
-        #lst = op.getdescr().parent_descr.all_fielddescrs
-        assert self.is_virtual()
-        visitor.register_virtual_fields(instbox,
-                                        [box for box in self._fields if box])
-        #for i in range(len(lst)):
-        #    descr = lst[descr]
-        #    fieldvalue = self._fields[ofs]
-        #    fieldvalue.visitor_walk_recursive(visitor)
-
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
         fielddescrs = self.vdescr.all_fielddescrs
@@ -158,9 +159,15 @@
 class StructPtrInfo(AbstractStructPtrInfo):
     def __init__(self, vdescr=None):
         self.vdescr = vdescr
-    
+
+    @specialize.argtype(1)
+    def visitor_dispatch_virtual_type(self, visitor):
+        fielddescrs = self.vdescr.all_fielddescrs
+        assert self.is_virtual()
+        return visitor.visit_vstruct(self.vdescr, fielddescrs)
+
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
-    _attrs_ = ('length', '_items', 'lenbound')
+    _attrs_ = ('length', '_items', 'lenbound', '_clear')
 
     _items = None
     lenbound = None
@@ -170,6 +177,7 @@
         self.vdescr = vdescr
         if vdescr is not None:
             self._init_items(const, size, clear)
+        self._clear = clear
 
     def _init_items(self, const, size, clear):
         self.length = size
@@ -211,6 +219,19 @@
     def getlength(self):
         return self.length
 
+    def visitor_walk_recursive(self, instbox, visitor, optimizer):
+        itemops = [item for item in self._items if item]
+        visitor.register_virtual_fields(instbox, itemops)
+        for i in range(self.getlength()):
+            itemop = self._items[i]
+            if itemop is not None and itemop.type == 'r':
+                xxxx
+                itemvalue.visitor_walk_recursive(visitor)
+
+    @specialize.argtype(1)
+    def visitor_dispatch_virtual_type(self, visitor):
+        return visitor.visit_varray(self.vdescr, self._clear)
+
 class ArrayStructInfo(ArrayPtrInfo):
     def __init__(self, size, vdescr=None):
         self.length = size
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
@@ -391,7 +391,7 @@
             else:
                 assert tagbits == TAGVIRTUAL
                 info = optimizer.getptrinfo(box)
-                info.visitor_walk_recursive(box, self)
+                info.visitor_walk_recursive(box, self, optimizer)
 
         for setfield_op in pending_setfields:
             box = setfield_op.getarg(0)
@@ -400,7 +400,7 @@
             self.register_box(fieldbox)
             info = optimizer.getptrinfo(fieldbox)
             assert info is not None and info.is_virtual()
-            info.visitor_walk_recursive(fieldbox, self)
+            info.visitor_walk_recursive(fieldbox, self, optimizer)
 
         self._number_virtuals(liveboxes, optimizer, v)
         self._add_pending_fields(pending_setfields)
@@ -482,6 +482,8 @@
                 box = op.getarg(0)
                 fieldbox = op.getarg(1)
                 descr = op.getdescr()
+                if op.getopnum() == rop.SETARRAYITEM_GC:
+                    xxx
                 #descr, box, fieldbox, itemindex = pending_setfields[i]
                 lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
                 num = self._gettagged(box)
@@ -494,7 +496,7 @@
                 rd_pendingfields[i].lldescr = lldescr
                 rd_pendingfields[i].num = num
                 rd_pendingfields[i].fieldnum = fieldnum
-                rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, 0) # XXXX itemindex
+                rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, -1) # XXXX itemindex
         self.storage.rd_pendingfields = rd_pendingfields
 
     def _gettagged(self, box):
@@ -531,7 +533,9 @@
     def setfields(self, decoder, struct):
         for i in range(len(self.fielddescrs)):
             descr = self.fielddescrs[i]
-            decoder.setfield(struct, self.fieldnums[i], descr)
+            num = self.fieldnums[i]
+            if not tagged_eq(num, UNINITIALIZED):
+                decoder.setfield(struct, num, descr)
         return struct
 
     def debug_prints(self):


More information about the pypy-commit mailing list