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
index 46b826c..7aa1549 100644
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -1140,7 +1140,7 @@
# 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 @@
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 @@
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
index e329775..24d2f08 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4066,
+/**/
4065,
/**/
4064,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 963c052..90cb2b4 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -623,10 +623,12 @@
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
index d3e1922..b72995c 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -250,6 +250,8 @@
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 @@
// 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 @@
&& 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: