[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