[pypy-commit] pypy virtual-dicts: we now have a representation of a list of fielddescrs, I don't understand what generalization_of is supposed to do.

alex_gaynor noreply at buildbot.pypy.org
Tue Oct 25 01:21:31 CEST 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: virtual-dicts
Changeset: r48402:068b20a399e7
Date: 2011-10-24 19:21 -0400
http://bitbucket.org/pypy/pypy/changeset/068b20a399e7/

Log:	we now have a representation of a list of fielddescrs, I don't
	understand what generalization_of is supposed to do.

diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -288,7 +288,6 @@
         self._items[index][descr] = itemvalue
 
     def _really_force(self, optforce):
-        raise NotImplementedError
         assert self.source_op is not None
         if not we_are_translated():
             self.source_op.name = 'FORCE ' + self.source_op.name
@@ -300,20 +299,25 @@
                 op = ResOperation(rop.SETINTERIORFIELD_GC, [box, ConstInt(index), subbox], None, descr=descr)
                 optforce.emit_operation(op)
 
+    def _get_list_of_descrs(self):
+        descrs = []
+        for item in self._items:
+            item_descrs = item.keys()
+            sort_descrs(item_descrs)
+            descrs.append(item_descrs)
+        return descrs
+
     def get_args_for_fail(self, modifier):
         if self.box is None and not modifier.already_seen_virtual(self.keybox):
+            itemdescrs = self._get_list_of_descrs()
             itemboxes = []
-            values = []
-            for items in self._items:
-                descrs = items.keys()
-                sort_descrs(descrs)
-                for descr in descrs:
-                    itemboxes.append(items[descr].get_key_box())
-                    values.append(items[descr])
+            for i in range(len(self._items)):
+                for descr in itemdescrs[i]:
+                    itemboxes.append(self._items[i][descr].get_key_box())
             modifier.register_virtual_fields(self.keybox, itemboxes)
-            for item in values:
-                item.get_args_for_fail(modifier)
-
+            for i in range(len(self._items)):
+                for descr in itemdescrs[i]:
+                    self._items[i][descr].get_args_for_fail(modifier)
 
     def force_at_end_of_preamble(self, already_forced, optforce):
         if self in already_forced:
@@ -325,7 +329,7 @@
         return self
 
     def _make_virtual(self, modifier):
-        return modifier.make_varraystruct(self.arraydescr)
+        return modifier.make_varraystruct(self.arraydescr, self._get_list_of_descrs())
 
 
 class OptVirtualize(optimizer.Optimization):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -194,13 +194,29 @@
         debug_print(indent + 'VArrayStateInfo(%d):' % self.position)
 
 class VArrayStructStateInfo(AbstractVirtualStateInfo):
-    def __init__(self, arraydescr):
+    def __init__(self, arraydescr, fielddescrs):
         self.arraydescr = arraydescr
+        self.fielddescrs = fielddescrs
 
     def _enum(self, virtual_state):
         for s in self.fieldstate:
             s.enum(virtual_state)
 
+    def enum_forced_boxes(self, boxes, value, optimizer):
+        assert isinstance(value, virtualize.VArrayStructValue)
+        assert value.is_virtual()
+        p = 0
+        for i in range(len(self.fielddescrs)):
+            for j in range(len(self.fielddescrs[i])):
+                v = value._items[i][self.fielddescrs[i][j]]
+                s = self.fieldstate[p]
+                if s.position > self.position:
+                    s.enum_forced_boxes(boxes, v, optimizer)
+                p += 1
+
+    def debug_header(self, indent):
+        debug_print(indent + 'VArrayStructStateInfo(%d):' % self.position)
+
 
 class NotVirtualStateInfo(AbstractVirtualStateInfo):
     def __init__(self, value):
@@ -471,8 +487,8 @@
     def make_varray(self, arraydescr):
         return VArrayStateInfo(arraydescr)
 
-    def make_varraystruct(self, arraydescr):
-        return VArrayStructStateInfo(arraydescr)
+    def make_varraystruct(self, arraydescr, fielddescrs):
+        return VArrayStructStateInfo(arraydescr, fielddescrs)
 
 class BoxNotProducable(Exception):
     pass
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -273,8 +273,8 @@
     def make_varray(self, arraydescr):
         return VArrayInfo(arraydescr)
 
-    def make_varraystruct(self, arraydescr):
-        return VArrayStructInfo(arraydescr)
+    def make_varraystruct(self, arraydescr, fielddescrs):
+        return VArrayStructInfo(arraydescr, fielddescrs)
 
     def make_vstrplain(self, is_unicode=False):
         if is_unicode:
@@ -541,8 +541,9 @@
             debug_print("\t\t", str(untag(i)))
 
 class VArrayStructInfo(AbstractVirtualInfo):
-    def __init__(self, arraydescr):
+    def __init__(self, arraydescr, fielddescrs):
         self.arraydescr = arraydescr
+        self.fielddescrs = fielddescrs
 
     def debug_prints(self):
         debug_print("\tvarraystructinfo", self.arraydescr)


More information about the pypy-commit mailing list