[pypy-svn] r63037 - pypy/branch/virtualizable-specnodes/pypy/jit/metainterp

fijal at codespeak.net fijal at codespeak.net
Wed Mar 18 15:51:39 CET 2009


Author: fijal
Date: Wed Mar 18 15:51:38 2009
New Revision: 63037

Modified:
   pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py
   pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py
Log:
Remove terrible hacks by creating a BoxRetriever class


Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py	Wed Mar 18 15:51:38 2009
@@ -6,7 +6,7 @@
      VirtualInstanceSpecNode, VirtualizableSpecNode, NotSpecNode,
      DelayedSpecNode, SpecNodeWithBox, DelayedFixedListSpecNode,
      VirtualFixedListSpecNode, MatchEverythingSpecNode,
-     VirtualizableListSpecNode, av_eq, av_hash)
+     VirtualizableListSpecNode, av_eq, av_hash, BoxRetriever)
 from pypy.jit.metainterp import executor
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rpython.lltypesystem import lltype, llmemory
@@ -503,19 +503,13 @@
 
     def expanded_version_of(self, boxlist, oplist):
         # oplist is None means at the start
-        newboxlist = []
+        newboxes = BoxRetriever()
         assert len(boxlist) == len(self.specnodes)
         for i in range(len(boxlist)):
             box = boxlist[i]
             specnode = self.specnodes[i]
-            specnode.expand_boxlist(self.nodes[box], newboxlist, oplist)
-        l = []
-        for i, (group, arg) in enumerate(newboxlist):
-            l.append((group, i, arg))
-        l.sort()
-        return [e[2] for e in l]
-
-        return newboxlist
+            specnode.expand_boxlist(self.nodes[box], newboxes, oplist)
+        return newboxes.flatten()
 
     def deal_with_boxes(self, boxes):
         storage = AllocationStorage()
@@ -836,14 +830,13 @@
         old_mp = old_operations[0]
         jump_op = self.loop.operations[-1]
         self.specnodes = old_mp.specnodes
-        newboxlist = []
+        newboxlist = BoxRetriever()
         extensions = []
         for i in range(len(old_mp.specnodes)):
             old_specnode = old_mp.specnodes[i]
             new_instnode = self.nodes[jump_op.args[i]]
             old_specnode.adapt_to(new_instnode, newboxlist, extensions, num)
-        newboxlist = [i for _, i in newboxlist]
-        return newboxlist, extensions
+        return newboxlist.flatten(), extensions
 
 class Chooser(object):
     def __init__(self, boxes_from_frame, allocated_boxes, allocated_lists):

Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py	Wed Mar 18 15:51:38 2009
@@ -17,6 +17,7 @@
 from pypy.jit.metainterp import codewriter, optimize, executor
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.objectmodel import specialize
+from pypy.jit.metainterp.specnode import BoxRetriever
 
 # ____________________________________________________________
 
@@ -894,15 +895,11 @@
         if mp.specnodes is None:     # it is None only for tests
             return args
         assert len(mp.specnodes) == len(args)
-        expanded_args = []
+        expanded_args = BoxRetriever()
         for i in range(len(mp.specnodes)):
             specnode = mp.specnodes[i]
             specnode.extract_runtime_data(self.cpu, args[i], expanded_args)
