diff options
author | Benjamin Peterson <benjamin@python.org> | 2012-04-18 15:19:00 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2012-04-18 15:19:00 (GMT) |
commit | 6e3358a1d59acfd9507cd9a7b4513319b99d21ab (patch) | |
tree | ed3540fd785e50d4aba3337e3b410f00d5917194 | |
parent | eca851815d654c6e6ef50fe0b38b9e9c6076ceea (diff) | |
parent | e42fb307edbdc8bb98fa5d43646cbbe33f307501 (diff) | |
download | cpython-6e3358a1d59acfd9507cd9a7b4513319b99d21ab.zip cpython-6e3358a1d59acfd9507cd9a7b4513319b99d21ab.tar.gz cpython-6e3358a1d59acfd9507cd9a7b4513319b99d21ab.tar.bz2 |
merge 3.2 (#14612)
-rw-r--r-- | Lib/test/test_sys_settrace.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/frameobject.c | 6 |
3 files changed, 17 insertions, 2 deletions
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 578e95d..fdf958c 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -675,6 +675,14 @@ def no_jump_to_non_integers(output): no_jump_to_non_integers.jump = (2, "Spam") no_jump_to_non_integers.output = [True] +def jump_across_with(output): + with open(support.TESTFN, "wb") as fp: + pass + with open(support.TESTFN, "wb") as fp: + pass +jump_across_with.jump = (1, 3) +jump_across_with.output = [] + # This verifies that you can't set f_lineno via _getframe or similar # trickery. def no_jump_without_trace_function(): @@ -750,6 +758,9 @@ class JumpTestCase(unittest.TestCase): # Must set sys.settrace(None) in setUp(), else condition is not # triggered. no_jump_without_trace_function() + def test_jump_across_with(self): + self.addCleanup(support.unlink, support.TESTFN) + self.run_test(jump_across_with) def test_20_large_function(self): d = {} @@ -14,6 +14,8 @@ Core and Builtins object for importlib.util.module_for_loader and importlib.machinery.PathFinder. +- Issue #14612: Fix jumping around with blocks by setting f_lineno. + - Issue #14592: Attempting a relative import w/o __package__ or __name__ set in globals raises a KeyError. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index b33d72b..c8b8b1d 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -199,6 +199,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) case SETUP_LOOP: case SETUP_EXCEPT: case SETUP_FINALLY: + case SETUP_WITH: blockstack[blockstack_top++] = addr; in_finally[blockstack_top-1] = 0; break; @@ -206,7 +207,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) case POP_BLOCK: assert(blockstack_top > 0); setup_op = code[blockstack[blockstack_top-1]]; - if (setup_op == SETUP_FINALLY) { + if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH) { in_finally[blockstack_top-1] = 1; } else { @@ -221,7 +222,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) * be seeing such an END_FINALLY.) */ if (blockstack_top > 0) { setup_op = code[blockstack[blockstack_top-1]]; - if (setup_op == SETUP_FINALLY) { + if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH) { blockstack_top--; } } @@ -283,6 +284,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) case SETUP_LOOP: case SETUP_EXCEPT: case SETUP_FINALLY: + case SETUP_WITH: delta_iblock++; break; |