Author: mattip Branch: win32-cleanup_2 Changeset: r53249:9c73bc001621 Date: 2012-03-07 00:28 +0200 http://bitbucket.org/pypy/pypy/changeset/9c73bc001621/
Log: merge default into branch diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -5031,6 +5031,42 @@ """ self.optimize_loop(ops, expected) + def test_str_copy_virtual(self): + ops = """ + [i0] + p0 = newstr(8) + strsetitem(p0, 0, i0) + strsetitem(p0, 1, i0) + strsetitem(p0, 2, i0) + strsetitem(p0, 3, i0) + strsetitem(p0, 4, i0) + strsetitem(p0, 5, i0) + strsetitem(p0, 6, i0) + strsetitem(p0, 7, i0) + p1 = newstr(12) + copystrcontent(p0, p1, 0, 0, 8) + strsetitem(p1, 8, 3) + strsetitem(p1, 9, 0) + strsetitem(p1, 10, 0) + strsetitem(p1, 11, 0) + finish(p1) + """ + expected = """ + [i0] + p1 = newstr(12) + strsetitem(p1, 0, i0) + strsetitem(p1, 1, i0) + strsetitem(p1, 2, i0) + strsetitem(p1, 3, i0) + strsetitem(p1, 4, i0) + strsetitem(p1, 5, i0) + strsetitem(p1, 6, i0) + strsetitem(p1, 7, i0) + strsetitem(p1, 8, 3) + finish(p1) + """ + self.optimize_strunicode_loop(ops, expected) + class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): pass diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py --- a/pypy/jit/metainterp/optimizeopt/vstring.py +++ b/pypy/jit/metainterp/optimizeopt/vstring.py @@ -505,14 +505,23 @@ if length.is_constant() and length.box.getint() == 0: return - copy_str_content(self, - src.force_box(self), - dst.force_box(self), - srcstart.force_box(self), - dststart.force_box(self), - length.force_box(self), - mode, need_next_offset=False - ) + elif (src.is_virtual() and dst.is_virtual() and srcstart.is_constant() and + dststart.is_constant() and length.is_constant()): + + src_start = srcstart.force_box(self).getint() + dst_start = dststart.force_box(self).getint() + for index in range(length.force_box(self).getint()): + vresult = self.strgetitem(src, optimizer.ConstantValue(ConstInt(index + src_start)), mode) + dst.setitem(index + dst_start, vresult) + else: + copy_str_content(self, + src.force_box(self), + dst.force_box(self), + srcstart.force_box(self), + dststart.force_box(self), + length.force_box(self), + mode, need_next_offset=False + ) def optimize_CALL(self, op): # dispatch based on 'oopspecindex' to a method that handles _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit