[pypy-commit] pypy py3.5: Manual copy of b4e83acb5f3c, and fix of a resulting issue: two opcodes
arigo
pypy.commits at gmail.com
Thu Aug 18 13:34:46 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r86286:f8ffd7d38ab1
Date: 2016-08-18 19:34 +0200
http://bitbucket.org/pypy/pypy/changeset/f8ffd7d38ab1/
Log: Manual copy of b4e83acb5f3c, and fix of a resulting issue: two
opcodes had a wrong stack effect
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
@@ -389,7 +389,8 @@
def _stacksize(self, blocks):
"""Compute co_stacksize."""
for block in blocks:
- block.initial_depth = 0
+ block.initial_depth = -99
+ blocks[0].initial_depth = 0
# Assumes that it is sufficient to walk the blocks in 'post-order'.
# This means we ignore all back-edges, but apart from that, we only
# look into a block when all the previous blocks have been done.
@@ -408,8 +409,11 @@
def _do_stack_depth_walk(self, block):
depth = block.initial_depth
+ if depth == -99: # this block is never reached, skip
+ return 0
for instr in block.instructions:
depth += _opcode_stack_effect(instr.opcode, instr.arg)
+ assert depth >= 0
if depth >= self._max_depth:
self._max_depth = depth
jump_op = instr.opcode
@@ -560,7 +564,6 @@
ops.LIST_APPEND: -1,
ops.SET_ADD: -1,
ops.MAP_ADD: -2,
- # XXX
ops.BINARY_POWER: -1,
ops.BINARY_MULTIPLY: -1,
@@ -602,8 +605,8 @@
ops.PRINT_EXPR: -1,
- ops.WITH_CLEANUP_START: -1,
- ops.WITH_CLEANUP_FINISH: -1, # XXX Sometimes more
+ ops.WITH_CLEANUP_START: 1,
+ ops.WITH_CLEANUP_FINISH: -2,
ops.LOAD_BUILD_CLASS: 1,
ops.POP_BLOCK: 0,
ops.POP_EXCEPT: -1,
@@ -619,7 +622,6 @@
ops.YIELD_FROM: -1,
ops.COMPARE_OP: -1,
- # TODO
ops.LOOKUP_METHOD: 1,
ops.LOAD_NAME: 1,
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
@@ -511,6 +511,9 @@
x *= 7
""", 'x', 42
+ def test_with_stacksize_bug(self):
+ compile_with_astcompiler("with a:\n pass", 'exec', self.space)
+
def test_with_bug(self):
yield self.simple_test, """
class ContextManager:
More information about the pypy-commit
mailing list