[pypy-svn] r20381 - in pypy/branch/somepbc-refactoring/pypy/rpython: . lltypesystem test

arigo at codespeak.net arigo at codespeak.net
Tue Nov 29 12:15:17 CET 2005


Author: arigo
Date: Tue Nov 29 12:15:16 2005
New Revision: 20381

Modified:
   pypy/branch/somepbc-refactoring/pypy/rpython/llinterp.py
   pypy/branch/somepbc-refactoring/pypy/rpython/lltypesystem/exceptiondata.py
   pypy/branch/somepbc-refactoring/pypy/rpython/test/test_exception.py
   pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llinterp.py
Log:
Turned the exceptiondata helpers into function pointers.
They were plain functions originally, then they were turned
to graphs, but back-ends should deal with function pointers
more than graphs -- e.g. direct_call operations contain
function pointers, not graphs.

Another way to put it is that there is no reason why these
helpers could not be external functions (no graph then).



Modified: pypy/branch/somepbc-refactoring/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/llinterp.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/llinterp.py	Tue Nov 29 12:15:16 2005
@@ -195,8 +195,8 @@
                 cls, inst = e.args
                 for link in block.exits[1:]:
                     assert issubclass(link.exitcase, Exception)
-                    if self.llinterpreter.eval_graph(
-                        exdata.ll_exception_match_graph, [cls, link.llexitcase]):
+                    if self.op_direct_call(exdata.fn_exception_match,
+                                           cls, link.llexitcase):
                         self.setifvar(link.last_exception, cls)
                         self.setifvar(link.last_exc_value, inst)
                         break
@@ -222,15 +222,13 @@
         typer = self.llinterpreter.typer
         exdata = typer.getexceptiondata()
         if isinstance(exc, OSError):
-            fn = typer.type_system.getcallable(exdata.ll_raise_OSError_graph)
-            self.op_direct_call(fn, exc.errno)
+            self.op_direct_call(exdata.fn_raise_OSError, exc.errno)
             assert False, "op_direct_call above should have raised"
         else:
             exc_class = exc.__class__
-            evalue = self.llinterpreter.eval_graph(
-                exdata.ll_pyexcclass2exc_graph, [self.llt.pyobjectptr(exc_class)])
-            etype = self.llinterpreter.eval_graph(
-                exdata.ll_type_of_exc_inst_graph, [evalue])
+            evalue = self.op_direct_call(exdata.fn_pyexcclass2exc,
+                                         self.llt.pyobjectptr(exc_class))
+            etype = self.op_direct_call(exdata.fn_type_of_exc_inst, evalue)
         raise LLException(etype, evalue)
 
     def invoke_callable_with_pyexceptions(self, fptr, *args):

Modified: pypy/branch/somepbc-refactoring/pypy/rpython/lltypesystem/exceptiondata.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/lltypesystem/exceptiondata.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/lltypesystem/exceptiondata.py	Tue Nov 29 12:15:16 2005
@@ -25,11 +25,11 @@
 
 
     def make_helpers(self, rtyper):
-        # create helper functions
-        self.ll_exception_match_graph  = self.make_exception_matcher(rtyper)
-        self.ll_type_of_exc_inst_graph = self.make_type_of_exc_inst(rtyper)
-        self.ll_pyexcclass2exc_graph   = self.make_pyexcclass2exc(rtyper)
-        self.ll_raise_OSError_graph    = self.make_raise_OSError(rtyper)
+        # create helper functionptrs
+        self.fn_exception_match  = self.make_exception_matcher(rtyper)
+        self.fn_type_of_exc_inst = self.make_type_of_exc_inst(rtyper)
+        self.fn_pyexcclass2exc   = self.make_pyexcclass2exc(rtyper)
+        self.fn_raise_OSError    = self.make_raise_OSError(rtyper)
 
 
     def make_standard_exceptions(self, rtyper):
@@ -44,7 +44,7 @@
         s_typeptr = annmodel.SomePtr(self.lltype_of_exception_type)
         helper_graph = annotate_lowlevel_helper(
             rtyper.annotator, rclass.ll_issubclass, [s_typeptr, s_typeptr])
