Unverified Kaydet (Commit) 397466df authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka Kaydeden (comit) GitHub

bpo-30953: Improve error messages and add tests for jumping (GH-6196)

into/out of an except block.
üst 702f8f36
...@@ -1201,8 +1201,16 @@ class JumpTestCase(unittest.TestCase): ...@@ -1201,8 +1201,16 @@ class JumpTestCase(unittest.TestCase):
output.append(7) output.append(7)
output.append(8) output.append(8)
@jump_test(3, 6, [2, 5, 6], (ValueError, 'finally')) @jump_test(1, 5, [], (ValueError, "into a 'finally'"))
def test_no_jump_into_finally_block(output): def test_no_jump_into_finally_block(output):
output.append(1)
try:
output.append(3)
finally:
output.append(5)
@jump_test(3, 6, [2, 5, 6], (ValueError, "into a 'finally'"))
def test_no_jump_into_finally_block_from_try_block(output):
try: try:
output.append(2) output.append(2)
output.append(3) output.append(3)
...@@ -1211,21 +1219,71 @@ class JumpTestCase(unittest.TestCase): ...@@ -1211,21 +1219,71 @@ class JumpTestCase(unittest.TestCase):
output.append(6) output.append(6)
output.append(7) output.append(7)
@jump_test(1, 5, [], (ValueError, 'finally')) @jump_test(5, 1, [1, 3], (ValueError, "out of a 'finally'"))
def test_no_jump_into_finally_block_2(output): def test_no_jump_out_of_finally_block(output):
output.append(1) output.append(1)
try: try:
output.append(3) output.append(3)
finally: finally:
output.append(5) output.append(5)
@jump_test(5, 1, [1, 3], (ValueError, 'finally')) @jump_test(1, 5, [], (ValueError, "into an 'except'"))
def test_no_jump_out_of_finally_block(output): def test_no_jump_into_bare_except_block(output):
output.append(1) output.append(1)
try: try:
output.append(3) output.append(3)
finally: except:
output.append(5)
@jump_test(1, 5, [], (ValueError, "into an 'except'"))
def test_no_jump_into_qualified_except_block(output):
output.append(1)
try:
output.append(3)
except Exception:
output.append(5)
@jump_test(3, 6, [2, 5, 6], (ValueError, "into an 'except'"))
def test_no_jump_into_bare_except_block_from_try_block(output):
try:
output.append(2)
output.append(3)
except: # executed if the jump is failed
output.append(5) output.append(5)
output.append(6)
raise
output.append(8)
@jump_test(3, 6, [2], (ValueError, "into an 'except'"))
def test_no_jump_into_qualified_except_block_from_try_block(output):
try:
output.append(2)
output.append(3)
except ZeroDivisionError:
output.append(5)
output.append(6)
raise
output.append(8)
@jump_test(7, 1, [1, 3, 6], (ValueError, "out of an 'except'"))
def test_no_jump_out_of_bare_except_block(output):
output.append(1)
try:
output.append(3)
1/0
except:
output.append(6)
output.append(7)
@jump_test(7, 1, [1, 3, 6], (ValueError, "out of an 'except'"))
def test_no_jump_out_of_qualified_except_block(output):
output.append(1)
try:
output.append(3)
1/0
except Exception:
output.append(6)
output.append(7)
@jump_test(3, 5, [1, 2, -2], (ValueError, 'into')) @jump_test(3, 5, [1, 2, -2], (ValueError, 'into'))
def test_no_jump_between_with_blocks(output): def test_no_jump_between_with_blocks(output):
......
...@@ -277,8 +277,12 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) ...@@ -277,8 +277,12 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
int first_in = target_addr <= f->f_lasti && f->f_lasti <= addr; int first_in = target_addr <= f->f_lasti && f->f_lasti <= addr;
int second_in = target_addr <= new_lasti && new_lasti <= addr; int second_in = target_addr <= new_lasti && new_lasti <= addr;
if (first_in != second_in) { if (first_in != second_in) {
PyErr_SetString(PyExc_ValueError, op = code[target_addr];
"can't jump into or out of a 'finally' block"); PyErr_Format(PyExc_ValueError,
"can't jump %s %s block",
second_in ? "into" : "out of",
(op == DUP_TOP || op == POP_TOP) ?
"an 'except'" : "a 'finally'");
return -1; return -1;
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment