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:
@@ -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
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user