[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