0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.0755: Vim9: No error when variable initializer is not a constant

Problem:    Vim9: No error when variable initializer is not a constant.
Solution:   Return FAIL when trying to get a variable value.  Do not execute a
            script when an error is deteted in the first or second phase.
This commit is contained in:
Bram Moolenaar
2020-05-15 18:17:28 +02:00
parent a5d0077efb
commit 227a69de1e
4 changed files with 47 additions and 11 deletions

View File

@@ -2695,6 +2695,8 @@ eval7(
{ {
if (**arg == '(') // recursive! if (**arg == '(') // recursive!
ret = eval_func(arg, s, len, rettv, flags, NULL); ret = eval_func(arg, s, len, rettv, flags, NULL);
else if (flags & EVAL_CONSTANT)
ret = FAIL;
else if (evaluate) else if (evaluate)
ret = get_var_tv(s, len, rettv, NULL, TRUE, FALSE); ret = get_var_tv(s, len, rettv, NULL, TRUE, FALSE);
else else

View File

@@ -494,8 +494,8 @@ let s:export_script_lines =<< trim END
def Concat(arg: string): string def Concat(arg: string): string
return name .. arg return name .. arg
enddef enddef
let g:result: string = Concat('bie') g:result = Concat('bie')
let g:localname = name g:localname = name
export const CONST = 1234 export const CONST = 1234
export let exported = 9876 export let exported = 9876
@@ -1747,10 +1747,34 @@ def Test_let_missing_type()
endfunc endfunc
let val = GetValue() let val = GetValue()
END END
writefile(lines, 'Xfinished') CheckScriptFailure(lines, 'E1091:')
assert_fails('source Xfinished', 'E1091:')
delete('Xfinished') lines =<< trim END
vim9script
let var = g:unkown
END
CheckScriptFailure(lines, 'E1091:')
" TODO: eventually this would work
lines =<< trim END
vim9script
let var = has('eval')
END
CheckScriptFailure(lines, 'E1091:')
" TODO: eventually this would work
lines =<< trim END
vim9script
let var = len('string')
END
CheckScriptFailure(lines, 'E1091:')
lines =<< trim END
vim9script
let nr: number = 123
let var = nr
END
CheckScriptFailure(lines, 'E1091:')
enddef enddef
def Test_forward_declaration() def Test_forward_declaration()

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
755,
/**/ /**/
754, 754,
/**/ /**/

View File

@@ -37,6 +37,7 @@ ex_vim9script(exarg_T *eap)
garray_T func_ga; garray_T func_ga;
int idx; int idx;
ufunc_T *ufunc; ufunc_T *ufunc;
int start_called_emsg = called_emsg;
if (!getline_equal(eap->getline, eap->cookie, getsourceline)) if (!getline_equal(eap->getline, eap->cookie, getsourceline))
{ {
@@ -66,7 +67,7 @@ ex_vim9script(exarg_T *eap)
// The types are recognized, so that they can be used when compiling a // The types are recognized, so that they can be used when compiling a
// function. // function.
gap = source_get_line_ga(eap->cookie); gap = source_get_line_ga(eap->cookie);
for (;;) while (called_emsg == start_called_emsg)
{ {
char_u *line; char_u *line;
char_u *p; char_u *p;
@@ -132,22 +133,29 @@ ex_vim9script(exarg_T *eap)
} }
else if (checkforcmd(&p, "finish", 4)) else if (checkforcmd(&p, "finish", 4))
{ {
// TODO: this should not happen below "if false".
// Use "if cond | finish | endif as a workaround.
break; break;
} }
} }
// Compile the :def functions. // Compile the :def functions.
for (idx = 0; idx < func_ga.ga_len; ++idx) for (idx = 0; idx < func_ga.ga_len && called_emsg == start_called_emsg; ++idx)
{ {
ufunc = ((ufunc_T **)(func_ga.ga_data))[idx]; ufunc = ((ufunc_T **)(func_ga.ga_data))[idx];
compile_def_function(ufunc, FALSE, NULL); compile_def_function(ufunc, FALSE, NULL);
} }
ga_clear(&func_ga); ga_clear(&func_ga);
// Return to process the commands at the script level. if (called_emsg == start_called_emsg)
source_use_line_ga(eap->cookie); {
// Return to process the commands at the script level.
source_use_line_ga(eap->cookie);
}
else
{
// If there was an error in the first or second phase then don't
// execute the script lines.
do_finish(eap, FALSE);
}
} }
/* /*