[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