-        return helper_graph
+        return rtyper.getcallable(helper_graph)
 
 
     def make_raise_OSError(self, rtyper):
@@ -53,7 +53,7 @@
             raise OSError(errno, None)
         helper_graph = annotate_lowlevel_helper(
             rtyper.annotator, ll_raise_OSError, [annmodel.SomeInteger()])
-        return helper_graph
+        return rtyper.getcallable(helper_graph)
 
 
     def make_type_of_exc_inst(self, rtyper):
@@ -61,7 +61,7 @@
         s_excinst = annmodel.SomePtr(self.lltype_of_exception_value)
         helper_graph = annotate_lowlevel_helper(
             rtyper.annotator, rclass.ll_type, [s_excinst])
-        return helper_graph
+        return rtyper.getcallable(helper_graph)
 
 
     def make_pyexcclass2exc(self, rtyper):
@@ -141,4 +141,4 @@
         s_pyobj = annmodel.SomePtr(Ptr(PyObject))
         helper_graph = annotate_lowlevel_helper(
             rtyper.annotator, ll_pyexcclass2exc, [s_pyobj])
-        return helper_graph
+        return rtyper.getcallable(helper_graph)

Modified: pypy/branch/somepbc-refactoring/pypy/rpython/test/test_exception.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/test/test_exception.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/test/test_exception.py	Tue Nov 29 12:15:16 2005
@@ -37,22 +37,21 @@
     a = t.annotate([int])
     t.specialize()
     excdata = t.rtyper.getexceptiondata()
-    ll_pyexcclass2exc = excdata.ll_pyexcclass2exc_graph.func # original callable version
     getcdef = a.bookkeeper.getuniqueclassdef
 
     #t.view()
-    ovferr_inst = ll_pyexcclass2exc(pyobjectptr(OverflowError))
+    ovferr_inst = excdata.fn_pyexcclass2exc(pyobjectptr(OverflowError))
     classdef = getcdef(OverflowError)
     assert ovferr_inst.typeptr == t.rtyper.class_reprs[classdef].getvtable()
 
-    taberr_inst = ll_pyexcclass2exc(pyobjectptr(TabError))
+    taberr_inst = excdata.fn_pyexcclass2exc(pyobjectptr(TabError))
     classdef = getcdef(StandardError) # most precise class seen
     assert taberr_inst.typeptr == t.rtyper.class_reprs[classdef].getvtable()
 
-    myerr_inst = ll_pyexcclass2exc(pyobjectptr(MyException))
+    myerr_inst = excdata.fn_pyexcclass2exc(pyobjectptr(MyException))
     assert myerr_inst.typeptr == t.rtyper.class_reprs[None].getvtable()
 
-    strgerr_inst = ll_pyexcclass2exc(pyobjectptr(MyStrangeException))
+    strgerr_inst = excdata.fn_pyexcclass2exc(pyobjectptr(MyStrangeException))
     assert strgerr_inst.typeptr == t.rtyper.class_reprs[None].getvtable()
 
 

Modified: pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llinterp.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llinterp.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llinterp.py	Tue Nov 29 12:15:16 2005
@@ -23,7 +23,10 @@
     assert isinstance(exc, LLException)
     import exceptions
     klass, inst = exc.args
-    ll_pyexcclass2exc_graph = typer.getexceptiondata().ll_pyexcclass2exc_graph
+    # indirect way to invoke fn_pyexcclass2exc, for memory/test/test_llinterpsim
+    f = typer.getexceptiondata().fn_pyexcclass2exc
+    obj = typer.type_system.deref(f)
+    ll_pyexcclass2exc_graph = obj.graph
     for cls in exceptions.__dict__.values():
         if type(cls) is type(Exception):
             if interp.eval_graph(ll_pyexcclass2exc_graph, [pyobjectptr(cls)]).typeptr == klass:



More information about the Pypy-commit mailing list