[pypy-svn] r39807 - in pypy/dist/pypy: rpython translator/c
arigo at codespeak.net
arigo at codespeak.net
Sat Mar 3 15:12:00 CET 2007
Author: arigo
Date: Sat Mar 3 15:11:58 2007
New Revision: 39807
Modified:
pypy/dist/pypy/rpython/llinterp.py
pypy/dist/pypy/translator/c/exceptiontransform.py
Log:
(pedronis, arigo)
Merge a small change from the JIT branch (the part of r37966 outside pypy.jit):
use a Struct instead of an RPython class to hold the current exception state.
Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py (original)
+++ pypy/dist/pypy/rpython/llinterp.py Sat Mar 3 15:11:58 2007
@@ -42,10 +42,11 @@
class LLInterpreter(object):
""" low level interpreter working with concrete values. """
- def __init__(self, typer, heap=llheap, tracing=True):
+ def __init__(self, typer, heap=llheap, tracing=True, exc_data_ptr=None):
self.bindings = {}
self.typer = typer
self.heap = heap #module that provides malloc, etc for lltypes
+ self.exc_data_ptr = exc_data_ptr
self.active_frame = None
# XXX hack: set gc to None because
# prepare_graphs_and_create_gc might already use the llinterpreter!
@@ -150,6 +151,13 @@
self.active_frame = old_active_frame
raise ValueError, "couldn't match exception"
+ def get_transformed_exc_data(self, graph):
+ if hasattr(graph, 'exceptiontransformed'):
+ return graph.exceptiontransformed
+ if getattr(graph, 'rgenop', False):
+ return self.exc_data_ptr
+ return None
+
def checkptr(ptr):
assert isinstance(lltype.typeOf(ptr), lltype.Ptr)
@@ -284,18 +292,16 @@
raise LLException(etype, evalue)
resultvar, = block.getvariables()
result = self.getval(resultvar)
- if hasattr(self.graph, 'exceptiontransformed'):
+ exc_data = self.llinterpreter.get_transformed_exc_data(self.graph)
+ if exc_data:
# re-raise the exception set by this graph, if any
- exc_data = self.graph.exceptiontransformed
- etype = rclass.fishllattr(exc_data, 'exc_type')
+ etype = exc_data.exc_type
if etype:
- evalue = rclass.fishllattr(exc_data, 'exc_value')
+ evalue = exc_data.exc_value
if tracer:
tracer.dump('raise')
- rclass.feedllattr(exc_data, 'exc_type',
- lltype.typeOf(etype)._defl())
- rclass.feedllattr(exc_data, 'exc_value',
- lltype.typeOf(evalue)._defl())
+ exc_data.exc_type = lltype.typeOf(etype )._defl()
+ exc_data.exc_value = lltype.typeOf(evalue)._defl()
from pypy.translator.c import exceptiontransform
T = resultvar.concretetype
errvalue = exceptiontransform.error_value(T)
@@ -554,13 +560,13 @@
try:
return self.perform_call(f, FTYPE.ARGS, args)
except LLException, e:
- if hasattr(self.graph, 'exceptiontransformed'):
+ exc_data = self.llinterpreter.get_transformed_exc_data(self.graph)
+ if exc_data:
# store the LLException into the exc_data used by this graph
- exc_data = self.graph.exceptiontransformed
etype = e.args[0]
evalue = e.args[1]
- rclass.feedllattr(exc_data, 'exc_type', etype)
- rclass.feedllattr(exc_data, 'exc_value', evalue)
+ exc_data.exc_type = etype
+ exc_data.exc_value = evalue
from pypy.translator.c import exceptiontransform
return exceptiontransform.error_value(FTYPE.RESULT)
raise
Modified: pypy/dist/pypy/translator/c/exceptiontransform.py
==============================================================================
--- pypy/dist/pypy/translator/c/exceptiontransform.py (original)
+++ pypy/dist/pypy/translator/c/exceptiontransform.py Sat Mar 3 15:11:58 2007
@@ -9,6 +9,7 @@
from pypy.rpython.memory.lladdress import NULL
from pypy.rpython import rtyper
from pypy.rpython import rclass
+from pypy.rpython.rmodel import inputconst
from pypy.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong
from pypy.annotation import model as annmodel
from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
@@ -45,25 +46,25 @@
mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper)
l2a = annmodel.lltype_to_annotation
- class ExcData(object):
- pass
- #exc_type = lltype.nullptr(self.exc_data.lltype_of_exception_type.TO)
- #exc_value = lltype.nullptr(self.exc_data.lltype_of_exception_value.TO)
+ EXCDATA = lltype.Struct('ExcData',
+ ('exc_type', self.lltype_of_exception_type),
+ ('exc_value', self.lltype_of_exception_value))
+ self.EXCDATA = EXCDATA
- exc_data = ExcData()
+ exc_data = lltype.malloc(EXCDATA, immortal=True)
null_type = lltype.nullptr(self.lltype_of_exception_type.TO)
null_value = lltype.nullptr(self.lltype_of_exception_value.TO)
def rpyexc_occured():
exc_type = exc_data.exc_type
- return exc_type is not null_type
+ return bool(exc_type)
# XXX tmp HACK for genllvm
# llvm is strongly typed between bools and ints, which means we have no way of
# calling rpyexc_occured() from c code with lltype.Bool
def _rpyexc_occured():
exc_type = exc_data.exc_type
- return exc_type is not null_type
+ return bool(exc_type)
def rpyexc_fetch_type():
return exc_data.exc_type
@@ -143,11 +144,8 @@
mixlevelannotator.finish()
- ExcDataDef = translator.annotator.bookkeeper.getuniqueclassdef(ExcData)
- self.ExcData_repr = rclass.getinstancerepr(translator.rtyper, ExcDataDef)
- self.exc_data_ptr = self.ExcData_repr.convert_const(exc_data)
- self.cexcdata = Constant(self.exc_data_ptr,
- self.ExcData_repr.lowleveltype)
+ self.exc_data_ptr = exc_data
+ self.cexcdata = Constant(exc_data, lltype.Ptr(EXCDATA))
self.lltype_to_classdef = translator.rtyper.lltype_to_classdef_mapping()
p = lltype.nullptr(self.lltype_of_exception_type.TO)
@@ -155,6 +153,15 @@
p = lltype.nullptr(self.lltype_of_exception_value.TO)
self.c_null_evalue = Constant(p, self.lltype_of_exception_value)
+ def gen_getfield(self, name, llops):
+ c_name = inputconst(lltype.Void, name)
+ return llops.genop('getfield', [self.cexcdata, c_name],
+ resulttype = getattr(self.EXCDATA, name))
+
+ def gen_setfield(self, name, v_value, llops):
+ c_name = inputconst(lltype.Void, name)
+ llops.genop('setfield', [self.cexcdata, c_name, v_value])
+
def transform_completely(self):
for graph in self.translator.graphs:
self.create_exception_handling(graph)
@@ -288,11 +295,10 @@
excblock = Block([])
llops = rtyper.LowLevelOpList(None)
- r = self.ExcData_repr
- var_value = r.getfield(self.cexcdata, 'exc_value', llops)
- var_type = r.getfield(self.cexcdata, 'exc_type', llops)
- r.setfield(self.cexcdata, 'exc_value', self.c_null_evalue, llops)
- r.setfield(self.cexcdata, 'exc_type', self.c_null_etype, llops)
+ var_value = self.gen_getfield('exc_value', llops)
+ var_type = self.gen_getfield('exc_type' , llops)
+ self.gen_setfield('exc_value', self.c_null_evalue, llops)
+ self.gen_setfield('exc_type', self.c_null_etype, llops)
excblock.operations[:] = llops
newgraph.exceptblock.inputargs[0].concretetype = self.lltype_of_exception_type
newgraph.exceptblock.inputargs[1].concretetype = self.lltype_of_exception_value
@@ -327,7 +333,7 @@
var_exc_occured = llops.genop('ptr_iszero', [spaceop.result],
lltype.Bool)
else:
- v_exc_type = self.ExcData_repr.getfield(self.cexcdata, 'exc_type', llops)
+ v_exc_type = self.gen_getfield('exc_type', llops)
var_exc_occured = llops.genop('ptr_nonzero', [v_exc_type],
lltype.Bool)
@@ -374,7 +380,6 @@
if normalafterblock is None:
normalafterblock = insert_empty_block(None, l0)
llops = rtyper.LowLevelOpList(None)
- r = self.ExcData_repr
- r.setfield(self.cexcdata, 'exc_value', self.c_null_evalue, llops)
- r.setfield(self.cexcdata, 'exc_type', self.c_null_etype, llops)
+ self.gen_setfield('exc_value', self.c_null_evalue, llops)
+ self.gen_setfield('exc_type', self.c_null_etype, llops)
normalafterblock.operations[:0] = llops
More information about the Pypy-commit
mailing list