mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1287: Vim9: crash when using an imported function
Problem: Vim9: crash when using an imported function. Solution: Add the function type to the imported entry. (closes #6522)
This commit is contained in:
@@ -912,6 +912,12 @@ def Test_vim9_import_export()
|
|||||||
g:imported_added = exported
|
g:imported_added = exported
|
||||||
g:imported_func = Exported()
|
g:imported_func = Exported()
|
||||||
|
|
||||||
|
def GetExported(): string
|
||||||
|
let local_dict = #{ref: Exported}
|
||||||
|
return local_dict.ref()
|
||||||
|
enddef
|
||||||
|
g:funcref_result = GetExported()
|
||||||
|
|
||||||
import {exp_name} from './Xexport.vim'
|
import {exp_name} from './Xexport.vim'
|
||||||
g:imported_name = exp_name
|
g:imported_name = exp_name
|
||||||
exp_name ..= ' Doe'
|
exp_name ..= ' Doe'
|
||||||
@@ -930,6 +936,7 @@ def Test_vim9_import_export()
|
|||||||
assert_equal(9879, g:imported_added)
|
assert_equal(9879, g:imported_added)
|
||||||
assert_equal(9879, g:imported_later)
|
assert_equal(9879, g:imported_later)
|
||||||
assert_equal('Exported', g:imported_func)
|
assert_equal('Exported', g:imported_func)
|
||||||
|
assert_equal('Exported', g:funcref_result)
|
||||||
assert_equal('John', g:imported_name)
|
assert_equal('John', g:imported_name)
|
||||||
assert_equal('John Doe', g:imported_name_appended)
|
assert_equal('John Doe', g:imported_name_appended)
|
||||||
assert_false(exists('g:name'))
|
assert_false(exists('g:name'))
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1287,
|
||||||
/**/
|
/**/
|
||||||
1286,
|
1286,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -714,7 +714,7 @@ generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type)
|
|||||||
|
|
||||||
if (ga_grow(stack, 1) == FAIL)
|
if (ga_grow(stack, 1) == FAIL)
|
||||||
return NULL;
|
return NULL;
|
||||||
((type_T **)stack->ga_data)[stack->ga_len] = type;
|
((type_T **)stack->ga_data)[stack->ga_len] = type == NULL ? &t_any : type;
|
||||||
++stack->ga_len;
|
++stack->ga_len;
|
||||||
|
|
||||||
return isn;
|
return isn;
|
||||||
@@ -1178,7 +1178,7 @@ generate_PUSHFUNC(cctx_T *cctx, char_u *name, type_T *type)
|
|||||||
RETURN_OK_IF_SKIP(cctx);
|
RETURN_OK_IF_SKIP(cctx);
|
||||||
if ((isn = generate_instr_type(cctx, ISN_PUSHFUNC, type)) == NULL)
|
if ((isn = generate_instr_type(cctx, ISN_PUSHFUNC, type)) == NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
isn->isn_arg.string = name;
|
isn->isn_arg.string = name == NULL ? NULL : vim_strsave(name);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@@ -2807,14 +2807,13 @@ compile_load_scriptvar(
|
|||||||
idx,
|
idx,
|
||||||
type);
|
type);
|
||||||
}
|
}
|
||||||
|
else if (import->imp_funcname != NULL)
|
||||||
|
generate_PUSHFUNC(cctx, import->imp_funcname, import->imp_type);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
// TODO: check this is a variable, not a function?
|
|
||||||
generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
|
generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
|
||||||
import->imp_sid,
|
import->imp_sid,
|
||||||
import->imp_var_vals_idx,
|
import->imp_var_vals_idx,
|
||||||
import->imp_type);
|
import->imp_type);
|
||||||
}
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2835,8 +2834,7 @@ generate_funcref(cctx_T *cctx, char_u *name)
|
|||||||
if (ufunc->uf_def_status == UF_TO_BE_COMPILED)
|
if (ufunc->uf_def_status == UF_TO_BE_COMPILED)
|
||||||
if (compile_def_function(ufunc, TRUE, NULL) == FAIL)
|
if (compile_def_function(ufunc, TRUE, NULL) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
return generate_PUSHFUNC(cctx, vim_strsave(ufunc->uf_name),
|
return generate_PUSHFUNC(cctx, ufunc->uf_name, ufunc->uf_func_type);
|
||||||
ufunc->uf_func_type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -465,7 +465,10 @@ handle_import(
|
|||||||
imported->imp_var_vals_idx = idx;
|
imported->imp_var_vals_idx = idx;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
imported->imp_type = ufunc->uf_func_type;
|
||||||
imported->imp_funcname = ufunc->uf_name;
|
imported->imp_funcname = ufunc->uf_name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
erret:
|
erret:
|
||||||
|
Reference in New Issue
Block a user