To: vim_dev@googlegroups.com Subject: Patch 8.2.1233 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1233 Problem: Vim9: various errors not caught by try/catch. Solution: Do not bail out if an error is inside try/catch. Files: src/vim9execute.c, src/testdir/test_vim9_script.vim *** ../vim-8.2.1232/src/vim9execute.c 2020-07-17 22:06:40.767784141 +0200 --- src/vim9execute.c 2020-07-17 22:53:41.204869700 +0200 *************** *** 1065,1073 **** if (di == NULL) { semsg(_(e_undefvar), name); ! if (trylevel > 0) ! continue; ! goto failed; } else { --- 1065,1071 ---- if (di == NULL) { semsg(_(e_undefvar), name); ! goto on_error; } else { *************** *** 1115,1121 **** { semsg(_("E121: Undefined variable: %c:%s"), namespace, iptr->isn_arg.string); ! goto failed; } else { --- 1113,1119 ---- { semsg(_("E121: Undefined variable: %c:%s"), namespace, iptr->isn_arg.string); ! goto on_error; } else { *************** *** 2088,2096 **** case EXPR_SUB: f1 = f1 - f2; break; case EXPR_ADD: f1 = f1 + f2; break; default: emsg(_(e_modulus)); ! if (trylevel > 0) ! continue; ! goto failed; } clear_tv(tv1); clear_tv(tv2); --- 2086,2092 ---- case EXPR_SUB: f1 = f1 - f2; break; case EXPR_ADD: f1 = f1 + f2; break; default: emsg(_(e_modulus)); ! goto on_error; } clear_tv(tv1); clear_tv(tv2); *************** *** 2144,2152 **** if (tv->v_type != VAR_LIST) { emsg(_(e_listreq)); ! if (trylevel > 0) ! continue; ! goto failed; } list = tv->vval.v_list; --- 2140,2146 ---- if (tv->v_type != VAR_LIST) { emsg(_(e_listreq)); ! goto on_error; } list = tv->vval.v_list; *************** *** 2154,2171 **** if (tv->v_type != VAR_NUMBER) { emsg(_(e_number_exp)); ! if (trylevel > 0) ! continue; ! goto failed; } n = tv->vval.v_number; clear_tv(tv); if ((li = list_find(list, n)) == NULL) { semsg(_(e_listidx), n); ! if (trylevel > 0) ! continue; ! goto failed; } --ectx.ec_stack.ga_len; // Clear the list after getting the item, to avoid that it --- 2148,2161 ---- if (tv->v_type != VAR_NUMBER) { emsg(_(e_number_exp)); ! goto on_error; } n = tv->vval.v_number; clear_tv(tv); if ((li = list_find(list, n)) == NULL) { semsg(_(e_listidx), n); ! goto on_error; } --ectx.ec_stack.ga_len; // Clear the list after getting the item, to avoid that it *************** *** 2238,2246 **** if ((di = dict_find(dict, key, -1)) == NULL) { semsg(_(e_dictkey), key); ! if (trylevel > 0) ! continue; ! goto failed; } clear_tv(tv); --ectx.ec_stack.ga_len; --- 2228,2234 ---- if ((di = dict_find(dict, key, -1)) == NULL) { semsg(_(e_dictkey), key); ! goto on_error; } clear_tv(tv); --ectx.ec_stack.ga_len; *************** *** 2291,2297 **** ) { emsg(_(e_number_exp)); ! goto failed; } #ifdef FEAT_FLOAT if (tv->v_type == VAR_FLOAT) --- 2279,2285 ---- ) { emsg(_(e_number_exp)); ! goto on_error; } #ifdef FEAT_FLOAT if (tv->v_type == VAR_FLOAT) *************** *** 2307,2316 **** tv = STACK_TV_BOT(-1); if (check_not_string(tv) == FAIL) ! goto failed; (void)tv_get_number_chk(tv, &error); if (error) ! goto failed; } break; --- 2295,2304 ---- tv = STACK_TV_BOT(-1); if (check_not_string(tv) == FAIL) ! goto on_error; (void)tv_get_number_chk(tv, &error); if (error) ! goto on_error; } break; *************** *** 2329,2335 **** semsg(_("E1029: Expected %s but got %s"), vartype_name(ct->ct_type), vartype_name(tv->v_type)); ! goto failed; } } break; --- 2317,2323 ---- semsg(_("E1029: Expected %s but got %s"), vartype_name(ct->ct_type), vartype_name(tv->v_type)); ! goto on_error; } } break; *************** *** 2348,2354 **** { semsg(_("E1093: Expected %d items but got %d"), min_len, list == NULL ? 0 : list->lv_len); ! goto failed; } } break; --- 2336,2342 ---- { semsg(_("E1093: Expected %d items but got %d"), min_len, list == NULL ? 0 : list->lv_len); ! goto on_error; } } break; *************** *** 2403,2408 **** --- 2391,2401 ---- clear_tv(STACK_TV_BOT(0)); break; } + continue; + + on_error: + if (trylevel == 0) + goto failed; } done: *** ../vim-8.2.1232/src/testdir/test_vim9_script.vim 2020-07-17 22:06:40.767784141 +0200 --- src/testdir/test_vim9_script.vim 2020-07-17 23:02:18.355768282 +0200 *************** *** 17,22 **** --- 17,23 ---- let $SOME_ENV_VAR = 'some' let g:alist = [7] let g:astring = 'text' + let g:anumber = 123 def Test_assignment() let bool1: bool = true *************** *** 535,540 **** --- 536,548 ---- try n = s:does_not_exist catch /E121:/ + n = 111 + endtry + assert_equal(111, n) + + try + n = g:does_not_exist + catch /E121:/ n = 121 endtry assert_equal(121, n) *************** *** 546,551 **** --- 554,603 ---- n = 222 endtry assert_equal(222, n) + + try + n = -g:astring + catch /E39:/ + n = 233 + endtry + assert_equal(233, n) + + try + n = +g:astring + catch /E1030:/ + n = 244 + endtry + assert_equal(244, n) + + try + n = +g:alist + catch /E745:/ + n = 255 + endtry + assert_equal(255, n) + + let nd: dict + try + nd = {g:anumber: 1} + catch /E1029:/ + n = 266 + endtry + assert_equal(266, n) + + try + [n] = [1, 2, 3] + catch /E1093:/ + n = 277 + endtry + assert_equal(277, n) + + # TODO: make this work + # try + # &ts = g:astring + # catch /E1093:/ + # n = 288 + # endtry + # assert_equal(288, n) enddef def ThrowFromDef() *** ../vim-8.2.1232/src/version.c 2020-07-17 22:26:49.768820207 +0200 --- src/version.c 2020-07-17 22:37:42.783199326 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1233, /**/ -- Have you heard about the new Beowulf cluster? It's so fast, it executes an infinite loop in 6 seconds. /// 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 ///