[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