[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