[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