# HG changeset patch # User Bram Moolenaar # Date 1384128348 -3600 # Node ID a56f60cf683455bea96daf077458158041e4d6ba # Parent f376ec8e037e1a60dd073c8108a3194522f3466c updated for version 7.4.084 Problem: Python: interrupt not being properly discarded. (Yggdroot Chen) Solution: Discard interrupt in VimTryEnd. (ZyX) diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -558,7 +558,11 @@ VimTryEnd(void) /* Keyboard interrupt should be preferred over anything else */ if (got_int) { - did_throw = got_int = FALSE; + if (current_exception != NULL) + discard_current_exception(); + else + need_rethrow = did_throw = FALSE; + got_int = FALSE; PyErr_SetNone(PyExc_KeyboardInterrupt); return -1; } @@ -567,7 +571,10 @@ VimTryEnd(void) /* Python exception is preferred over vim one; unlikely to occur though */ else if (PyErr_Occurred()) { - did_throw = FALSE; + if (current_exception != NULL) + discard_current_exception(); + else + need_rethrow = did_throw = FALSE; return -1; } /* Finally transform VimL exception to python one */ diff --git a/src/testdir/test86.in b/src/testdir/test86.in --- a/src/testdir/test86.in +++ b/src/testdir/test86.in @@ -1281,6 +1281,37 @@ del Exe EOF :delfunction Exe :" +:" Regression: interrupting vim.command propagates to next vim.command +py << EOF +def test_keyboard_interrupt(): + try: + vim.command('while 1 | endwhile') + except KeyboardInterrupt: + cb.append('Caught KeyboardInterrupt') + except Exception: + cb.append('!!!!!!!! Caught exception: ' + repr(sys.exc_info)) + else: + cb.append('!!!!!!!! No exception') + try: + vim.command('$ put =\'Running :put\'') + except KeyboardInterrupt: + cb.append('!!!!!!!! Caught KeyboardInterrupt') + except Exception: + cb.append('!!!!!!!! Caught exception: ' + repr(sys.exc_info)) + else: + cb.append('No exception') +EOF +:debuggreedy +:call inputsave() +:call feedkeys("s\ns\ns\ns\nq\n") +:redir => output +:debug silent! py test_keyboard_interrupt() +:redir END +:0 debuggreedy +:silent $put =output +:unlet output +:py del test_keyboard_interrupt +:" :" Cleanup py << EOF del cb diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok --- a/src/testdir/test86.ok +++ b/src/testdir/test86.ok @@ -1198,3 +1198,7 @@ vim.eval("Exe('throw ''ghi''')"):error:( vim.eval("Exe('echoerr ''jkl''')"):error:('Vim(echoerr):jkl',) vim.eval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',) vim.bindeval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',) +Caught KeyboardInterrupt +Running :put +No exception + diff --git a/src/testdir/test87.in b/src/testdir/test87.in --- a/src/testdir/test87.in +++ b/src/testdir/test87.in @@ -1232,6 +1232,37 @@ del Exe EOF :delfunction Exe :" +:" Regression: interrupting vim.command propagates to next vim.command +py3 << EOF +def test_keyboard_interrupt(): + try: + vim.command('while 1 | endwhile') + except KeyboardInterrupt: + cb.append('Caught KeyboardInterrupt') + except Exception as e: + cb.append('!!!!!!!! Caught exception: ' + repr(e)) + else: + cb.append('!!!!!!!! No exception') + try: + vim.command('$ put =\'Running :put\'') + except KeyboardInterrupt: + cb.append('!!!!!!!! Caught KeyboardInterrupt') + except Exception as e: + cb.append('!!!!!!!! Caught exception: ' + repr(e)) + else: + cb.append('No exception') +EOF +:debuggreedy +:call inputsave() +:call feedkeys("s\ns\ns\ns\nq\n") +:redir => output +:debug silent! py3 test_keyboard_interrupt() +:redir END +:0 debuggreedy +:silent $put =output +:unlet output +:py3 del test_keyboard_interrupt +:" :" Cleanup py3 << EOF del cb diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok --- a/src/testdir/test87.ok +++ b/src/testdir/test87.ok @@ -1187,3 +1187,7 @@ vim.eval("Exe('throw ''ghi''')"):(, error('Vim(echoerr):jkl',)) vim.eval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) vim.bindeval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) +Caught KeyboardInterrupt +Running :put +No exception + diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 84, +/**/ 83, /**/ 82,