[pypy-commit] pypy inline-dict-ops: codewriter setinteriorfield support

fijal noreply at buildbot.pypy.org
Thu Jun 23 15:20:44 CEST 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: inline-dict-ops
Changeset: r45080:60c59fd8e5dd
Date: 2011-06-23 14:55 +0200
http://bitbucket.org/pypy/pypy/changeset/60c59fd8e5dd/

Log:	codewriter setinteriorfield support

diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -719,15 +719,26 @@
     def rewrite_op_setinteriorfield(self, op):
         # only supports strings and unicodes
         assert len(op.args) == 4
-        assert op.args[1].value == 'chars'
-        optype = op.args[0].concretetype
-        if optype == lltype.Ptr(rstr.STR):
-            opname = "strsetitem"
+        if isinstance(op.args[1], Constant) and op.args[1].value == 'chars':
+            optype = op.args[0].concretetype
+            if optype == lltype.Ptr(rstr.STR):
+                opname = "strsetitem"
+            else:
+                assert optype == lltype.Ptr(rstr.UNICODE)
+                opname = "unicodesetitem"
+            return SpaceOperation(opname, [op.args[0], op.args[2], op.args[3]],
+                                  op.result)
         else:
-            assert optype == lltype.Ptr(rstr.UNICODE)
-            opname = "unicodesetitem"
-        return SpaceOperation(opname, [op.args[0], op.args[2], op.args[3]],
-                              op.result)
+            v_inst, v_index, c_field, v_value = op.args
+            # only GcArray of Struct supported
+            assert isinstance(v_inst.concretetype.TO, lltype.GcArray)
+            STRUCT = v_inst.concretetype.TO.OF
+            assert isinstance(STRUCT, lltype.Struct)
+            arraydescr = self.cpu.arraydescrof(v_inst.concretetype.TO)
+            fielddescr = self.cpu.fielddescrof(STRUCT, c_field.value)
+            args = [v_inst, v_index, v_value, arraydescr, fielddescr]
+            return SpaceOperation('setinteriorfield', args, op.result)
+            
 
     def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -1,8 +1,7 @@
-import py
 import random
-from pypy.objspace.flow.model import FunctionGraph, Block, Link
+from pypy.objspace.flow.model import Block, Link
 from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
-from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rlist
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr
 from pypy.rpython.lltypesystem.module import ll_math
 from pypy.translator.unsimplify import varoftype
 from pypy.jit.codewriter import heaptracker, effectinfo
@@ -687,6 +686,20 @@
     assert op1.args == [v, v_index, v_newchr]
     assert op1.result == v_void
 
+def test_dict_setinteriorfield():
+    DICT = lltype.GcArray(lltype.Struct('ENTRY', ('v', lltype.Signed),
+                                        ('k', lltype.Signed)))
+    v = varoftype(lltype.Ptr(DICT))
+    i = varoftype(lltype.Signed)
+    v_void = varoftype(lltype.Void)
+    op = SpaceOperation('setinteriorfield', [v, i, Constant('v', lltype.Void),
+                                             i],
+                        v_void)
+    op1 = Transformer(FakeCPU()).rewrite_operation(op)
+    assert op1.opname == 'setinteriorfield'
+    assert op1.args == [v, i, i, ('arraydescr', DICT),
+                        ('fielddescr', DICT.OF, 'v')]
+
 def test_promote_1():
     v1 = varoftype(lltype.Signed)
     v2 = varoftype(lltype.Signed)


More information about the pypy-commit mailing list