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

fijal at codespeak.net fijal at codespeak.net
Thu Feb 12 15:43:59 CET 2009


Author: fijal
Date: Thu Feb 12 15:43:57 2009
New Revision: 61786

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
Log:
(arigo, fijal)
First (very simple) test about virtualizables passes


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	Thu Feb 12 15:43:57 2009
@@ -5,7 +5,6 @@
 class CancelInefficientLoop(Exception):
     pass
 
-
 class FixedClassSpecNode(object):
     def __init__(self, known_class):
         self.known_class = known_class
@@ -22,6 +21,17 @@
             return False
         return instnode.cls.source.equals(self.known_class)
 
+class VirtualizableSpecNode(FixedClassSpecNode):
+    def __init__(self, known_class, fields):
+        FixedClassSpecNode.__init__(self, known_class)
+        self.fields = fields
+
+    def equals(self, other):
+        xxx
+
+    def matches(self, instnode):
+        xxx
+
 class VirtualInstanceSpecNode(FixedClassSpecNode):
     def __init__(self, known_class, fields):
         FixedClassSpecNode.__init__(self, known_class)
@@ -58,7 +68,6 @@
                 return False
         return True
 
-
 class AllocationStorage(object):
     def __init__(self):
         # allocations: list of vtables to allocate
@@ -145,7 +154,7 @@
             known_class = self.cls.source
         else:
             known_class = other.cls.source
-        if other.escaped:
+        if other.escaped and not other.virtualized:
             if self.cls is None:
                 return None
             return FixedClassSpecNode(known_class)
@@ -159,6 +168,8 @@
                 self.origfields[ofs] = InstanceNode(node.source.clonebox())
                 specnode = None
             fields.append((ofs, specnode))
+        if other.escaped:
+            return VirtualizableSpecNode(known_class, fields)
         return VirtualInstanceSpecNode(known_class, fields)
 
     def adapt_to(self, specnode):
@@ -267,9 +278,11 @@
                 if instnode.cls is None:
                     instnode.cls = InstanceNode(op.args[1])
                 continue
-            elif opname.startswith('guard_nonvirtualized_'):
+            elif opname == 'guard_nonvirtualized':
                 instnode = self.getnode(op.args[0])
                 instnode.virtualized = True
+                if instnode.cls is None:
+                    instnode.cls = InstanceNode(op.args[1])
                 continue
             elif opname not in ('oois', 'ooisnot',
                                 'ooisnull', 'oononnull'):
@@ -319,7 +332,8 @@
                 instnode.cls = InstanceNode(specnode.known_class)
             else:
                 assert instnode.cls.source.equals(specnode.known_class)
-            if isinstance(specnode, VirtualInstanceSpecNode):
+            if isinstance(specnode, (VirtualInstanceSpecNode,
+                                     VirtualizableSpecNode)):
                 curfields = {}
                 for ofs, subspecnode in specnode.fields:
                     subinstnode = instnode.origfields[ofs]
@@ -327,7 +341,8 @@
                     self.mutate_nodes(subinstnode, subspecnode)
                     curfields[ofs] = subinstnode
                 instnode.curfields = curfields
-                instnode.virtual = True
+                if isinstance(specnode, VirtualInstanceSpecNode):
+                    instnode.virtual = True
 
     def expanded_version_of(self, boxlist):
         newboxlist = []
@@ -341,7 +356,8 @@
     def expanded_version_of_rec(self, specnode, instnode, newboxlist):
         if not isinstance(specnode, VirtualInstanceSpecNode):
             newboxlist.append(instnode.source)
-        else:
+        if isinstance(specnode, (VirtualInstanceSpecNode,
+                                 VirtualizableSpecNode)):
             for ofs, subspecnode in specnode.fields:
                 subinstnode = instnode.curfields[ofs]  # should really be there
                 self.expanded_version_of_rec(subspecnode, subinstnode,
@@ -411,7 +427,7 @@
                 op = self.optimize_guard(op)
                 newoperations.append(op)
                 continue
-            elif opname.startswith('guard_nonvirtualized_'):
+            elif opname == 'guard_nonvirtualized':
                 instnode = self.nodes[op.args[0]]
                 if instnode.virtualized:
                     continue

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py	Thu Feb 12 15:43:57 2009
@@ -5,9 +5,11 @@
 from pypy.jit.metainterp import heaptracker
 from pypy.jit.metainterp.history import (ResOperation, MergePoint, Jump,
                                          ConstInt, ConstAddr, BoxInt, BoxPtr)
-from pypy.jit.metainterp.optimize import PerfectSpecializer
+from pypy.jit.metainterp.optimize import (PerfectSpecializer,
+                                          VirtualizableSpecNode)
 from pypy.jit.metainterp.virtualizable import VirtualizableDesc
-from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable)
+from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
+                                                    equaloplists)
 
 # ____________________________________________________________
 
@@ -55,8 +57,8 @@
 # ____________________________________________________________
 
 class A:
-    ofs_node = runner.CPU.offsetof(XY, 'node')
-    ofs_value = runner.CPU.offsetof(NODE, 'value')
+    ofs_node = runner.CPU.fielddescrof(XY, 'node')
+    ofs_value = runner.CPU.fielddescrof(NODE, 'value')
     size_of_node = runner.CPU.sizeof(NODE)
     #
     frame = lltype.malloc(XY)
@@ -74,7 +76,8 @@
     sum2 = BoxInt(0 + frame.node.value)
     ops = [
         MergePoint('merge_point', [sum, fr], []),
-        ResOperation('guard_nonvirtualized__4', [fr, ConstInt(ofs_node)], []),
+        ResOperation('guard_nonvirtualized', [fr, ConstAddr(xy_vtable, cpu),
+                                              ConstInt(ofs_node)], []),
         ResOperation('getfield_gc', [fr, ConstInt(ofs_node)], [n1]),
         ResOperation('getfield_gc', [n1, ConstInt(ofs_value)], [v]),
         ResOperation('int_sub', [v, ConstInt(1)], [v2]),
@@ -100,6 +103,7 @@
     assert spec.nodes[A.fr].virtualized
     assert not spec.nodes[A.n1].escaped
     assert not spec.nodes[A.n2].escaped
+    assert isinstance(spec.specnodes[1], VirtualizableSpecNode)
 
 def test_A_optimize_loop():
     operations = A.ops[:]
@@ -108,8 +112,8 @@
     spec.intersect_input_and_output()
     spec.optimize_loop()
     assert equaloplists(operations, [
-            MergePoint('merge_point', [A.sum, A.n1, A.v], []),
+            MergePoint('merge_point', [A.sum, A.fr, A.v], []),
             ResOperation('int_sub', [A.v, ConstInt(1)], [A.v2]),
             ResOperation('int_add', [A.sum, A.v], [A.sum2]),
-            Jump('jump', [A.sum2, A.n1, A.v2], []),
+            Jump('jump', [A.sum2, A.fr, A.v2], []),
         ])

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py	Thu Feb 12 15:43:57 2009
@@ -9,8 +9,8 @@
     def __init__(self, cpu, TOPSTRUCT):
         "NOT_RPYTHON"
         initialize_virtualizable(cpu, TOPSTRUCT.access)
-        self.vable_base = cpu.offsetof(TOPSTRUCT, 'vable_base')
-        self.vable_rti  = cpu.offsetof(TOPSTRUCT, 'vable_rti')
+        self.vable_base = cpu.fielddescrof(TOPSTRUCT, 'vable_base')
+        self.vable_rti  = cpu.fielddescrof(TOPSTRUCT, 'vable_rti')
         self.c_vable_base = history.ConstInt(self.vable_base)
         self.c_vable_rti  = history.ConstInt(self.vable_rti)
 
@@ -32,7 +32,7 @@
     if FIELDTYPE is lltype.Void:
         return
     type = history.getkind_num(cpu, FIELDTYPE)
-    ofs = cpu.offsetof(access.STRUCT, fieldname)
+    ofs = cpu.fielddescrof(access.STRUCT, fieldname)
     getset = access.getsets[fieldname]
 
     def getter(instanceptr):



More information about the Pypy-commit mailing list