[pypy-svn] pypy default: (fijal, alex): fixed flow objspace/annotation of reraising exceptions

alex_gaynor commits-noreply at bitbucket.org
Wed Mar 9 16:13:25 CET 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: 
Changeset: r42487:45053e4a78a0
Date: 2011-03-09 10:04 -0500
http://bitbucket.org/pypy/pypy/changeset/45053e4a78a0/

Log:	(fijal, alex): fixed flow objspace/annotation of reraising
	exceptions

diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -543,9 +543,10 @@
         space = self.space
         if nbargs == 0:
             frame = self
+            ec = self.space.getexecutioncontext()
             while frame:
                 if frame.last_exception is not None:
-                    operror = frame.last_exception
+                    operror = ec._convert_exc(frame.last_exception)
                     break
                 frame = frame.f_backref()
             else:

diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -92,7 +92,7 @@
             self.topframe = ec.gettopframe()
             self.w_tracefunc = ec.w_tracefunc
             self.profilefunc = ec.profilefunc
-            self.w_profilefuncarg = ec.w_profilefuncarg 
+            self.w_profilefuncarg = ec.w_profilefuncarg
             self.is_tracing = ec.is_tracing
 
         def clear_framestack(self):
@@ -195,13 +195,16 @@
             self._trace(frame, 'exception', None, operationerr)
         #operationerr.print_detailed_traceback(self.space)
 
+    def _convert_exc(self, operr):
+        return operr
+
     def sys_exc_info(self): # attn: the result is not the wrapped sys.exc_info() !!!
         """Implements sys.exc_info().
         Return an OperationError instance or None."""
         frame = self.gettopframe_nohidden()
         while frame:
             if frame.last_exception is not None:
-                return frame.last_exception
+                return self._convert_exc(frame.last_exception)
             frame = self.getnextframe_nohidden(frame)
         return None
 
@@ -262,7 +265,7 @@
             return True
 
         space = self.space
-        
+
         # Tracing cases
         if event == 'call':
             w_callback = self.w_tracefunc
@@ -303,7 +306,7 @@
             if event == 'leaveframe':
                 event = 'return'
 
-            assert self.is_tracing == 0 
+            assert self.is_tracing == 0
             self.is_tracing += 1
             try:
                 try:
@@ -506,7 +509,7 @@
         for i in range(len(pending_w)):
             w_ref = pending_w[i]
             w_ref.activate_callback()
-        
+
 class FrameTraceAction(AsyncAction):
     """An action that calls the local trace functions (w_f_trace)."""
 

diff --git a/pypy/objspace/flow/flowcontext.py b/pypy/objspace/flow/flowcontext.py
--- a/pypy/objspace/flow/flowcontext.py
+++ b/pypy/objspace/flow/flowcontext.py
@@ -148,14 +148,14 @@
 
 
 class Replayer(Recorder):
-    
+
     def __init__(self, block, booloutcome, nextreplayer):
         self.crnt_block = block
         self.listtoreplay = block.operations
         self.booloutcome = booloutcome
         self.nextreplayer = nextreplayer
         self.index = 0
-        
+
     def append(self, operation):
         operation.result = self.listtoreplay[self.index].result
         assert operation == self.listtoreplay[self.index], (
@@ -188,9 +188,9 @@
                  name=None):
         ExecutionContext.__init__(self, space)
         self.code = code
-        
+
         self.w_globals = w_globals = space.wrap(globals)
-        
+
         self.crnt_offset = -1
         self.crnt_frame = None
         if closure is None:
@@ -373,8 +373,7 @@
             candidates.insert(0, newblock)
             self.pendingblocks.append(newblock)
 
-    def sys_exc_info(self):
-        operr = ExecutionContext.sys_exc_info(self)
+    def _convert_exc(self, operr):
         if isinstance(operr, operation.ImplicitOperationError):
             # re-raising an implicit operation makes it an explicit one
             w_value = operr.get_w_value(self.space)


More information about the Pypy-commit mailing list