-        l = []
-        for i, (group, arg) in enumerate(expanded_args):
-            l.append((group, i, arg))
-        l.sort()
-        return [e[2] for e in l]
+        return expanded_args.flatten()
 
     def _initialize_from_start(self, original_boxes, num_green_args, *args):
         if args:

Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py	(original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py	Wed Mar 18 15:51:38 2009
@@ -8,13 +8,35 @@
 def av_hash(self):
     return self.sort_key()
 
+class BoxRetriever(object):
+    def __init__(self):
+        self.lists = [[]]
+        self.current = self.lists[0]
+
+    def flatten(self):
+        res = self.lists[0]
+        for i in range(1, len(self.lists)):
+            res.extend(self.lists[i])
+        return res
+
+    def extend(self, group):
+        while len(self.lists) <= group:
+            self.lists.append([])
+        self.current = self.lists[group]
+
+    def append(self, box):
+        self.current.append(box)
+
+    def reset(self):
+        self.current = self.lists[0]
+
 class SpecNode(object):
 
-    def expand_boxlist(self, instnode, newboxlist, start):
-        newboxlist.append((0, instnode.source))
+    def expand_boxlist(self, instnode, newboxes, start):
+        newboxes.append(instnode.source)
 
     def extract_runtime_data(self, cpu, valuebox, resultlist):
-        resultlist.append((0, valuebox))
+        resultlist.append(valuebox)
 
     def adapt_to(self, instnode, newboxlist, newspecnodes, num):
         instnode.escaped = True
@@ -33,15 +55,15 @@
         self.redirect_to = specnode
         self.group = group
 
-    def expand_boxlist(self, instnode, newboxlist, start):
-        l = []
-        self.redirect_to.expand_boxlist(instnode, l, start)
-        newboxlist.extend([(self.group, e) for _, e in l])
-
-    def extract_runtime_data(self, cpu, valuebox, resultlist):
-        l = []
-        self.redirect_to.extract_runtime_data(cpu, valuebox, l)
-        resultlist.extend([(self.group, e) for _, e in l])
+    def expand_boxlist(self, instnode, newboxes, start):
+        newboxes.extend(self.group)
+        self.redirect_to.expand_boxlist(instnode, newboxes, start)
+        newboxes.reset()
+
+    def extract_runtime_data(self, cpu, valuebox, result):
+        result.extend(self.group)
+        self.redirect_to.extract_runtime_data(cpu, valuebox, result)
+        result.reset()
 
     def adapt_to(self, *args):
         self.redirect_to.adapt_to(*args)
@@ -167,11 +189,11 @@
 class VirtualizedOrDelayedSpecNode(SpecNodeWithFields):
     
     def expand_boxlist(self, instnode, newboxlist, start):
-        newboxlist.append((0, instnode.source))
+        newboxlist.append(instnode.source)
         SpecNodeWithFields.expand_boxlist(self, instnode, newboxlist, start)
 
     def extract_runtime_data(self, cpu, valuebox, resultlist):
-        resultlist.append((0, valuebox))
+        resultlist.append(valuebox)
         SpecNodeWithFields.extract_runtime_data(self, cpu, valuebox, resultlist)
 
     def adapt_to(self, instnode, newboxlist, newspecnodes, num):
@@ -183,21 +205,21 @@
 
     def expand_boxlist(self, instnode, newboxlist, oplist):
         from pypy.jit.metainterp.history import AbstractDescr
-        newboxlist.append((0, instnode.source))
+        newboxlist.append(instnode.source)
         for ofs, subspecnode in self.fields:
             assert isinstance(subspecnode, SpecNodeWithBox)
             if oplist is None:
                 instnode.cleanfields[ofs] = instnode.origfields[ofs]
-                newboxlist.append((0, instnode.curfields[ofs].source))
+                newboxlist.append(instnode.curfields[ofs].source)
             else:
                 if ofs in instnode.cleanfields:
-                    newboxlist.append((0, instnode.cleanfields[ofs].source))
+                    newboxlist.append(instnode.cleanfields[ofs].source)
                 else:
                     box = subspecnode.box.clonebox()
                     assert isinstance(ofs, AbstractDescr)
                     oplist.append(ResOperation(rop.GETFIELD_GC,
                        [instnode.source], box, ofs))
-                    newboxlist.append((0, box))
+                    newboxlist.append(box)
 
 class DelayedFixedListSpecNode(DelayedSpecNode):
 
@@ -206,7 +228,7 @@
        from pypy.jit.metainterp.resoperation import rop
        from pypy.jit.metainterp.optimize import FixedList
         
-       newboxlist.append((0, instnode.source))
+       newboxlist.append(instnode.source)
        cls = self.known_class
        assert isinstance(cls, FixedList)
        arraydescr = cls.arraydescr
@@ -214,22 +236,22 @@
            assert isinstance(subspecnode, SpecNodeWithBox)
            if oplist is None:
                instnode.cleanfields[ofs] = instnode.origfields[ofs]
-               newboxlist.append((0, instnode.curfields[ofs].source))
+               newboxlist.append(instnode.curfields[ofs].source)
            else:
                if ofs in instnode.cleanfields:
-                   newboxlist.append((0, instnode.cleanfields[ofs].source))
+                   newboxlist.append(instnode.cleanfields[ofs].source)
                else:
                    box = subspecnode.box.clonebox()
                    oplist.append(ResOperation(rop.GETARRAYITEM_GC,
                       [instnode.source, ofs], box, arraydescr))
-                   newboxlist.append((0, box))
+                   newboxlist.append(box)
 
    def extract_runtime_data(self, cpu, valuebox, resultlist):
        from pypy.jit.metainterp.resoperation import rop
        from pypy.jit.metainterp.optimize import FixedList
        from pypy.jit.metainterp.history import check_descr
        
-       resultlist.append((0, valuebox))
+       resultlist.append(valuebox)
        cls = self.known_class
        assert isinstance(cls, FixedList)
        arraydescr = cls.arraydescr
@@ -293,7 +315,7 @@
         from pypy.jit.metainterp.optimize import FixedList
         from pypy.jit.metainterp.history import check_descr
 
-        resultlist.append((0, valuebox))
+        resultlist.append(valuebox)
         cls = self.known_class
         assert isinstance(cls, FixedList)
         arraydescr = cls.arraydescr



More information about the Pypy-commit mailing list