[pypy-commit] pypy virtual-raw-mallocs: force the raw buffer if we detect an invalid read
antocuni
noreply at buildbot.pypy.org
Tue Dec 18 18:23:29 CET 2012
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: virtual-raw-mallocs
Changeset: r59490:ada61857757d
Date: 2012-12-18 18:23 +0100
http://bitbucket.org/pypy/pypy/changeset/ada61857757d/
Log: force the raw buffer if we detect an invalid read
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
@@ -1805,6 +1805,27 @@
"""
self.optimize_loop(ops, expected)
+ def test_virtual_raw_malloc_invalid_read_force(self):
+ ops = """
+ [i1]
+ i2 = call('malloc', 10, descr=raw_malloc_descr)
+ setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
+ label('foo') # we expect the buffer to be forced *after* the label
+ i3 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char)
+ call('free', i2, descr=raw_free_descr)
+ jump(i1)
+ """
+ expected = """
+ [i1]
+ label('foo')
+ i2 = call('malloc', 10, descr=raw_malloc_descr)
+ setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
+ i3 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char)
+ call('free', i2, descr=raw_free_descr)
+ jump(i1)
+ """
+ self.optimize_loop(ops, expected)
+
def test_duplicate_getfield_1(self):
ops = """
[p1, p2]
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
@@ -406,10 +406,7 @@
self.buffer.write_value(offset, length, descr, value)
def getitem_raw(self, offset, length, descr):
- try:
- return self.buffer.read_value(offset, length, descr)
- except InvalidRawOperation:
- XXX
+ return self.buffer.read_value(offset, length, descr)
class OptVirtualize(optimizer.Optimization):
@@ -617,8 +614,13 @@
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
offset, itemsize, descr = self._unpack_arrayitem_raw_op(op, indexbox)
- itemvalue = value.getitem_raw(offset, itemsize, descr)
- self.make_equal_to(op.result, itemvalue)
+ try:
+ itemvalue = value.getitem_raw(offset, itemsize, descr)
+ self.make_equal_to(op.result, itemvalue)
+ except InvalidRawOperation:
+ box = value.force_box(self)
+ op.setarg(0, box)
+ self.emit_operation(op)
return
value.ensure_nonnull()
self.emit_operation(op)
More information about the pypy-commit
mailing list