Author: Alex Gaynor <alex.gay...@gmail.com> Branch: kill-someobject Changeset: r57853:c45ce704a9b2 Date: 2012-10-07 20:25 +0200 http://bitbucket.org/pypy/pypy/changeset/c45ce704a9b2/
Log: merge diff --git a/pypy/rpython/exceptiondata.py b/pypy/rpython/exceptiondata.py --- a/pypy/rpython/exceptiondata.py +++ b/pypy/rpython/exceptiondata.py @@ -39,6 +39,7 @@ self.r_exception_value = r_instance self.lltype_of_exception_type = r_type.lowleveltype self.lltype_of_exception_value = r_instance.lowleveltype + self.rtyper = rtyper def make_standard_exceptions(self, rtyper): bk = rtyper.annotator.bookkeeper @@ -51,28 +52,6 @@ classdef = bk.getuniqueclassdef(cls) rclass.getclassrepr(rtyper, classdef).setup() - def make_raise_noarg(self, rtyper): - def ll_raise_noarg(classname): - if classname == 'OverflowError': - raise OverflowError - if classname == 'ValueError': - raise ValueError - if classname == 'ZeroDivisionError': - raise ZeroDivisionError - if classname == 'MemoryError': - raise MemoryError - if classname == 'IOError': - raise IOError - if classname == 'StopIteration': - raise StopIteration - if classname == 'KeyError': - raise KeyError - if classname == 'IndexError': - raise IndexError - raise NotImplementedError # we did not special-case this so far - helper_fn = rtyper.annotate_helper_fn(ll_raise_noarg, [annmodel.SomeString()]) - return helper_fn - def make_raise_OSError(self, rtyper): # ll_raise_OSError(errno) def ll_raise_OSError(errno): @@ -86,5 +65,8 @@ example = r_inst.get_reusable_prebuilt_instance() example = self.cast_exception(self.lltype_of_exception_value, example) return example - + def get_standard_ll_exc_instance_by_class(self, exceptionclass): + clsdef = self.rtyper.annotator.bookkeeper.getuniqueclassdef( + exceptionclass) + return self.get_standard_ll_exc_instance(self.rtyper, clsdef) diff --git a/pypy/rpython/llinterp.py b/pypy/rpython/llinterp.py --- a/pypy/rpython/llinterp.py +++ b/pypy/rpython/llinterp.py @@ -459,11 +459,11 @@ exdata = typer.getexceptiondata() if isinstance(exc, OSError): self.op_direct_call(exdata.fn_raise_OSError, exc.errno) + assert False, "op_direct_call above should have raised" else: - exc_class = exc.__class__.__name__ - llname = typer.type_system.rstr.string_repr.convert_const(exc_class) - self.op_direct_call(exdata.fn_raise_noarg, llname) - assert False, "op_direct_call above should have raised" + evalue = exdata.get_standard_ll_exc_instance_by_class(exc.__class__) + etype = self.op_direct_call(exdata.fn_type_of_exc_inst, evalue) + raise LLException(etype, evalue, *extraargs) def invoke_callable_with_pyexceptions(self, fptr, *args): obj = self.llinterpreter.typer.type_system.deref(fptr) diff --git a/pypy/rpython/lltypesystem/exceptiondata.py b/pypy/rpython/lltypesystem/exceptiondata.py --- a/pypy/rpython/lltypesystem/exceptiondata.py +++ b/pypy/rpython/lltypesystem/exceptiondata.py @@ -14,7 +14,6 @@ self.fn_exception_match = self.make_exception_matcher(rtyper) self.fn_type_of_exc_inst = self.make_type_of_exc_inst(rtyper) self.fn_raise_OSError = self.make_raise_OSError(rtyper) - self.fn_raise_noarg = self.make_raise_noarg(rtyper) def make_exception_matcher(self, rtyper): # ll_exception_matcher(real_exception_vtable, match_exception_vtable) diff --git a/pypy/rpython/ootypesystem/exceptiondata.py b/pypy/rpython/ootypesystem/exceptiondata.py --- a/pypy/rpython/ootypesystem/exceptiondata.py +++ b/pypy/rpython/ootypesystem/exceptiondata.py @@ -23,7 +23,6 @@ self.fn_exception_match = self.make_exception_matcher(rtyper) self.fn_type_of_exc_inst = self.make_type_of_exc_inst(rtyper) self.fn_raise_OSError = self.make_raise_OSError(rtyper) - self.fn_raise_noarg = self.make_raise_noarg(rtyper) def make_exception_matcher(self, rtyper): # ll_exception_matcher(real_exception_class, match_exception_class) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit