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

Reply via email to