Author: Ronan Lamy <[email protected]>
Branch: less-stringly-ops
Changeset: r66222:3070ec015774
Date: 2013-08-12 01:50 +0100
http://bitbucket.org/pypy/pypy/changeset/3070ec015774/
Log: Create SuspendedUnroller.unroll() and use it to simplify some code
diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -419,12 +419,6 @@
block.cleanupstack(self)
return None
- def unrollstack_and_jump(self, unroller):
- block = self.unrollstack(unroller)
- if block is None:
- raise BytecodeCorruption("misplaced bytecode - should not return")
- return block.handle(self, unroller)
-
def getstate(self):
# getfastscope() can return real None, for undefined locals
data = self.save_locals_stack()
@@ -586,12 +580,7 @@
def handle_operation_error(self, operr):
unroller = SApplicationException(operr)
- block = self.unrollstack(unroller)
- if block is None:
- raise operr
- else:
- next_instr = block.handle(self, unroller)
- return next_instr
+ return unroller.unroll(self)
def getlocalvarname(self, index):
return self.pycode.co_varnames[index]
@@ -609,11 +598,11 @@
raise FlowingError(self, "This operation is not RPython")
def BREAK_LOOP(self, oparg, next_instr):
- return self.unrollstack_and_jump(SBreakLoop.singleton)
+ return SBreakLoop.singleton.unroll(self)
def CONTINUE_LOOP(self, startofloop, next_instr):
unroller = SContinueLoop(startofloop)
- return self.unrollstack_and_jump(unroller)
+ return unroller.unroll(self)
def cmp_lt(self, w_1, w_2):
return self.space.lt(w_1, w_2)
@@ -695,12 +684,7 @@
def RETURN_VALUE(self, oparg, next_instr):
w_returnvalue = self.popvalue()
unroller = SReturnValue(w_returnvalue)
- block = self.unrollstack(unroller)
- if block is None:
- raise Return(w_returnvalue)
- else:
- next_instr = block.handle(self, unroller)
- return next_instr # now inside a 'finally' block
+ return unroller.unroll(self)
def END_FINALLY(self, oparg, next_instr):
# unlike CPython, there are two statically distinct cases: the
@@ -718,20 +702,12 @@
return
elif isinstance(w_top, SuspendedUnroller):
# case of a finally: block
- return self.unroll_finally(w_top)
+ return w_top.unroll(self)
else:
# case of an except: block. We popped the exception type
self.popvalue() # Now we pop the exception value
unroller = self.popvalue()
- return self.unroll_finally(unroller)
-
- def unroll_finally(self, unroller):
- # go on unrolling the stack
- block = self.unrollstack(unroller)
- if block is None:
- unroller.nomoreblocks()
- else:
- return block.handle(self, unroller)
+ return unroller.unroll(self)
def POP_BLOCK(self, oparg, next_instr):
block = self.blockstack.pop()
@@ -1181,6 +1157,13 @@
WHY_CONTINUE, SContinueLoop
WHY_YIELD not needed
"""
+ def unroll(self, frame):
+ block = frame.unrollstack(self)
+ if block is None:
+ return self.nomoreblocks()
+ else:
+ return block.handle(frame, self)
+
def nomoreblocks(self):
raise BytecodeCorruption("misplaced bytecode - should not return")
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit