Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r76761:46d0755129c5 Date: 2015-04-09 14:59 +0200 http://bitbucket.org/pypy/pypy/changeset/46d0755129c5/
Log: Check in the test that found the bugs in f57c8be4e18c, d77902fffe58, 72049e6e23d8, e66f14f4e3d9. diff --git a/pypy/interpreter/astcompiler/assemble.py b/pypy/interpreter/astcompiler/assemble.py --- a/pypy/interpreter/astcompiler/assemble.py +++ b/pypy/interpreter/astcompiler/assemble.py @@ -9,6 +9,10 @@ from pypy.tool import stdlib_opcode as ops +class StackDepthComputationError(Exception): + pass + + class Instruction(object): """Represents a single opcode.""" @@ -55,11 +59,13 @@ reaches the end of the block, it continues to next_block. """ + marked = False + have_return = False + auto_inserted_return = False + def __init__(self): self.instructions = [] self.next_block = None - self.marked = False - self.have_return = False def _post_order_see(self, stack, nextblock): if nextblock.marked == 0: @@ -384,7 +390,9 @@ # look into a block when all the previous blocks have been done. self._max_depth = 0 for block in blocks: - self._do_stack_depth_walk(block) + depth = self._do_stack_depth_walk(block) + if block.auto_inserted_return and depth != 0: + raise StackDepthComputationError # fatal error return self._max_depth def _next_stack_depth_walk(self, nextblock, depth): @@ -421,6 +429,7 @@ break if block.next_block and not done: self._next_stack_depth_walk(block.next_block, depth) + return depth def _build_lnotab(self, blocks): """Build the line number table for tracebacks and tracing.""" @@ -473,6 +482,7 @@ if self.add_none_to_final_return: self.load_const(self.space.w_None) self.emit_op(ops.RETURN_VALUE) + self.current_block.auto_inserted_return = True # Set the first lineno if it is not already explicitly set. if self.first_lineno == -1: if self.first_block.instructions: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit