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

fijal at codespeak.net fijal at codespeak.net
Sat Feb 14 00:17:26 CET 2009


Author: fijal
Date: Sat Feb 14 00:17:26 2009
New Revision: 61860

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
Log:
A bit of fixes and a test that should test something else, but a fix
for it anyway :)


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	Sat Feb 14 00:17:26 2009
@@ -487,6 +487,7 @@
                                        c_fieldname.value)
         self.emit(offset)
         self.register_var(op.result)
+        self._eventualy_builtin(op.result)
 
     def serialize_op_setfield(self, op):
         if self.is_typeptr_getset(op):
@@ -549,19 +550,22 @@
                     range(0, 2*(len(op.args) - 2), 2))
             for i in range(2, len(op.args)):
                 arg = op.args[i]
-                if isinstance(arg.concretetype, lltype.Ptr):
-                    # XXX very complex logic for getting all things
-                    # that are pointers, but not objects
-                    if isinstance(arg.concretetype.TO, lltype.GcArray):
-                        descr = self.codewriter.list_descr_for_tp(
-                            arg.concretetype)
-                        self.emit('guard_builtin', self.var_position(arg),
-                                  self.get_position(descr))
+                self._eventualy_builtin(arg)
             
         elif op.args[0].value == 'can_enter_jit':
             self.emit('can_enter_jit')
             self.emit_varargs(op.args[2:])
 
+    def _eventualy_builtin(self, arg):
+        if isinstance(arg.concretetype, lltype.Ptr):
+            # XXX very complex logic for getting all things
+            # that are pointers, but not objects
+            if isinstance(arg.concretetype.TO, lltype.GcArray):
+                descr = self.codewriter.list_descr_for_tp(arg.concretetype)
+                self.emit('guard_builtin', self.var_position(arg),
+                          self.get_position(descr))
+
+
     #def serialize_op_direct_call(self, op):
     #    color = support.guess_call_kind(self.codewriter.hannotator, op)
     #    return getattr(self, 'handle_%s_call' % color)(op)

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	Sat Feb 14 00:17:26 2009
@@ -148,14 +148,14 @@
                     node = other.curfields[ofs]
                     specnode = self.origfields[ofs].intersect(node)
                 elif ofs in self.origfields:
-                    specnode = NotSpecNode()
+                    node = self.origfields[ofs]
+                    specnode = node.intersect(node)
                 else:
                     # ofs in other.curfields
                     node = other.curfields[ofs]
                     self.origfields[ofs] = InstanceNode(node.source.clonebox())
                     specnode = NotSpecNode()
                 fields.append((ofs, specnode))
-                    
             return VirtualizableSpecNode(known_class, fields)
 
     def __repr__(self):

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	Sat Feb 14 00:17:26 2009
@@ -12,6 +12,7 @@
 from pypy.jit.metainterp.virtualizable import VirtualizableDesc
 from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
                                                     equaloplists, Loop)
+from pypy.jit.metainterp.codewriter import ListDescr
 
 # ____________________________________________________________
 
@@ -21,10 +22,11 @@
     ('vable_base', llmemory.Address),
     ('vable_rti', VABLERTIPTR),
     ('x', lltype.Signed),
+    ('l', lltype.Ptr(lltype.GcArray(lltype.Signed))),
     ('node', lltype.Ptr(NODE)),
     hints = {'virtualizable2': True},
     adtmeths = {'access': VirtualizableAccessor()})
-XY._adtmeths['access'].initialize(XY, ['x', 'node'])
+XY._adtmeths['access'].initialize(XY, ['x', 'node', 'l'])
 
 xy_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
 xy_vtable.name = lltype.malloc(rclass.OBJECT_VTABLE.name.TO, 3, immortal=True)
@@ -60,6 +62,7 @@
 
 class A:
     ofs_node = runner.CPU.fielddescrof(XY, 'node')
+    ofs_l = runner.CPU.fielddescrof(XY, 'l')
     ofs_value = runner.CPU.fielddescrof(NODE, 'value')
     size_of_node = runner.CPU.sizeof(NODE)
     #
@@ -190,3 +193,37 @@
     assert len(spec.specnodes[0].fields) == 1
     assert spec.specnodes[0].fields[0][0] == C.ofs_node
     assert isinstance(spec.specnodes[0].fields[0][1], NotSpecNode)
+
+
+# ____________________________________________________________
+
+class D:
+    class SomeDescr(ListDescr):
+        def __init__(self):
+            pass
+    
+    locals().update(A.__dict__)
+    n2 = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
+    v2 = BoxInt(13)
+    l = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
+    ops = [
+        MergePoint('merge_point', [fr], []),
+        ResOperation('guard_nonvirtualized', [fr, ConstAddr(xy_vtable, cpu),
+                                              ConstInt(ofs_node)], []),
+        #
+        ResOperation('getfield_gc', [fr, ConstInt(ofs_l)], [l]),
+        ResOperation('guard_builtin', [l, SomeDescr()], []),
+        ResOperation('getitem', [None, l, ConstInt(0)], [v2]),
+        ResOperation('setitem', [None, l, ConstInt(0), v2], []),
+        Jump('jump', [fr], []),
+        ]
+    ops[1].vdesc = xy_desc
+
+def test_D_intersect_input_and_output():
+    spec = PerfectSpecializer(Loop(D.ops))
+    spec.find_nodes()
+    spec.intersect_input_and_output()
+    assert spec.nodes[D.fr].escaped
+    assert spec.nodes[D.fr].virtualized
+    assert spec.nodes[D.l].escaped
+    assert spec.nodes[D.l].expanded_fields.keys() == [0]



More information about the Pypy-commit mailing list