Author: Maciej Fijalkowski <fij...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit