Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: py3.5-refactor-sys_exc_info Changeset: r88425:3f27a0c78aa5 Date: 2016-11-17 08:56 +0000 http://bitbucket.org/pypy/pypy/changeset/3f27a0c78aa5/
Log: (arigo) typos. write a minimal test now for the expected errors diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py --- a/pypy/interpreter/pyframe.py +++ b/pypy/interpreter/pyframe.py @@ -655,7 +655,9 @@ blockstack.append(addr) blockstack.append(-1) elif op == POP_BLOCK: - assert len(blockstack) >= 3 + if len(blockstack) < 3: + raise oefmt(space.w_SystemError, + "blocks not properly nested in this bytecode") blockstack.pop() setup_op = ord(code[blockstack.pop()]) if setup_op != SETUP_LOOP: @@ -670,22 +672,24 @@ assert ii >= 0 handler_addr = blockstack[ii] if addr == new_lasti: - new_lasti_setup_addr = handler_addr + new_lasti_handler_addr = handler_addr if addr == self.last_instr: - f_lasti_setup_addr = handler_addr + f_lasti_handler_addr = handler_addr if op >= HAVE_ARGUMENT: addr += 3 else: addr += 1 - assert len(blockstack) == 0 + if len(blockstack) != 1: + raise oefmt(space.w_SystemError, + "blocks not properly nested in this bytecode") if new_lasti_handler_addr != f_lasti_handler_addr: raise oefmt(space.w_ValueError, "can't jump into or out of an 'expect' or " "'finally' block (%d -> %d)", - f_lasti_handler_addr, new_lasti_setup_addr) + f_lasti_handler_addr, new_lasti_handler_addr) # now we know we're not jumping into or out of a place which # needs a SysExcInfoRestorer. Check that we're not jumping diff --git a/pypy/interpreter/test/test_pyframe.py b/pypy/interpreter/test/test_pyframe.py --- a/pypy/interpreter/test/test_pyframe.py +++ b/pypy/interpreter/test/test_pyframe.py @@ -87,6 +87,40 @@ sys.settrace(None) # assert did not crash + def test_f_lineno_set_2(self): + counter = [0] + errors = [] + + def tracer(f, event, *args): + if event == 'line': + counter[0] += 1 + if counter[0] == 2: + try: + f.f_lineno += 2 + except ValueError as e: + errors.append(e) + return tracer + + # obscure: call open beforehand, py3k's open invokes some app + # level code that confuses our tracing (likely due to the + # testing env, otherwise it's not a problem) + f = open(self.tempfile1, 'w') + def function(): + try: + raise ValueError + except ValueError: + x = 42 + return x + + import sys + sys.settrace(tracer) + x = function() + sys.settrace(None) + assert x == 42 + assert len(errors) == 1 + assert str(errors[0]).startswith( + "can't jump into or out of an 'expect' or 'finally' block") + def test_f_lineno_set_firstline(self): r""" seen = [] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit