[pypy-svn] r51395 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 11 20:48:35 CET 2008
Author: cfbolz
Date: Mon Feb 11 20:48:33 2008
New Revision: 51395
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py
Log:
three more virtual list tests pass
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py Mon Feb 11 20:48:33 2008
@@ -1,4 +1,5 @@
from pypy.rlib.unroll import unrolling_iterable
+from pypy.rlib.objectmodel import we_are_translated
from pypy.objspace.flow import model as flowmodel
from pypy.rpython.lltypesystem import lltype
from pypy.jit.hintannotator.model import originalconcretetype
@@ -10,8 +11,6 @@
from pypy.translator.backendopt.removenoops import remove_same_as
-
-
class BytecodeWriter(object):
def __init__(self, t, hannotator, RGenOp):
self.translator = t
@@ -295,9 +294,9 @@
def redvar_position(self, arg):
return self.redvar_positions[arg]
- def register_greenvar(self, arg, where=-1):
+ def register_greenvar(self, arg, where=None):
assert isinstance(arg, flowmodel.Variable)
- if where == -1:
+ if where is None:
where = self.free_green[self.current_block]
self.free_green[self.current_block] += 1
self.greenvar_positions[arg] = where
@@ -382,27 +381,41 @@
self.graph_positions[graph] = index
return index
- def nonrainbow_position(self, fnptr):
+ def nonrainbow_position(self, fnptr, *voidargs):
fn = fnptr._obj
- if fn in self.nonrainbow_positions:
- return self.nonrainbow_positions[fn]
+ key = fn, voidargs
+ if key in self.nonrainbow_positions:
+ return self.nonrainbow_positions[key]
FUNCTYPE = lltype.typeOf(fn)
- argiter = unrolling_iterable(enumerate(FUNCTYPE.ARGS))
+ argiter = unrolling_iterable(FUNCTYPE.ARGS)
numargs = len(FUNCTYPE.ARGS)
- def call_normal_function(interpreter, greenargs, redargs):
- assert len(redargs) == 0
- assert len(greenargs) == numargs
+ def call_normal_function(interpreter, greenargs):
+ assert len(greenargs) + len(voidargs) == numargs
args = ()
- for i, ARG in argiter:
- genconst = greenargs[i]
- arg = genconst.revealconst(ARG)
- args += (arg, )
+ j = 0
+ k = 0
+ for ARG in argiter:
+ if ARG == lltype.Void:
+ # XXX terrible hack
+ arg = voidargs[k]
+ if not we_are_translated():
+ arg._TYPE = lltype.Void
+ args += (arg, )
+ k += 1
+ else:
+ genconst = greenargs[j]
+ arg = genconst.revealconst(ARG)
+ args += (arg, )
+ j += 1
rgenop = interpreter.jitstate.curbuilder.rgenop
- result = rgenop.genconst(fnptr(*args))
+ try:
+ result = rgenop.genconst(fnptr(*args))
+ except Exception, e:
+ XXX # need to create a default result and set exception
interpreter.green_result(result)
result = len(self.nonrainbow_functions)
self.nonrainbow_functions.append(call_normal_function)
- self.nonrainbow_positions[fn] = result
+ self.nonrainbow_positions[key] = result
return result
def interiordesc(self, op, PTRTYPE, nb_offsets):
@@ -533,6 +546,20 @@
self.emit(*args)
self.register_redvar(op.result)
return
+ elif kind == "green":
+ voidargs = [const.value for const in op.args[1:]
+ if const.concretetype == lltype.Void]
+ pos = self.nonrainbow_position(op.args[0].value, *voidargs)
+ emitted_args = []
+ for v in op.args[1:]:
+ if v.concretetype != lltype.Void:
+ emitted_args.append(self.serialize_oparg("green", v))
+ self.emit("green_direct_call")
+ self.emit(len(emitted_args))
+ self.emit(*emitted_args)
+ self.emit(pos)
+ self.register_greenvar(op.result)
+ return
targets = dict(self.graphs_from(op))
assert len(targets) == 1
targetgraph, = targets.values()
@@ -546,14 +573,6 @@
if kind == "red":
self.register_redvar(op.result)
self.emit("red_after_direct_call")
- elif kind == "green":
- pos = self.nonrainbow_position(op.args[0].value)
- args = targetgraph.getargs()
- emitted_args = self.args_of_call(op.args[1:], args)
- self.emit("green_direct_call")
- self.emit(*emitted_args)
- self.emit(pos)
- self.register_greenvar(op.result)
elif kind == "yellow":
graphindex = self.graph_position(targetgraph)
args = targetgraph.getargs()
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py Mon Feb 11 20:48:33 2008
@@ -299,10 +299,9 @@
def opimpl_green_direct_call(self):
greenargs = self.get_green_varargs()
- redargs = self.get_red_varargs()
index = self.load_2byte()
function = self.frame.bytecode.nonrainbow_functions[index]
- function(self, greenargs, redargs)
+ function(self, greenargs)
def opimpl_yellow_direct_call(self):
greenargs = self.get_green_varargs()
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py Mon Feb 11 20:48:33 2008
@@ -95,6 +95,7 @@
self.graph = graph2
writer = BytecodeWriter(t, hannotator, self.RGenOp)
jitcode = writer.make_bytecode(graph2)
+ rtyper.specialize_more_blocks()
argcolors = []
# make residual functype
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py Mon Feb 11 20:48:33 2008
@@ -246,7 +246,7 @@
writer, jitcode = self.serialize(ll_function, [int])
assert jitcode.code == assemble(writer.interpreter,
- "green_direct_call", 1, 0, 0, 0,
+ "green_direct_call", 1, 0, 0,
"make_redbox", 1, 0,
"make_new_redvars", 1, 0,
"make_new_greenvars", 0,
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py Mon Feb 11 20:48:33 2008
@@ -65,7 +65,6 @@
self.check_insns({'int_is_true': 1})
def test_force(self):
- py.test.skip("implement me")
def ll_function(n):
lst = []
lst.append(n)
@@ -134,7 +133,6 @@
self.check_insns({})
def test_frozen_list(self):
- py.test.skip("implement me")
lst = [5, 7, 9]
def ll_function(x):
mylist = hint(lst, deepfreeze=True)
More information about the Pypy-commit
mailing list