[pypy-commit] pypy virtual-raw-mallocs: make it possible to get a virtual raw slice of a virtual raw slice

antocuni noreply at buildbot.pypy.org
Wed Dec 19 10:57:32 CET 2012


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: virtual-raw-mallocs
Changeset: r59506:d06cd276f22b
Date: 2012-12-19 10:57 +0100
http://bitbucket.org/pypy/pypy/changeset/d06cd276f22b/

Log:	make it possible to get a virtual raw slice of a virtual raw slice

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -1845,6 +1845,23 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_virtual_raw_slice_of_a_raw_slice(self):
+        ops = """
+        [i0, i1]
+        i2 = call('malloc', 10, descr=raw_malloc_descr)
+        i3 = int_add(i2, 1) # get a slice of the original buffer
+        i4 = int_add(i3, 1) # get a slice of a slice
+        setarrayitem_raw(i4, 0, i1, descr=rawarraydescr_char) # write to the slice
+        i5 = getarrayitem_raw(i2, 2, descr=rawarraydescr_char)
+        call('free', i2, descr=raw_free_descr)
+        jump(i0, i5)
+        """
+        expected = """
+        [i0, i1]
+        jump(i0, i1)
+        """
+        self.optimize_loop(ops, expected)
+
     def test_virtual_raw_slice_force(self):
         ops = """
         [i0, i1]
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -600,6 +600,10 @@
             if isinstance(value, VirtualRawBufferValue):
                 self.make_virtual_raw_slice(value, offset, op.result, op)
                 return
+            elif isinstance(value, VirtualRawSliceValue):
+                offset = offset + value.offset
+                self.make_virtual_raw_slice(value.rawbuffer_value, offset, op.result, op)
+                return
         self.emit_operation(op)
 
     def optimize_ARRAYLEN_GC(self, op):


More information about the pypy-commit mailing list