| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.997 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.997 |
| Problem: Vim and Python exceptions are different. |
| Solution: Make Vim exceptions be Python exceptions. (ZyX) |
| Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok, |
| src/testdir/test87.in, src/testdir/test87.ok |
| |
| |
| |
| |
| |
| *** 272,291 **** |
| /* Check to see whether a Vim error has been reported, or a keyboard |
| * interrupt has been detected. |
| */ |
| static int |
| ! VimErrorCheck(void) |
| { |
| if (got_int) |
| { |
| PyErr_SetNone(PyExc_KeyboardInterrupt); |
| return 1; |
| } |
| ! else if (did_emsg && !PyErr_Occurred()) |
| { |
| ! PyErr_SetNone(VimError); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| --- 272,313 ---- |
| /* Check to see whether a Vim error has been reported, or a keyboard |
| * interrupt has been detected. |
| */ |
| + |
| + static void |
| + VimTryStart(void) |
| + { |
| + ++trylevel; |
| + } |
| + |
| static int |
| ! VimTryEnd(void) |
| { |
| + --trylevel; |
| if (got_int) |
| { |
| PyErr_SetNone(PyExc_KeyboardInterrupt); |
| return 1; |
| } |
| ! else if (!did_throw) |
| ! return 0; |
| ! else if (PyErr_Occurred()) |
| ! return 1; |
| ! else |
| { |
| ! PyErr_SetVim((char *) current_exception->value); |
| ! discard_current_exception(); |
| return 1; |
| } |
| + } |
| |
| + static int |
| + VimCheckInterrupt(void) |
| + { |
| + if (got_int) |
| + { |
| + PyErr_SetNone(PyExc_KeyboardInterrupt); |
| + return 1; |
| + } |
| return 0; |
| } |
| |
| |
| *** 306,322 **** |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| |
| do_cmdline_cmd((char_u *)cmd); |
| update_screen(VALID); |
| |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| ! if (VimErrorCheck()) |
| result = NULL; |
| else |
| result = Py_None; |
| |
| Py_XINCREF(result); |
| return result; |
| } |
| --- 328,346 ---- |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| |
| + VimTryStart(); |
| do_cmdline_cmd((char_u *)cmd); |
| update_screen(VALID); |
| |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| ! if (VimTryEnd()) |
| result = NULL; |
| else |
| result = Py_None; |
| |
| + |
| Py_XINCREF(result); |
| return result; |
| } |
| |
| *** 449,459 **** |
| |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| our_tv = eval_expr((char_u *)expr, NULL); |
| - |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| if (our_tv == NULL) |
| { |
| PyErr_SetVim(_("invalid expression")); |
| --- 473,486 ---- |
| |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| + VimTryStart(); |
| our_tv = eval_expr((char_u *)expr, NULL); |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| + if (VimTryEnd()) |
| + return NULL; |
| + |
| if (our_tv == NULL) |
| { |
| PyErr_SetVim(_("invalid expression")); |
| |
| *** 490,500 **** |
| |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| our_tv = eval_expr((char_u *)expr, NULL); |
| - |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| if (our_tv == NULL) |
| { |
| PyErr_SetVim(_("invalid expression")); |
| --- 517,530 ---- |
| |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| + VimTryStart(); |
| our_tv = eval_expr((char_u *)expr, NULL); |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| + if (VimTryEnd()) |
| + return NULL; |
| + |
| if (our_tv == NULL) |
| { |
| PyErr_SetVim(_("invalid expression")); |
| |
| *** 1324,1335 **** |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| |
| error = func_call(name, &args, selfdict, &rettv); |
| |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| ! if (error != OK) |
| { |
| result = NULL; |
| PyErr_SetVim(_("failed to run function")); |
| --- 1354,1368 ---- |
| Py_BEGIN_ALLOW_THREADS |
| Python_Lock_Vim(); |
| |
| + VimTryStart(); |
| error = func_call(name, &args, selfdict, &rettv); |
| |
| Python_Release_Vim(); |
| Py_END_ALLOW_THREADS |
| |
| ! if (VimTryEnd()) |
| ! result = NULL; |
| ! else if (error != OK) |
| { |
| result = NULL; |
| PyErr_SetVim(_("failed to run function")); |
| |
| *** 1486,1499 **** |
| win_T *save_curwin; |
| tabpage_T *save_curtab; |
| buf_T *save_curbuf; |
| - int r = 0; |
| |
| switch (opt_type) |
| { |
| case SREQ_WIN: |
| if (switch_win(&save_curwin, &save_curtab, (win_T *)from, |
| win_find_tabpage((win_T *)from)) == FAIL) |
| { |
| PyErr_SetVim("Problem while switching windows."); |
| return -1; |
| } |
| --- 1519,1534 ---- |
| win_T *save_curwin; |
| tabpage_T *save_curtab; |
| buf_T *save_curbuf; |
| |
| + VimTryStart(); |
| switch (opt_type) |
| { |
| case SREQ_WIN: |
| if (switch_win(&save_curwin, &save_curtab, (win_T *)from, |
| win_find_tabpage((win_T *)from)) == FAIL) |
| { |
| + if (VimTryEnd()) |
| + return -1; |
| PyErr_SetVim("Problem while switching windows."); |
| return -1; |
| } |
| |
| *** 1509,1515 **** |
| set_option_value(key, numval, stringval, opt_flags); |
| break; |
| } |
| ! return r; |
| } |
| |
| static int |
| --- 1544,1550 ---- |
| set_option_value(key, numval, stringval, opt_flags); |
| break; |
| } |
| ! return VimTryEnd(); |
| } |
| |
| static int |
| |
| *** 1961,1967 **** |
| } |
| |
| /* Check for keyboard interrupts */ |
| ! if (VimErrorCheck()) |
| return -1; |
| |
| self->win->w_cursor.lnum = lnum; |
| --- 1996,2002 ---- |
| } |
| |
| /* Check for keyboard interrupts */ |
| ! if (VimCheckInterrupt()) |
| return -1; |
| |
| self->win->w_cursor.lnum = lnum; |
| |
| *** 1988,1998 **** |
| #endif |
| savewin = curwin; |
| curwin = self->win; |
| win_setheight(height); |
| curwin = savewin; |
| ! |
| ! /* Check for keyboard interrupts */ |
| ! if (VimErrorCheck()) |
| return -1; |
| |
| return 0; |
| --- 2023,2033 ---- |
| #endif |
| savewin = curwin; |
| curwin = self->win; |
| + |
| + VimTryStart(); |
| win_setheight(height); |
| curwin = savewin; |
| ! if (VimTryEnd()) |
| return -1; |
| |
| return 0; |
| |
| *** 2011,2021 **** |
| #endif |
| savewin = curwin; |
| curwin = self->win; |
| win_setwidth(width); |
| curwin = savewin; |
| ! |
| ! /* Check for keyboard interrupts */ |
| ! if (VimErrorCheck()) |
| return -1; |
| |
| return 0; |
| --- 2046,2056 ---- |
| #endif |
| savewin = curwin; |
| curwin = self->win; |
| + |
| + VimTryStart(); |
| win_setwidth(width); |
| curwin = savewin; |
| ! if (VimTryEnd()) |
| return -1; |
| |
| return 0; |
| |
| *** 2304,2309 **** |
| --- 2339,2346 ---- |
| PyErr_Clear(); |
| switch_buffer(&savebuf, buf); |
| |
| + VimTryStart(); |
| + |
| if (u_savedel((linenr_T)n, 1L) == FAIL) |
| PyErr_SetVim(_("cannot save undo information")); |
| else if (ml_delete((linenr_T)n, FALSE) == FAIL) |
| |
| *** 2317,2323 **** |
| |
| restore_buffer(savebuf); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2354,2360 ---- |
| |
| restore_buffer(savebuf); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2333,2338 **** |
| --- 2370,2377 ---- |
| if (save == NULL) |
| return FAIL; |
| |
| + VimTryStart(); |
| + |
| /* We do not need to free "save" if ml_replace() consumes it. */ |
| PyErr_Clear(); |
| switch_buffer(&savebuf, buf); |
| |
| *** 2356,2362 **** |
| if (buf == savebuf) |
| check_cursor_col(); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2395,2401 ---- |
| if (buf == savebuf) |
| check_cursor_col(); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2395,2400 **** |
| --- 2434,2440 ---- |
| buf_T *savebuf; |
| |
| PyErr_Clear(); |
| + VimTryStart(); |
| switch_buffer(&savebuf, buf); |
| |
| if (u_savedel((linenr_T)lo, (long)n) == FAIL) |
| |
| *** 2416,2422 **** |
| |
| restore_buffer(savebuf); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2456,2462 ---- |
| |
| restore_buffer(savebuf); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2459,2464 **** |
| --- 2499,2505 ---- |
| } |
| } |
| |
| + VimTryStart(); |
| PyErr_Clear(); |
| |
| // START of region without "return". Must call restore_buffer()! |
| |
| *** 2545,2551 **** |
| // END of region without "return". |
| restore_buffer(savebuf); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2586,2592 ---- |
| // END of region without "return". |
| restore_buffer(savebuf); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2583,2588 **** |
| --- 2624,2630 ---- |
| return FAIL; |
| |
| PyErr_Clear(); |
| + VimTryStart(); |
| switch_buffer(&savebuf, buf); |
| |
| if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL) |
| |
| *** 2596,2602 **** |
| restore_buffer(savebuf); |
| update_screen(VALID); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2638,2644 ---- |
| restore_buffer(savebuf); |
| update_screen(VALID); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2633,2638 **** |
| --- 2675,2681 ---- |
| } |
| |
| PyErr_Clear(); |
| + VimTryStart(); |
| switch_buffer(&savebuf, buf); |
| |
| if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL) |
| |
| *** 2666,2672 **** |
| restore_buffer(savebuf); |
| update_screen(VALID); |
| |
| ! if (PyErr_Occurred() || VimErrorCheck()) |
| return FAIL; |
| |
| if (len_change) |
| --- 2709,2715 ---- |
| restore_buffer(savebuf); |
| update_screen(VALID); |
| |
| ! if (VimTryEnd()) |
| return FAIL; |
| |
| if (len_change) |
| |
| *** 2896,2902 **** |
| static void |
| RangeDestructor(RangeObject *self) |
| { |
| ! Py_DECREF(self->buf); |
| DESTRUCTOR_FINISH(self); |
| } |
| |
| --- 2939,2945 ---- |
| static void |
| RangeDestructor(RangeObject *self) |
| { |
| ! Py_XDECREF(self->buf); |
| DESTRUCTOR_FINISH(self); |
| } |
| |
| |
| *** 3078,3086 **** |
| --- 3121,3132 ---- |
| return NULL; |
| mark = *pmark; |
| |
| + VimTryStart(); |
| switch_buffer(&savebuf, self->buf); |
| posp = getmark(mark, FALSE); |
| restore_buffer(savebuf); |
| + if (VimTryEnd()) |
| + return NULL; |
| |
| if (posp == NULL) |
| { |
| |
| *** 3088,3097 **** |
| return NULL; |
| } |
| |
| - /* Check for keyboard interrupt */ |
| - if (VimErrorCheck()) |
| - return NULL; |
| - |
| if (posp->lnum <= 0) |
| { |
| /* Or raise an error? */ |
| --- 3134,3139 ---- |
| |
| *** 3330,3342 **** |
| return -1; |
| count = ((BufferObject *)(value))->buf->b_fnum; |
| |
| if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL) |
| { |
| PyErr_SetVim(_("failed to switch to given buffer")); |
| return -1; |
| } |
| |
| ! return 0; |
| } |
| else if (strcmp(name, "window") == 0) |
| { |
| --- 3372,3387 ---- |
| return -1; |
| count = ((BufferObject *)(value))->buf->b_fnum; |
| |
| + VimTryStart(); |
| if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL) |
| { |
| + if (VimTryEnd()) |
| + return -1; |
| PyErr_SetVim(_("failed to switch to given buffer")); |
| return -1; |
| } |
| |
| ! return VimTryEnd(); |
| } |
| else if (strcmp(name, "window") == 0) |
| { |
| |
| *** 3359,3373 **** |
| return -1; |
| } |
| |
| win_goto(((WindowObject *)(value))->win); |
| if (((WindowObject *)(value))->win != curwin) |
| { |
| PyErr_SetString(PyExc_RuntimeError, |
| _("did not switch to the specified window")); |
| return -1; |
| } |
| |
| ! return 0; |
| } |
| else if (strcmp(name, "tabpage") == 0) |
| { |
| --- 3404,3421 ---- |
| return -1; |
| } |
| |
| + VimTryStart(); |
| win_goto(((WindowObject *)(value))->win); |
| if (((WindowObject *)(value))->win != curwin) |
| { |
| + if (VimTryEnd()) |
| + return -1; |
| PyErr_SetString(PyExc_RuntimeError, |
| _("did not switch to the specified window")); |
| return -1; |
| } |
| |
| ! return VimTryEnd(); |
| } |
| else if (strcmp(name, "tabpage") == 0) |
| { |
| |
| *** 3380,3394 **** |
| if (CheckTabPage((TabPageObject *)(value))) |
| return -1; |
| |
| goto_tabpage_tp(((TabPageObject *)(value))->tab, TRUE, TRUE); |
| if (((TabPageObject *)(value))->tab != curtab) |
| { |
| PyErr_SetString(PyExc_RuntimeError, |
| _("did not switch to the specified tab page")); |
| return -1; |
| } |
| |
| ! return 0; |
| } |
| else |
| { |
| --- 3428,3445 ---- |
| if (CheckTabPage((TabPageObject *)(value))) |
| return -1; |
| |
| + VimTryStart(); |
| goto_tabpage_tp(((TabPageObject *)(value))->tab, TRUE, TRUE); |
| if (((TabPageObject *)(value))->tab != curtab) |
| { |
| + if (VimTryEnd()) |
| + return -1; |
| PyErr_SetString(PyExc_RuntimeError, |
| _("did not switch to the specified tab page")); |
| return -1; |
| } |
| |
| ! return VimTryEnd(); |
| } |
| else |
| { |
| |
| |
| |
| *** 380,399 **** |
| try: |
| exec(s, g, l) |
| except: |
| ! vim.command('throw ' + repr(sys.exc_type.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| except: |
| ! vim.command('throw ' + repr(sys.exc_type.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| : python e(vim.eval('a:s')) |
| :endfunction |
| :function Ev(s) |
| ! : return pyeval('ev(vim.eval("a:s"))') |
| :endfunction |
| :py gopts1=vim.options |
| :py wopts1=vim.windows[2].options |
| --- 380,403 ---- |
| try: |
| exec(s, g, l) |
| except: |
| ! vim.command('return ' + repr(sys.exc_type.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| except: |
| ! vim.command('let exc=' + repr(sys.exc_type.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| : python e(vim.eval('a:s')) |
| :endfunction |
| :function Ev(s) |
| ! : let r=pyeval('ev(vim.eval("a:s"))') |
| ! : if exists('exc') |
| ! : throw exc |
| ! : endif |
| ! : return r |
| :endfunction |
| :py gopts1=vim.options |
| :py wopts1=vim.windows[2].options |
| |
| *** 437,463 **** |
| : catch |
| : put =' p/'.v.'! '.v:exception |
| : endtry |
| ! : try |
| ! : call E(v.'["'.oname.'"]=invval') |
| ! : catch |
| ! : put =' inv: '.string(invval).'! '.v:exception |
| ! : endtry |
| : for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3']) |
| : let val=substitute(vv, '^.opts', 'oval', '') |
| ! : try |
| ! : call E(vv.'["'.oname.'"]='.val) |
| ! : catch |
| ! : put =' '.vv.'! '.v:exception |
| ! : endtry |
| : endfor |
| : endfor |
| : call RecVars(oname) |
| : for v in ['wopts3', 'bopts3'] |
| ! : try |
| ! : call E('del '.v.'["'.oname.'"]') |
| ! : catch |
| ! : put =' del '.v.'! '.v:exception |
| ! : endtry |
| : endfor |
| : call RecVars(oname) |
| :endfor |
| --- 441,464 ---- |
| : catch |
| : put =' p/'.v.'! '.v:exception |
| : endtry |
| ! : let r=E(v.'['''.oname.''']=invval') |
| ! : if r isnot 0 |
| ! : put =' inv: '.string(invval).'! '.r |
| ! : endif |
| : for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3']) |
| : let val=substitute(vv, '^.opts', 'oval', '') |
| ! : let r=E(vv.'['''.oname.''']='.val) |
| ! : if r isnot 0 |
| ! : put =' '.vv.'! '.r |
| ! : endif |
| : endfor |
| : endfor |
| : call RecVars(oname) |
| : for v in ['wopts3', 'bopts3'] |
| ! : let r=E('del '.v.'["'.oname.'"]') |
| ! : if r isnot 0 |
| ! : put =' del '.v.'! '.r |
| ! : endif |
| : endfor |
| : call RecVars(oname) |
| :endfor |
| |
| *** 651,656 **** |
| --- 652,676 ---- |
| ): |
| cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr))) |
| EOF |
| + :" |
| + :" Test exceptions |
| + :fun Exe(e) |
| + : execute a:e |
| + :endfun |
| + py << EOF |
| + def ee(expr, g=globals(), l=locals()): |
| + try: |
| + exec(expr, g, l) |
| + except: |
| + cb.append(repr(sys.exc_info()[:2])) |
| + Exe = vim.bindeval('function("Exe")') |
| + ee('vim.command("throw \'abc\'")') |
| + ee('Exe("throw \'def\'")') |
| + ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")') |
| + ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")') |
| + ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")') |
| + ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")') |
| + EOF |
| :endfun |
| :" |
| :call Test() |
| |
| |
| |
| *** 333,339 **** |
| Current tab pages: |
| <tabpage 0>(1): 1 windows, current is <window object (unknown)> |
| Windows: |
| ! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (970, 0) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| --- 333,339 ---- |
| Current tab pages: |
| <tabpage 0>(1): 1 windows, current is <window object (unknown)> |
| Windows: |
| ! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (990, 0) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| |
| *** 368,370 **** |
| --- 368,376 ---- |
| vim.current.range:Range:True |
| vim.current.window:Window:True |
| vim.current.tabpage:TabPage:True |
| + (<class 'vim.error'>, error('abc',)) |
| + (<class 'vim.error'>, error('def',)) |
| + (<class 'vim.error'>, error('ghi',)) |
| + (<class 'vim.error'>, error('Vim(echoerr):jkl',)) |
| + (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) |
| + (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) |
| |
| |
| |
| *** 367,386 **** |
| try: |
| exec(s, g, l) |
| except Exception as e: |
| ! vim.command('throw ' + repr(e.__class__.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| except Exception as e: |
| ! vim.command('throw ' + repr(e.__class__.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| : python3 e(vim.eval('a:s')) |
| :endfunction |
| :function Ev(s) |
| ! : return py3eval('ev(vim.eval("a:s"))') |
| :endfunction |
| :py3 gopts1=vim.options |
| :py3 wopts1=vim.windows[2].options |
| --- 367,390 ---- |
| try: |
| exec(s, g, l) |
| except Exception as e: |
| ! vim.command('return ' + repr(e.__class__.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| except Exception as e: |
| ! vim.command('let exc=' + repr(e.__class__.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| : python3 e(vim.eval('a:s')) |
| :endfunction |
| :function Ev(s) |
| ! : let r=py3eval('ev(vim.eval("a:s"))') |
| ! : if exists('exc') |
| ! : throw exc |
| ! : endif |
| ! : return r |
| :endfunction |
| :py3 gopts1=vim.options |
| :py3 wopts1=vim.windows[2].options |
| |
| *** 424,450 **** |
| : catch |
| : put =' p/'.v.'! '.v:exception |
| : endtry |
| ! : try |
| ! : call E(v.'["'.oname.'"]=invval') |
| ! : catch |
| ! : put =' inv: '.string(invval).'! '.v:exception |
| ! : endtry |
| : for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3']) |
| : let val=substitute(vv, '^.opts', 'oval', '') |
| ! : try |
| ! : call E(vv.'["'.oname.'"]='.val) |
| ! : catch |
| ! : put =' '.vv.'! '.v:exception |
| ! : endtry |
| : endfor |
| : endfor |
| : call RecVars(oname) |
| : for v in ['wopts3', 'bopts3'] |
| ! : try |
| ! : call E('del '.v.'["'.oname.'"]') |
| ! : catch |
| ! : put =' del '.v.'! '.v:exception |
| ! : endtry |
| : endfor |
| : call RecVars(oname) |
| :endfor |
| --- 428,451 ---- |
| : catch |
| : put =' p/'.v.'! '.v:exception |
| : endtry |
| ! : let r=E(v.'['''.oname.''']=invval') |
| ! : if r isnot 0 |
| ! : put =' inv: '.string(invval).'! '.r |
| ! : endif |
| : for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3']) |
| : let val=substitute(vv, '^.opts', 'oval', '') |
| ! : let r=E(vv.'['''.oname.''']='.val) |
| ! : if r isnot 0 |
| ! : put =' '.vv.'! '.r |
| ! : endif |
| : endfor |
| : endfor |
| : call RecVars(oname) |
| : for v in ['wopts3', 'bopts3'] |
| ! : let r=E('del '.v.'["'.oname.'"]') |
| ! : if r isnot 0 |
| ! : put =' del '.v.'! '.r |
| ! : endif |
| : endfor |
| : call RecVars(oname) |
| :endfor |
| |
| *** 638,643 **** |
| --- 639,663 ---- |
| ): |
| cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr))) |
| EOF |
| + :" |
| + :" Test exceptions |
| + :fun Exe(e) |
| + : execute a:e |
| + :endfun |
| + py3 << EOF |
| + def ee(expr, g=globals(), l=locals()): |
| + try: |
| + exec(expr, g, l) |
| + except Exception as e: |
| + cb.append(repr((e.__class__, e))) |
| + Exe = vim.bindeval('function("Exe")') |
| + ee('vim.command("throw \'abc\'")') |
| + ee('Exe("throw \'def\'")') |
| + ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")') |
| + ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")') |
| + ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")') |
| + ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")') |
| + EOF |
| :endfun |
| :" |
| :call Test() |
| |
| |
| |
| *** 322,328 **** |
| Current tab pages: |
| <tabpage 0>(1): 1 windows, current is <window object (unknown)> |
| Windows: |
| ! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (946, 0) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| --- 322,328 ---- |
| Current tab pages: |
| <tabpage 0>(1): 1 windows, current is <window object (unknown)> |
| Windows: |
| ! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (966, 0) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| |
| *** 357,359 **** |
| --- 357,365 ---- |
| vim.current.range:Range:True |
| vim.current.window:Window:True |
| vim.current.tabpage:TabPage:True |
| + (<class 'vim.error'>, error('abc',)) |
| + (<class 'vim.error'>, error('def',)) |
| + (<class 'vim.error'>, error('ghi',)) |
| + (<class 'vim.error'>, error('Vim(echoerr):jkl',)) |
| + (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) |
| + (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 997, |
| /**/ |
| |
| -- |
| ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. |
| King of all Britons, defeator of the Saxons, sovereign of all England! |
| [Pause] |
| SOLDIER: Get away! |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |