[pypy-svn] r52014 - pypy/branch/jit-refactoring/pypy/jit/rainbow
cfbolz at codespeak.net
cfbolz at codespeak.net
Sat Mar 1 19:41:09 CET 2008
Author: cfbolz
Date: Sat Mar 1 19:41:07 2008
New Revision: 52014
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
Log:
support for green calls raising exceptions
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 Sat Mar 1 19:41:07 2008
@@ -18,7 +18,7 @@
class CallDesc:
__metaclass__ = cachedtype
- def __init__(self, RGenOp, FUNCTYPE, voidargs=()):
+ def __init__(self, RGenOp, rtyper, FUNCTYPE, voidargs=()):
self.sigtoken = RGenOp.sigToken(FUNCTYPE.TO)
self.result_kind = RGenOp.kindToken(FUNCTYPE.TO.RESULT)
# xxx what if the result is virtualizable?
@@ -49,8 +49,17 @@
try:
result = rgenop.genconst(fnptr(*args))
except Exception, e:
- XXX # set exception
- return rgenop.genconst(whatever_return_value)
+ if not we_are_translated():
+ # since we have a normal exception instance here
+ # we need to turn it into a low level one
+ bk = rtyper.annotator.bookkeeper
+ exc_classdef = bk.getuniqueclassdef(type(e))
+ ll_exc = rtyper.exceptiondata.get_standard_ll_exc_instance(
+ rtyper, exc_classdef)
+ interpreter.jitstate.residual_ll_exception(ll_exc)
+ else:
+ interpreter.jitstate.residual_exception(ll_exc)
+ result = rgenop.genconst(whatever_return_value)
interpreter.green_result(result)
self.green_call = green_call
@@ -80,7 +89,8 @@
self.graphs = [graph for (graph, tsgraph) in graph2tsgraph]
self.jitcodes = values
- self.calldesc = CallDesc(codewriter.RGenOp, lltype.typeOf(fnptr))
+ self.calldesc = CallDesc(codewriter.RGenOp, codewriter.rtyper,
+ lltype.typeOf(fnptr))
class BytecodeWriter(object):
@@ -591,7 +601,7 @@
return self.calldesc_positions[key]
result = len(self.calldescs)
self.calldescs.append(
- CallDesc(self.RGenOp, FUNCTYPE, voidargs))
+ CallDesc(self.RGenOp, self.rtyper, FUNCTYPE, voidargs))
self.calldesc_positions[key] = result
return result
More information about the pypy-svn
mailing list