Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r67851:32c25a0ac64a Date: 2013-11-05 07:24 -0800 http://bitbucket.org/pypy/pypy/changeset/32c25a0ac64a/
Log: Handle the case of a copy from virtual to concrete efficiently withs trings diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -5122,6 +5122,21 @@ """ self.optimize_strunicode_loop(ops, expected) + def test_str_copy_virtual_src_concrete_dst(self): + ops = """ + [p0] + p1 = newstr(1) + strsetitem(p1, 0, 101) + copystrcontent(p1, p0, 0, 0, 1) + finish(p0) + """ + expected = """ + [p0] + strsetitem(p0, 0, 101) + finish(p0) + """ + self.optimize_strunicode_loop(ops, expected) + def test_call_pure_vstring_const(self): py.test.skip("implement me") ops = """ diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py --- a/rpython/jit/metainterp/optimizeopt/vstring.py +++ b/rpython/jit/metainterp/optimizeopt/vstring.py @@ -516,7 +516,6 @@ if length.is_constant() and length.box.getint() == 0: return elif ((src.is_virtual() or src.is_constant()) and - isinstance(dst, VStringPlainValue) and dst.is_virtual() and srcstart.is_constant() and dststart.is_constant() and length.is_constant()): src_start = srcstart.force_box(self).getint() @@ -527,7 +526,15 @@ assert actual_length <= MAX_CONST_LEN for index in range(actual_length): vresult = self.strgetitem(src, optimizer.ConstantValue(ConstInt(index + src_start)), mode) - dst.setitem(index + dst_start, vresult) + if isinstance(dst, VStringPlainValue): + dst.setitem(index + dst_start, vresult) + else: + op = ResOperation(mode.STRSETITEM, [ + op.getarg(1), + ConstInt(index + dst_start), + vresult.force_box(self), + ], None) + self.emit_operation(op) else: copy_str_content(self, src.force_box(self), @@ -752,9 +759,11 @@ def propagate_forward(self, op): dispatch_opt(self, op) + dispatch_opt = make_dispatcher_method(OptString, 'optimize_', default=OptString.emit_operation) + def _findall_call_oopspec(): prefix = 'opt_call_stroruni_' result = [] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit