[pypy-commit] pypy virtual-raw-mallocs: keeping track of the lengths of writes is not enough: we want to make sure

antocuni noreply at buildbot.pypy.org
Tue Dec 18 16:11:29 CET 2012


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: virtual-raw-mallocs
Changeset: r59484:db54acd6790e
Date: 2012-12-18 14:10 +0100
http://bitbucket.org/pypy/pypy/changeset/db54acd6790e/

Log:	keeping track of the lengths of writes is not enough: we want to
	make sure that also the descrs are the same, in case e.g. I store a
	long and then read a double (in that case, we just abort the
	optimization)

diff --git a/pypy/jit/metainterp/optimizeopt/rawbuffer.py b/pypy/jit/metainterp/optimizeopt/rawbuffer.py
--- a/pypy/jit/metainterp/optimizeopt/rawbuffer.py
+++ b/pypy/jit/metainterp/optimizeopt/rawbuffer.py
@@ -17,6 +17,7 @@
         # overlaps
         self.offsets = []
         self.lengths = []
+        self.descrs = []
         self.values = []
 
     def _get_memory(self):
@@ -24,18 +25,19 @@
         NOT_RPYTHON
         for testing only
         """
-        return zip(self.offsets, self.lengths, self.values)
+        return zip(self.offsets, self.lengths, self.descrs, self.values)
 
-    def write_value(self, offset, length, value):
+    def write_value(self, offset, length, descr, value):
         i = 0
         N = len(self.offsets)
         while i < N:
             if self.offsets[i] == offset:
-                if length != self.lengths[i]:
+                if length != self.lengths[i] or descr != self.descrs[i]:
+                    # in theory we could add support for the cases in which
+                    # the lenght or descr is different, but I don't think we
+                    # need it in practice
                     raise InvalidRawWrite
                 # update the value at this offset
-                self.offsets[i] = offset
-                self.lengths[i] = length
                 self.values[i] = value
                 return
             elif self.offsets[i] > offset:
@@ -47,14 +49,15 @@
         # insert a new value at offset
         self.offsets.insert(i, offset)
         self.lengths.insert(i, length)
+        self.descrs.insert(i, descr)
         self.values.insert(i, value)
 
-    def read_value(self, offset, length):
+    def read_value(self, offset, length, descr):
         i = 0
         N = len(self.offsets)
         while i < N:
             if self.offsets[i] == offset:
-                if length != self.lengths[i]:
+                if length != self.lengths[i] or descr != self.descrs[i]:
                     raise InvalidRawRead
                 return self.values[i]
             i += 1
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_rawbuffer.py b/pypy/jit/metainterp/optimizeopt/test/test_rawbuffer.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_rawbuffer.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_rawbuffer.py
@@ -4,48 +4,54 @@
 
 def test_write_value():
     buf = RawBuffer()
-    buf.write_value(8, 4, 'three')
-    buf.write_value(0, 4, 'one')
-    buf.write_value(4, 2, 'two')
-    buf.write_value(12, 2, 'four')
+    buf.write_value(8, 4, 'descr3', 'three')
+    buf.write_value(0, 4, 'descr1', 'one')
+    buf.write_value(4, 2, 'descr2', 'two')
+    buf.write_value(12, 2, 'descr4', 'four')
     assert buf._get_memory() == [
-        ( 0, 4, 'one'),
-        ( 4, 2, 'two'),
-        ( 8, 4, 'three'),
-        (12, 2, 'four'),
+        ( 0, 4, 'descr1', 'one'),
+        ( 4, 2, 'descr2', 'two'),
+        ( 8, 4, 'descr3', 'three'),
+        (12, 2, 'descr4', 'four'),
         ]
     #
 
 def test_write_value_update():
     buf = RawBuffer()
-    buf.write_value(0, 4, 'one')
-    buf.write_value(4, 2, 'two')
-    buf.write_value(0, 4, 'ONE')
+    buf.write_value(0, 4, 'descr', 'one')
+    buf.write_value(4, 2, 'descr', 'two')
+    buf.write_value(0, 4, 'descr', 'ONE')
     assert buf._get_memory() == [
-        ( 0, 4, 'ONE'),
-        ( 4, 2, 'two'),
+        ( 0, 4, 'descr', 'ONE'),
+        ( 4, 2, 'descr', 'two'),
         ]
 
 def test_write_value_invalid_length():
     buf = RawBuffer()
-    buf.write_value(0, 4, 'one')
+    buf.write_value(0, 4, 'descr1', 'one')
     with py.test.raises(InvalidRawWrite):
-        buf.write_value(0, 5, 'two')
+        buf.write_value(0, 5, 'descr1', 'two')
+    with py.test.raises(InvalidRawWrite):
+        buf.write_value(0, 4, 'descr2', 'two')
+
     
 def test_write_value_overlapping():
     buf = RawBuffer()
-    buf.write_value(0, 4, 'one')
-    buf.write_value(6, 4, 'two')
+    buf.write_value(0, 4, 'descr', 'one')
+    buf.write_value(6, 4, 'descr', 'two')
     with py.test.raises(InvalidRawWrite):
-        buf.write_value(4, 4, 'three')
+        buf.write_value(4, 4, 'descr', 'three')
 
 def test_read_value():
     buf = RawBuffer()
-    buf.write_value(0, 4, 'one')
-    buf.write_value(4, 4, 'two')
-    assert buf.read_value(0, 4) == 'one'
-    assert buf.read_value(4, 4) == 'two'
+    buf.write_value(0, 4, 'descr', 'one')
+    buf.write_value(4, 4, 'descr', 'two')
+    assert buf.read_value(0, 4, 'descr') == 'one'
+    assert buf.read_value(4, 4, 'descr') == 'two'
     with py.test.raises(InvalidRawRead):
-        buf.read_value(0, 2)
+        buf.read_value(0, 2, 'descr')
     with py.test.raises(InvalidRawRead):
-        buf.read_value(8, 2)
+        buf.read_value(8, 2, 'descr')
+    with py.test.raises(InvalidRawRead):
+        buf.read_value(0, 4, 'another descr')
+


More information about the pypy-commit mailing list