[pypy-commit] pypy py3k: Fix stack depth computation.
mjacob
noreply at buildbot.pypy.org
Thu May 28 20:21:31 CEST 2015
Author: Manuel Jacob <me at manueljacob.de>
Branch: py3k
Changeset: r77663:0deda0f5a850
Date: 2015-05-28 20:21 +0200
http://bitbucket.org/pypy/pypy/changeset/0deda0f5a850/
Log: Fix stack depth computation.
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
@@ -397,7 +397,7 @@
if block.auto_inserted_return and depth != 0:
os.write(2, "StackDepthComputationError in %s at %s:%s\n" % (
self.compile_info.filename, self.name, self.first_lineno))
- #raise StackDepthComputationError # fatal error
+ raise StackDepthComputationError # fatal error
return self._max_depth
def _next_stack_depth_walk(self, nextblock, depth):
@@ -418,9 +418,12 @@
elif (jump_op == ops.SETUP_FINALLY or
jump_op == ops.SETUP_EXCEPT or
jump_op == ops.SETUP_WITH):
- if jump_op == ops.SETUP_WITH:
- target_depth -= 1 # ignore the w_result just pushed
- target_depth += 3 # add [exc_type, exc, unroller]
+ if jump_op == ops.SETUP_FINALLY:
+ target_depth += 3
+ elif jump_op == ops.SETUP_EXCEPT:
+ target_depth += 4
+ elif jump_op == ops.SETUP_WITH:
+ target_depth += 2
if target_depth > self._max_depth:
self._max_depth = target_depth
elif (jump_op == ops.JUMP_IF_TRUE_OR_POP or
@@ -597,13 +600,13 @@
ops.LOAD_BUILD_CLASS: 1,
ops.STORE_LOCALS: -1,
ops.POP_BLOCK: 0,
- ops.POP_EXCEPT: 0,
- ops.END_FINALLY: -3, # assume always 3: we pretend that SETUP_FINALLY
- # pushes 3. In truth, it would only push 1 and
+ ops.POP_EXCEPT: -1,
+ ops.END_FINALLY: -4, # assume always 4: we pretend that SETUP_FINALLY
+ # pushes 4. In truth, it would only push 1 and
# the corresponding END_FINALLY only pops 1.
ops.SETUP_WITH: 1,
ops.SETUP_FINALLY: 0,
- ops.SETUP_EXCEPT: 4,
+ ops.SETUP_EXCEPT: 0,
ops.RETURN_VALUE: -1,
ops.YIELD_VALUE: 0,
diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -478,6 +478,14 @@
yield self.st, decl, 'A,A1,A2,B2,C,C1,C2,D1,E,G,G1,G2,N1', \
(6,6 ,4 ,1 ,5,5 ,5 ,3 ,8,2,2 ,2 ,7 )
+ def test_try_except(self):
+ yield self.simple_test, """
+ x = 42
+ try:
+ pass
+ except:
+ x = 0
+ """, 'x', 42
def test_try_except_finally(self):
yield self.simple_test, """
More information about the pypy-commit
mailing list