[pypy-svn] r66308 - in pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Fri Jul 17 17:07:24 CEST 2009


Author: arigo
Date: Fri Jul 17 17:07:23 2009
New Revision: 66308

Modified:
   pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py
Log:
VirtualInstanceSpecNode.


Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py	Fri Jul 17 17:07:23 2009
@@ -1,6 +1,9 @@
 from pypy.rlib.objectmodel import r_dict
 from pypy.rlib.unroll import unrolling_iterable
-from pypy.jit.metainterp import resoperation, specnode
+from pypy.jit.metainterp import resoperation
+from pypy.jit.metainterp.specnode import prebuiltNotSpecNode
+from pypy.jit.metainterp.specnode import FixedClassSpecNode
+from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
 from pypy.jit.metainterp.history import AbstractValue
 
 
@@ -157,16 +160,55 @@
     def intersect(self, inputnode, exitbox):
         assert inputnode.fromstart
         exitnode = self.getnode(exitbox)
+        if exitnode.knownclsbox is None:
+            return prebuiltNotSpecNode     # no known class at exit
+        if (inputnode.knownclsbox is not None and
+            not inputnode.knownclsbox.equals(exitnode.knownclsbox)):
+            return prebuiltNotSpecNode     # mismatched known class at exit
+        #
+        # for the sequel, we know that the class is known and matches
         if inputnode.escaped or exitnode.escaped or exitnode.fromstart:
-            if (inputnode.knownclsbox is not None and
-                exitnode.knownclsbox is not None and
-                inputnode.knownclsbox.equals(exitnode.knownclsbox)):
-                return specnode.FixedClassSpecNode(inputnode.knownclsbox)
-            else:
-                return specnode.prebuiltNotSpecNode
+            if inputnode.knownclsbox is None:
+                return prebuiltNotSpecNode      # class not needed at input
+            return FixedClassSpecNode(exitnode.knownclsbox)
         else:
-            xxx #...
+            fields = []
+            d = exitnode.curfields
+            lst = d.keys()
+            sort_descrs(lst)
+            for ofs in lst:
+                if ofs not in inputnode.origfields:
+                    # field stored at exit, but not read at input.  Must
+                    # still be allocated, otherwise it will be incorrectly
+                    # uninitialized after a guard failure.
+                    inputnode.origfields[ofs] = InstanceNode(escaped=False,
+                                                             fromstart=True)
+                specnode = self.intersect(inputnode.origfields[ofs], d[ofs])
+                fields.append((ofs, specnode))
+            return VirtualInstanceSpecNode(exitnode.knownclsbox, fields)
 
 find_nodes_ops = _findall(PerfectSpecializationFinder, 'find_nodes_')
 
 # ____________________________________________________________
+
+def partition(array, left, right):
+    last_item = array[right]
+    pivot = last_item.sort_key()
+    storeindex = left
+    for i in range(left, right):
+        if array[i].sort_key() <= pivot:
+            array[i], array[storeindex] = array[storeindex], array[i]
+            storeindex += 1
+    # Move pivot to its final place
+    array[storeindex], array[right] = last_item, array[storeindex]
+    return storeindex
+
+def quicksort(array, left, right):
+    # sort array[left:right+1] (i.e. bounds included)
+    if right > left:
+        pivotnewindex = partition(array, left, right)
+        quicksort(array, left, pivotnewindex - 1)
+        quicksort(array, pivotnewindex + 1, right)
+
+def sort_descrs(lst):
+    quicksort(lst, 0, len(lst)-1)

Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py	(original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py	Fri Jul 17 17:07:23 2009
@@ -1,4 +1,4 @@
-import py
+import py, random
 
 from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.rpython.ootypesystem import ootype
@@ -6,8 +6,10 @@
 
 from pypy.jit.backend.llgraph import runner
 from pypy.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt, ConstPtr,
-                                         Const, ConstAddr, TreeLoop, BoxObj)
+                                         Const, ConstAddr, TreeLoop, BoxObj,
+                                         AbstractDescr)
 from pypy.jit.metainterp.optimize import PerfectSpecializationFinder
+from pypy.jit.metainterp.optimize import sort_descrs
 from pypy.jit.metainterp.specnode import NotSpecNode, FixedClassSpecNode
 from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
 from pypy.jit.metainterp.test.oparser import parse
@@ -51,6 +53,18 @@
     py.test.raises(AssertionError,
                    "equaloplists(loop1.operations, loop3.operations)")
 
+def test_sort_descrs():
+    class PseudoDescr(AbstractDescr):
+        def __init__(self, n):
+            self.n = n
+        def sort_key(self):
+            return self.n
+    lst = [PseudoDescr(2), PseudoDescr(3), PseudoDescr(6)]
+    lst2 = lst[:]
+    random.shuffle(lst2)
+    sort_descrs(lst2)
+    assert lst2 == lst
+
 # ____________________________________________________________
 
 class LLtypeMixin(object):
@@ -277,7 +291,6 @@
         assert [sn.__class__ for sn in specnodes] == [NotSpecNode]
 
     def test_find_nodes_new(self):
-        py.test.skip("VirtualInstanceSpecNode in-progress")
         ops = """
         [sum, p1]
         guard_class(p1, ConstClass(node_vtable))



More information about the Pypy-commit mailing list