# HG changeset patch # User Bram Moolenaar # Date 1641988806 -3600 # Node ID 19fefc42a0638bf65ffe3d191a206809aeac2832 # Parent 4ab8aec1b84784369e7d3abb26b3eeaeb11c9823 patch 8.2.4066: Vim9: imported autoload script loaded again Commit: https://github.com/vim/vim/commit/17d36cbcd36d944c744ef68afa971718959b2111 Author: Bram Moolenaar Date: Wed Jan 12 11:46:40 2022 +0000 patch 8.2.4066: Vim9: imported autoload script loaded again Problem: Vim9: imported autoload script loaded again. Solution: Do not create a new imported_T every time. diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -1140,7 +1140,7 @@ def Test_vim9script_autoload() # when using "vim9script autoload" prefix is not needed var lines =<< trim END vim9script autoload - g:prefixed_loaded = 'yes' + g:prefixed_loaded += 1 export def Gettest(): string return 'test' @@ -1156,12 +1156,14 @@ def Test_vim9script_autoload() END writefile(lines, 'Xdir/autoload/prefixed.vim') + g:prefixed_loaded = 0 + g:expected_loaded = 0 lines =<< trim END vim9script import autoload 'prefixed.vim' - assert_false(exists('g:prefixed_loaded')) + assert_equal(g:expected_loaded, g:prefixed_loaded) assert_equal('test', prefixed.Gettest()) - assert_equal('yes', g:prefixed_loaded) + assert_equal(1, g:prefixed_loaded) assert_equal('testmore', prefixed.GetMore()) assert_equal('name', prefixed.name) @@ -1169,6 +1171,9 @@ def Test_vim9script_autoload() assert_equal('const', prefixed.cname) END CheckScriptSuccess(lines) + # can source it again, autoload script not loaded again + g:expected_loaded = 1 + CheckScriptSuccess(lines) # can also get the items by autoload name lines =<< trim END diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4066, +/**/ 4065, /**/ 4064, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -623,10 +623,12 @@ find_imported(char_u *name, size_t len, if (ret != NULL && load && ret->imp_flags == IMP_FLAGS_AUTOLOAD) { + scid_T dummy; + // script found before but not loaded yet ret->imp_flags = 0; (void)do_source(SCRIPT_ITEM(ret->imp_sid)->sn_name, FALSE, - DOSO_NONE, NULL); + DOSO_NONE, &dummy); } return ret; } diff --git a/src/vim9script.c b/src/vim9script.c --- a/src/vim9script.c +++ b/src/vim9script.c @@ -250,6 +250,8 @@ ex_incdec(exarg_T *eap) void ex_export(exarg_T *eap) { + int prev_did_emsg = did_emsg; + if (!in_vim9script()) { emsg(_(e_export_can_only_be_used_in_vim9script)); @@ -273,12 +275,14 @@ ex_export(exarg_T *eap) // The command will reset "is_export" when exporting an item. if (is_export) { - emsg(_(e_export_with_invalid_argument)); + if (did_emsg == prev_did_emsg) + emsg(_(e_export_with_invalid_argument)); is_export = FALSE; } break; default: - emsg(_(e_invalid_command_after_export)); + if (did_emsg == prev_did_emsg) + emsg(_(e_invalid_command_after_export)); break; } } @@ -589,14 +593,17 @@ handle_import( && check_defined(as_name, STRLEN(as_name), cctx, FALSE) == FAIL) goto erret; - imported = new_imported(import_gap); if (imported == NULL) - goto erret; - imported->imp_name = as_name; - as_name = NULL; - imported->imp_sid = sid; - if (is_autoload) - imported->imp_flags = IMP_FLAGS_AUTOLOAD; + { + imported = new_imported(import_gap); + if (imported == NULL) + goto erret; + imported->imp_name = as_name; + as_name = NULL; + imported->imp_sid = sid; + if (is_autoload) + imported->imp_flags = IMP_FLAGS_AUTOLOAD; + } } erret: