Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r46464:869b4929ad06 Date: 2011-08-12 11:59 +0200 http://bitbucket.org/pypy/pypy/changeset/869b4929ad06/
Log: FrameBlocks are _immutable_, so don't change the 'previous' attribute. diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py --- a/pypy/interpreter/pyframe.py +++ b/pypy/interpreter/pyframe.py @@ -80,7 +80,7 @@ self.escaped = True def append_block(self, block): - block.previous = self.lastblock + assert block.previous is self.lastblock self.lastblock = block def pop_block(self): @@ -106,7 +106,8 @@ while i >= 0: block = lst[i] i -= 1 - self.append_block(block) + block.previous = self.lastblock + self.lastblock = block def get_builtin(self): if self.space.config.objspace.honor__builtins__: diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -892,16 +892,16 @@ raise BytecodeCorruption, "old opcode, no longer in use" def SETUP_LOOP(self, offsettoend, next_instr): - block = LoopBlock(self, next_instr + offsettoend) - self.append_block(block) + block = LoopBlock(self, next_instr + offsettoend, self.lastblock) + self.lastblock = block def SETUP_EXCEPT(self, offsettoend, next_instr): - block = ExceptBlock(self, next_instr + offsettoend) - self.append_block(block) + block = ExceptBlock(self, next_instr + offsettoend, self.lastblock) + self.lastblock = block def SETUP_FINALLY(self, offsettoend, next_instr): - block = FinallyBlock(self, next_instr + offsettoend) - self.append_block(block) + block = FinallyBlock(self, next_instr + offsettoend, self.lastblock) + self.lastblock = block def SETUP_WITH(self, offsettoend, next_instr): w_manager = self.peekvalue() @@ -915,8 +915,8 @@ w_exit = self.space.get(w_descr, w_manager) self.settopvalue(w_exit) w_result = self.space.get_and_call_function(w_enter, w_manager) - block = WithBlock(self, next_instr + offsettoend) - self.append_block(block) + block = WithBlock(self, next_instr + offsettoend, self.lastblock) + self.lastblock = block self.pushvalue(w_result) def WITH_CLEANUP(self, oparg, next_instr): @@ -1247,10 +1247,10 @@ _immutable_ = True - def __init__(self, frame, handlerposition): + def __init__(self, frame, handlerposition, previous): self.handlerposition = handlerposition self.valuestackdepth = frame.valuestackdepth - self.previous = None # this makes a linked list of blocks + self.previous = previous # this makes a linked list of blocks def __eq__(self, other): return (self.__class__ is other.__class__ and 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 @@ -406,8 +406,8 @@ w_exit = self.space.getattr(w_manager, self.space.wrap("__exit__")) self.settopvalue(w_exit) w_result = self.space.call_method(w_manager, "__enter__") - block = WithBlock(self, next_instr + offsettoend) - self.append_block(block) + block = WithBlock(self, next_instr + offsettoend, self.lastblock) + self.lastblock = block self.pushvalue(w_result) # XXX Unimplemented 2.7 opcodes ---------------- _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit