[pypy-svn] r79735 - in pypy/branch/out-of-line-guards/pypy/jit/codewriter: . test

fijal at codespeak.net fijal at codespeak.net
Thu Dec 2 10:13:01 CET 2010


Author: fijal
Date: Thu Dec  2 10:13:00 2010
New Revision: 79735

Modified:
   pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py
   pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py
Log:
Implement jtransform layer of jit_invariant_field


Modified: pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py	Thu Dec  2 10:13:00 2010
@@ -14,6 +14,8 @@
 from pypy.translator.simplify import get_funcobj
 from pypy.translator.unsimplify import varoftype
 
+class JitInvariantError(Exception):
+    pass
 
 def transform_graph(graph, cpu=None, callcontrol=None, portal_jd=None):
     """Transform a control flow graph to make it suitable for
@@ -536,7 +538,11 @@
             if immut == "[*]":
                 self.immutable_arrays[op.result] = True
         else:
-            pure = ''
+            jit_inv = v_inst.concretetype.TO._hints.get('jit_invariant_fields')
+            if jit_inv and op.args[1].value[len('inst_'):] in jit_inv.fields:
+                pure = '_pure'
+            else:
+                pure = ''
         argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
         descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
                                       c_fieldname.value)
@@ -560,6 +566,10 @@
             return [SpaceOperation('-live-', [], None),
                     SpaceOperation('setfield_vable_%s' % kind,
                                    [v_inst, descr, v_value], None)]
+        jit_inv = v_inst.concretetype.TO._hints.get('jit_invariant_fields')
+        if jit_inv and op.args[1].value[len('inst_'):] in jit_inv.fields:
+            raise JitInvariantError("setfield on jit invariant should not"
+                                    " be ssen by jit")
         argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
         descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
                                       c_fieldname.value)

Modified: pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py	Thu Dec  2 10:13:00 2010
@@ -2,7 +2,7 @@
 import random
 from pypy.objspace.flow.model import FunctionGraph, Block, Link
 from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
-from pypy.jit.codewriter.jtransform import Transformer
+from pypy.jit.codewriter.jtransform import Transformer, JitInvariantError
 from pypy.jit.metainterp.history import getkind
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rlist
 from pypy.translator.unsimplify import varoftype
@@ -942,3 +942,34 @@
     assert op1.args[1] == 'calldescr-%d' % effectinfo.EffectInfo.OS_ARRAYCOPY
     assert op1.args[2] == ListOfKind('int', [v3, v4, v5])
     assert op1.args[3] == ListOfKind('ref', [v1, v2])
+
+def test_jit_invariant():
+    from pypy.rpython.rclass import FieldListAccessor
+    from pypy.rpython.lltypesystem.rclass import ASMCODE
+    accessor = FieldListAccessor()
+    accessor.initialize(None, {'x': 'asmcodes_x'})
+    v2 = varoftype(lltype.Signed)
+    STRUCT = lltype.GcStruct('struct', ('inst_x', lltype.Signed),
+                             ('asmcodes_x', lltype.Ptr(ASMCODE)),
+                             hints={'jit_invariant_fields': accessor})
+    op = SpaceOperation('getfield', [const(lltype.malloc(STRUCT)),
+                        Constant('inst_x', lltype.Void)], v2)
+    tr = Transformer(FakeCPU())
+    op1 = tr.rewrite_operation(op)
+    assert op1.opname == 'getfield_gc_i_pure'
+
+def test_jit_invariant_setfield():
+    from pypy.rpython.rclass import FieldListAccessor
+    from pypy.rpython.lltypesystem.rclass import ASMCODE
+    accessor = FieldListAccessor()
+    accessor.initialize(None, {'x': 'asmcodes_x'})
+    v1 = varoftype(lltype.Signed)
+    STRUCT = lltype.GcStruct('struct', ('inst_x', lltype.Signed),
+                             ('asmcodes_x', lltype.Ptr(ASMCODE)),
+                             hints={'jit_invariant_fields': accessor})
+    op = SpaceOperation('setfield', [const(lltype.malloc(STRUCT)),
+                        Constant('inst_x', lltype.Void), v1],
+                        varoftype(lltype.Void))
+    tr = Transformer(FakeCPU())
+    raises(JitInvariantError, tr.rewrite_operation, op)
+    



More information about the Pypy-commit mailing list