[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