]> granicus.if.org Git - vim/commitdiff
patch 8.2.1287: Vim9: crash when using an imported function v8.2.1287
authorBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 20:41:43 +0000 (22:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 20:41:43 +0000 (22:41 +0200)
Problem:    Vim9: crash when using an imported function.
Solution:   Add the function type to the imported entry. (closes #6522)

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c
src/vim9script.c

index d7464856b3a8e4581167e7533887698d776a68ad..3e2ced0a93f3b152135534748e1451e93628727b 100644 (file)
@@ -912,6 +912,12 @@ def Test_vim9_import_export()
     g:imported_added = 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'
     g:imported_name = exp_name
     exp_name ..= ' Doe'
@@ -930,6 +936,7 @@ def Test_vim9_import_export()
   assert_equal(9879, g:imported_added)
   assert_equal(9879, g:imported_later)
   assert_equal('Exported', g:imported_func)
+  assert_equal('Exported', g:funcref_result)
   assert_equal('John', g:imported_name)
   assert_equal('John Doe', g:imported_name_appended)
   assert_false(exists('g:name'))
index fc86f15dc2c217aeba04c0e5db7debb99dacf8a7..8f8ebc6ff84cb28ca240b64e56f8a51f24288b6b 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1287,
 /**/
     1286,
 /**/
index 52841de6bddc0ace2b1615b2cf5bbb49c7eecfd3..53bfb6c48e034eeaef7624e158159672f98db49f 100644 (file)
@@ -714,7 +714,7 @@ generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type)
 
     if (ga_grow(stack, 1) == FAIL)
        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;
 
     return isn;
@@ -1178,7 +1178,7 @@ generate_PUSHFUNC(cctx_T *cctx, char_u *name, type_T *type)
     RETURN_OK_IF_SKIP(cctx);
     if ((isn = generate_instr_type(cctx, ISN_PUSHFUNC, type)) == NULL)
        return FAIL;
-    isn->isn_arg.string = name;
+    isn->isn_arg.string = name == NULL ? NULL : vim_strsave(name);
 
     return OK;
 }
@@ -2807,14 +2807,13 @@ compile_load_scriptvar(
                    idx,
                    type);
        }
+       else if (import->imp_funcname != NULL)
+           generate_PUSHFUNC(cctx, import->imp_funcname, import->imp_type);
        else
-       {
-           // TODO: check this is a variable, not a function?
            generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
                    import->imp_sid,
                    import->imp_var_vals_idx,
                    import->imp_type);
-       }
        return OK;
     }
 
@@ -2835,8 +2834,7 @@ generate_funcref(cctx_T *cctx, char_u *name)
     if (ufunc->uf_def_status == UF_TO_BE_COMPILED)
        if (compile_def_function(ufunc, TRUE, NULL) == FAIL)
            return FAIL;
-    return generate_PUSHFUNC(cctx, vim_strsave(ufunc->uf_name),
-                                                         ufunc->uf_func_type);
+    return generate_PUSHFUNC(cctx, ufunc->uf_name, ufunc->uf_func_type);
 }
 
 /*
index 34c3dabcf0d24ba6238f9a72665781be957fbcc2..784283ef9762e467ae53c92fac4fe2e3842fd847 100644 (file)
@@ -465,7 +465,10 @@ handle_import(
                imported->imp_var_vals_idx = idx;
            }
            else
+           {
+               imported->imp_type = ufunc->uf_func_type;
                imported->imp_funcname = ufunc->uf_name;
+           }
        }
     }
 erret: