[pypy-svn] r51964 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Feb 29 19:17:54 CET 2008
Author: cfbolz
Date: Fri Feb 29 19:17:52 2008
New Revision: 51964
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
Log:
fix indirect gray calls
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 Fri Feb 29 19:17:52 2008
@@ -691,7 +691,7 @@
emitted_args.append(self.serialize_oparg("red", v))
self.emit("red_residual_call")
calldescindex = self.calldesc_position(op.args[0].concretetype)
- self.emit(fnptrindex, calldescindex, withexc)
+ self.emit(fnptrindex, calldescindex, withexc, kind != "gray")
self.emit(len(emitted_args), *emitted_args)
self.emit(self.promotiondesc_position(lltype.Signed))
self.emit("goto", tlabel(("after indirect call", op)))
@@ -706,14 +706,17 @@
if kind == "red":
self.emit("red_after_direct_call")
+ self.register_redvar(op.result)
elif kind == "yellow":
self.emit("yellow_after_direct_call")
self.emit("yellow_retrieve_result_as_red")
self.emit(self.type_position(op.result.concretetype))
+ self.register_redvar(op.result)
+ elif kind == "gray":
+ self.emit("red_after_direct_call")
else:
XXX
- self.register_redvar(op.result)
self.emit(label(("after indirect call", op)))
def handle_oopspec_call(self, op, withexc):
@@ -783,12 +786,14 @@
def handle_residual_call(self, op, withexc):
fnptr = op.args[0]
pos = self.calldesc_position(lltype.typeOf(fnptr.value))
+ has_result = self.varcolor(op.result) != "gray"
func = self.serialize_oparg("red", fnptr)
emitted_args = []
for v in op.args[1:]:
emitted_args.append(self.serialize_oparg("red", v))
self.emit("red_residual_call")
- self.emit(func, pos, withexc, len(emitted_args), *emitted_args)
+ self.emit(func, pos, withexc, has_result, len(emitted_args))
+ self.emit(*emitted_args)
self.emit(self.promotiondesc_position(lltype.Signed))
self.register_redvar(op.result)
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 Fri Feb 29 19:17:52 2008
@@ -228,7 +228,8 @@
bytecode = self.load_2byte()
assert bytecode >= 0
result = self.opcode_implementations[bytecode](self)
- #assert self.frame.local_boxes[-1] is not None
+ #assert (self.frame is None or not self.frame.local_boxes or
+ # self.frame.local_boxes[-1] is not None)
if result is STOP:
return
else:
@@ -581,12 +582,14 @@
rtimeshift.residual_fetch(self.jitstate, self.exceptiondesc,
check_forced, flagbox)
- @arguments("red", "calldesc", "bool", "red_varargs", "promotiondesc")
- def opimpl_red_residual_call(self, funcbox, calldesc, withexc,
- redargs, promotiondesc):
+ @arguments("red", "calldesc", "bool", "bool", "red_varargs",
+ "promotiondesc")
+ def opimpl_red_residual_call(self, funcbox, calldesc, withexc, has_result,
+ redargs, promotiondesc):
result = rtimeshift.gen_residual_call(self.jitstate, calldesc,
funcbox, redargs)
- self.red_result(result)
+ if has_result:
+ self.red_result(result)
if withexc:
exceptiondesc = self.exceptiondesc
else:
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 Fri Feb 29 19:17:52 2008
@@ -1367,7 +1367,6 @@
self.check_insns(indirect_call=1)
def test_indirect_gray_call(self):
- py.test.skip("not working yet")
def h1(w, n):
w[0] = n*2
def h2(w, n):
More information about the Pypy-commit
mailing list