To: vim_dev@googlegroups.com Subject: Patch 8.2.0493 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0493 Problem: Vim9: some error messages not tested. Solution: Add more tests. Fix uncovered bugs. Files: src/vim9compile.c, src/vim9execute.c, src/testing.c, src/eval.c, src/proto/testing.pro, src/evalfunc.c, runtime/doc/eval.txt, runtime/doc/testing.txt, src/testdir/test_vim9_script.vim *** ../vim-8.2.0492/src/vim9compile.c 2020-04-01 21:17:17.268409971 +0200 --- src/vim9compile.c 2020-04-01 21:56:05.895613546 +0200 *************** *** 766,772 **** /* * Generate an ISN_PUSHPARTIAL instruction with partial "part". ! * Consumes "name". */ static int generate_PUSHPARTIAL(cctx_T *cctx, partial_T *part) --- 766,772 ---- /* * Generate an ISN_PUSHPARTIAL instruction with partial "part". ! * Consumes "part". */ static int generate_PUSHPARTIAL(cctx_T *cctx, partial_T *part) *************** *** 3808,3816 **** case VAR_BOOL: generate_PUSHBOOL(cctx, VVAL_FALSE); break; - case VAR_SPECIAL: - generate_PUSHSPEC(cctx, VVAL_NONE); - break; case VAR_FLOAT: #ifdef FEAT_FLOAT generate_PUSHF(cctx, 0.0); --- 3808,3813 ---- *************** *** 3843,3848 **** --- 3840,3846 ---- case VAR_NUMBER: case VAR_UNKNOWN: case VAR_VOID: + case VAR_SPECIAL: // cannot happen generate_PUSHNR(cctx, 0); break; } *** ../vim-8.2.0492/src/vim9execute.c 2020-04-01 21:17:17.268409971 +0200 --- src/vim9execute.c 2020-04-01 21:47:21.909589372 +0200 *************** *** 920,926 **** break; default: tv->v_type = VAR_STRING; ! tv->vval.v_string = vim_strsave(iptr->isn_arg.string); } break; --- 920,928 ---- break; default: tv->v_type = VAR_STRING; ! tv->vval.v_string = vim_strsave( ! iptr->isn_arg.string == NULL ! ? (char_u *)"" : iptr->isn_arg.string); } break; *** ../vim-8.2.0492/src/testing.c 2020-02-22 19:07:24.393786830 +0100 --- src/testing.c 2020-04-01 21:50:55.828781604 +0200 *************** *** 883,888 **** --- 883,895 ---- } void + f_test_null_function(typval_T *argvars UNUSED, typval_T *rettv) + { + rettv->v_type = VAR_FUNC; + rettv->vval.v_string = NULL; + } + + void f_test_null_partial(typval_T *argvars UNUSED, typval_T *rettv) { rettv->v_type = VAR_PARTIAL; *** ../vim-8.2.0492/src/eval.c 2020-03-23 22:12:15.496961030 +0100 --- src/eval.c 2020-04-01 22:01:22.034424432 +0200 *************** *** 3849,3856 **** return tv1->vval.v_channel == tv2->vval.v_channel; #endif - case VAR_FUNC: case VAR_PARTIAL: case VAR_UNKNOWN: case VAR_VOID: break; --- 3849,3860 ---- return tv1->vval.v_channel == tv2->vval.v_channel; #endif case VAR_PARTIAL: + return tv1->vval.v_partial == tv2->vval.v_partial; + + case VAR_FUNC: + return tv1->vval.v_string == tv2->vval.v_string; + case VAR_UNKNOWN: case VAR_VOID: break; *** ../vim-8.2.0492/src/proto/testing.pro 2020-02-22 19:07:24.393786830 +0100 --- src/proto/testing.pro 2020-04-01 21:54:50.947895699 +0200 *************** *** 26,31 **** --- 26,32 ---- void f_test_null_dict(typval_T *argvars, typval_T *rettv); void f_test_null_job(typval_T *argvars, typval_T *rettv); void f_test_null_list(typval_T *argvars, typval_T *rettv); + void f_test_null_function(typval_T *argvars, typval_T *rettv); void f_test_null_partial(typval_T *argvars, typval_T *rettv); void f_test_null_string(typval_T *argvars, typval_T *rettv); void f_test_unknown(typval_T *argvars, typval_T *rettv); *** ../vim-8.2.0492/src/evalfunc.c 2020-03-27 20:52:41.350231375 +0100 --- src/evalfunc.c 2020-04-01 21:57:21.383329567 +0200 *************** *** 290,296 **** { return &t_string; } ! static type_T * ret_list_any(int argcount UNUSED, type_T **argtypes UNUSED) { return &t_list_any; } --- 290,297 ---- { return &t_string; } ! static type_T * ! ret_list_any(int argcount UNUSED, type_T **argtypes UNUSED) { return &t_list_any; } *************** *** 330,338 **** return &t_blob; } static type_T * ! ret_partial_void(int argcount UNUSED, type_T **argtypes UNUSED) { ! return &t_partial_void; } static type_T * ret_channel(int argcount UNUSED, type_T **argtypes UNUSED) --- 331,344 ---- return &t_blob; } static type_T * ! ret_func_any(int argcount UNUSED, type_T **argtypes UNUSED) ! { ! return &t_func_any; ! } ! static type_T * ! ret_partial_any(int argcount UNUSED, type_T **argtypes UNUSED) { ! return &t_partial_any; } static type_T * ret_channel(int argcount UNUSED, type_T **argtypes UNUSED) *************** *** 558,564 **** {"foldtext", 0, 0, 0, ret_string, f_foldtext}, {"foldtextresult", 1, 1, FEARG_1, ret_string, f_foldtextresult}, {"foreground", 0, 0, 0, ret_void, f_foreground}, ! {"funcref", 1, 3, FEARG_1, ret_partial_void, f_funcref}, {"function", 1, 3, FEARG_1, ret_f_function, f_function}, {"garbagecollect", 0, 1, 0, ret_void, f_garbagecollect}, {"get", 2, 3, FEARG_1, ret_any, f_get}, --- 564,570 ---- {"foldtext", 0, 0, 0, ret_string, f_foldtext}, {"foldtextresult", 1, 1, FEARG_1, ret_string, f_foldtextresult}, {"foreground", 0, 0, 0, ret_void, f_foreground}, ! {"funcref", 1, 3, FEARG_1, ret_partial_any, f_funcref}, {"function", 1, 3, FEARG_1, ret_f_function, f_function}, {"garbagecollect", 0, 1, 0, ret_void, f_garbagecollect}, {"get", 2, 3, FEARG_1, ret_any, f_get}, *************** *** 952,960 **** {"test_null_blob", 0, 0, 0, ret_blob, f_test_null_blob}, {"test_null_channel", 0, 0, 0, ret_channel, JOB_FUNC(f_test_null_channel)}, {"test_null_dict", 0, 0, 0, ret_dict_any, f_test_null_dict}, {"test_null_job", 0, 0, 0, ret_job, JOB_FUNC(f_test_null_job)}, {"test_null_list", 0, 0, 0, ret_list_any, f_test_null_list}, ! {"test_null_partial", 0, 0, 0, ret_partial_void, f_test_null_partial}, {"test_null_string", 0, 0, 0, ret_string, f_test_null_string}, {"test_option_not_set", 1, 1, FEARG_1,ret_void, f_test_option_not_set}, {"test_override", 2, 2, FEARG_2, ret_void, f_test_override}, --- 958,967 ---- {"test_null_blob", 0, 0, 0, ret_blob, f_test_null_blob}, {"test_null_channel", 0, 0, 0, ret_channel, JOB_FUNC(f_test_null_channel)}, {"test_null_dict", 0, 0, 0, ret_dict_any, f_test_null_dict}, + {"test_null_function", 0, 0, 0, ret_func_any, f_test_null_function}, {"test_null_job", 0, 0, 0, ret_job, JOB_FUNC(f_test_null_job)}, {"test_null_list", 0, 0, 0, ret_list_any, f_test_null_list}, ! {"test_null_partial", 0, 0, 0, ret_partial_any, f_test_null_partial}, {"test_null_string", 0, 0, 0, ret_string, f_test_null_string}, {"test_option_not_set", 1, 1, FEARG_1,ret_void, f_test_option_not_set}, {"test_override", 2, 2, FEARG_2, ret_void, f_test_override}, *** ../vim-8.2.0492/runtime/doc/eval.txt 2020-04-01 19:22:06.522507242 +0200 --- runtime/doc/eval.txt 2020-04-01 22:02:14.490227201 +0200 *************** *** 2859,2864 **** --- 2861,2867 ---- test_null_blob() Blob null value for testing test_null_channel() Channel null value for testing test_null_dict() Dict null value for testing + test_null_function() Funcref null value for testing test_null_job() Job null value for testing test_null_list() List null value for testing test_null_partial() Funcref null value for testing *** ../vim-8.2.0492/runtime/doc/testing.txt 2020-02-22 19:07:24.397786814 +0100 --- runtime/doc/testing.txt 2020-04-01 22:03:10.558016422 +0200 *************** *** 106,111 **** --- 106,115 ---- Return a |Dict| that is null. Only useful for testing. + test_null_function() *test_null_function()* + Return a |FuncRef| that is null. Only useful for testing. + + test_null_job() *test_null_job()* Return a |Job| that is null. Only useful for testing. {only available when compiled with the +job feature} *** ../vim-8.2.0492/src/testdir/test_vim9_script.vim 2020-04-01 21:17:17.272409958 +0200 --- src/testdir/test_vim9_script.vim 2020-04-01 22:05:38.229461438 +0200 *************** *** 117,122 **** --- 117,164 ---- assert_equal('aregadd', @a) call CheckDefFailure(['@a += "more"'], 'E1013:') call CheckDefFailure(['@a += 123'], 'E1013:') + + v:errmsg = 'none' + v:errmsg ..= 'again' + assert_equal('noneagain', v:errmsg) + call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') + call CheckDefFailure(['v:errmsg += 123'], 'E1013:') + + " Test default values. + let thebool: bool + assert_equal(v:false, thebool) + + let thenumber: number + assert_equal(0, thenumber) + + if has('float') + let thefloat: float + assert_equal(0.0, thefloat) + endif + + let thestring: string + assert_equal('', thestring) + + let theblob: blob + assert_equal(0z, theblob) + + let thefunc: func + assert_equal(test_null_function(), thefunc) + + let thepartial: partial + assert_equal(test_null_partial(), thepartial) + + let thelist: list + assert_equal([], thelist) + + let thedict: dict + assert_equal({}, thedict) + + let thejob: job + assert_equal(test_null_job(), thejob) + + let thechannel: channel + assert_equal(test_null_channel(), thechannel) enddef func Test_assignment_failure() *************** *** 129,134 **** --- 171,177 ---- call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') + call CheckDefFailure(['let somevar'], "E1022:") call CheckDefFailure(['let &option'], 'E1052:') call CheckDefFailure(['&g:option = 5'], 'E113:') *** ../vim-8.2.0492/src/version.c 2020-04-01 21:17:17.272409958 +0200 --- src/version.c 2020-04-01 22:05:57.541388868 +0200 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 493, /**/ -- An indication you must be a manager: You can explain to somebody the difference between "re-engineering", "down-sizing", "right-sizing", and "firing people's asses". /// 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 ///