[pypy-commit] pypy default: Add a test: this misusage of virtualizable arrays should be forbidden.
arigo
noreply at buildbot.pypy.org
Thu Oct 24 20:12:03 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r67579:f443637ade53
Date: 2013-10-24 19:56 +0200
http://bitbucket.org/pypy/pypy/changeset/f443637ade53/
Log: Add a test: this misusage of virtualizable arrays should be
forbidden. In some cases it would generate bogus flattened jitcodes
that fail to assemble.
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -93,6 +93,8 @@
block.exitswitch = renamings.get(block.exitswitch, block.exitswitch)
self.follow_constant_exit(block)
self.optimize_goto_if_not(block)
+ if isinstance(block.exitswitch, tuple):
+ self._check_no_vable_array(block.exitswitch)
for link in block.exits:
self._check_no_vable_array(link.args)
self._do_renaming_on_link(renamings, link)
diff --git a/rpython/jit/codewriter/test/test_flatten.py b/rpython/jit/codewriter/test/test_flatten.py
--- a/rpython/jit/codewriter/test/test_flatten.py
+++ b/rpython/jit/codewriter/test/test_flatten.py
@@ -84,6 +84,8 @@
def calldescr_canraise(self, calldescr):
return calldescr is not self._descr_cannot_raise and calldescr.oopspecindex == EffectInfo.OS_NONE
def get_vinfo(self, VTYPEPTR):
+ if hasattr(VTYPEPTR.TO, 'inst_vlist'):
+ return FakeVInfo()
return None
class FakeCallControlWithVRefInfo:
@@ -100,6 +102,13 @@
def calldescr_canraise(self, calldescr):
return False
+class FakeVInfo:
+ static_field_to_extra_box = {}
+ array_fields = {'inst_vlist': '?'}
+ array_field_counter = {'inst_vlist': 0}
+ array_field_descrs = [FakeDescr()]
+ array_descrs = [FakeDescr()]
+
# ____________________________________________________________
def test_reorder_renaming_list():
@@ -1001,6 +1010,22 @@
float_return %(result_var)s
""" % {"result_var": result_var, "tmp_var": tmp_var}, transform=True)
+ def test_vable_attribute_list_is_not_None(self):
+ class F:
+ _virtualizable_ = ['vlist[*]']
+ vlist = None
+ def __init__(self, x):
+ self.vlist = [x]
+ def g():
+ return F(42)
+ def f():
+ f = g()
+ if f.vlist is not None:
+ pass
+ e = py.test.raises(AssertionError, self.encoding_test, f, [], "!",
+ transform=True)
+ assert str(e.value).startswith("A virtualizable array is passed aroun")
+
def check_force_cast(FROM, TO, operations, value):
"""Check that the test is correctly written..."""
More information about the pypy-commit
mailing list