[pypy-svn] r65884 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Tue Jun 23 14:00:22 CEST 2009


Author: arigo
Date: Tue Jun 23 14:00:19 2009
New Revision: 65884

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
Log:
Handle virtualizable lists at the RPython level too
(which become just arrays, but with built-in function calls
to manipulate them, and a possibly negative index).


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	Tue Jun 23 14:00:19 2009
@@ -1170,6 +1170,12 @@
                                             'getarrayitem_gc_pure')
         #
         if oopspec_name == 'list.setitem':
+            if args[0] in self.vable_array_vars:     # virtualizable array
+                self.emit('setarrayitem_vable',
+                          self.vable_array_vars[args[0]],
+                          self.var_position(args[1]),
+                          self.var_position(args[2]))
+                return True
             index = self.prepare_list_getset(op, arraydescr, args)
             if index is None:
                 return False
@@ -1183,6 +1189,11 @@
         #
         if (oopspec_name == 'list.len' or
             oopspec_name == 'list.len_foldable'):
+            if args[0] in self.vable_array_vars:     # virtualizable array
+                self.emit('arraylen_vable',
+                          self.vable_array_vars[args[0]])
+                self.register_var(op.result)
+                return True
             self.emit('arraylen_gc')
             self.emit(self.var_position(args[0]))
             self.emit(self.get_position(arraydescr))
@@ -1192,6 +1203,12 @@
         return False
 
     def handle_list_getitem(self, op, arraydescr, args, opname):
+        if args[0] in self.vable_array_vars:     # virtualizable array
+            self.emit('getarrayitem_vable',
+                      self.vable_array_vars[args[0]],
+                      self.var_position(args[1]))
+            self.register_var(op.result)
+            return True
         index = self.prepare_list_getset(op, arraydescr, args)
         if index is None:
             return False
@@ -1300,7 +1317,13 @@
             i = self.const_position(v.value)
             return i * 2 + 1
         else:
-            return self.var_positions[v]
+            try:
+                return self.var_positions[v]
+            except KeyError:
+                if v not in self.vable_array_vars:
+                    raise
+                raise Exception("trying to use a virtualizable's array in "
+                                "an unsupported way")
 
     def emit(self, *stuff):
         self.assembler.extend(stuff)

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Tue Jun 23 14:00:19 2009
@@ -469,8 +469,11 @@
         vinfo = self.metainterp.staticdata.virtualizable_info
         virtualizable_box = self.metainterp.virtualizable_boxes[-1]
         virtualizable = virtualizable_box.getptr(vinfo.VTYPEPTR)
-        return vinfo.get_index_in_array(virtualizable, arrayindex,
-                                        indexbox.getint())
+        index = indexbox.getint()
+        if index < 0:
+            index += vinfo.get_array_length(virtualizable, arrayindex)
+        assert 0 <= index < vinfo.get_array_length(virtualizable, arrayindex)
+        return vinfo.get_index_in_array(virtualizable, arrayindex, index)
 
     @arguments("orgpc", "int", "box")
     def opimpl_getarrayitem_vable(self, pc, arrayindex, indexbox):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	Tue Jun 23 14:00:19 2009
@@ -261,12 +261,10 @@
         self.check_loops(getfield_gc=0, setfield_gc=0)
 
 
-    def test_virtualizable_with_virtual_list(self):
-        py.test.skip("in-progress")
+    def test_virtualizable_with_array(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'frame', 'x'],
                                 virtualizables = ['frame'])
 
-
         class Frame(object):
             _virtualizable2_ = ['l[*]', 's']
 
@@ -285,6 +283,7 @@
                 x += frame.l[frame.s]
                 frame.s += 1
                 x += frame.l[frame.s]
+                x += len(frame.l)
                 frame.s -= 1
             return x
 



More information about the Pypy-commit mailing list