]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4066: Vim9: imported autoload script loaded again v8.2.4066
authorBram Moolenaar <Bram@vim.org>
Wed, 12 Jan 2022 11:46:40 +0000 (11:46 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 12 Jan 2022 11:46:40 +0000 (11:46 +0000)
Problem:    Vim9: imported autoload script loaded again.
Solution:   Do not create a new imported_T every time.

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

index 46b826c949f46dcc79c984d6e353bd5992728268..7aa1549155fdd3dbfad77873d92f3544a023089f 100644 (file)
@@ -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
index e329775342f61258f38628c8b971361c1b69753a..24d2f087d3cff715312bffee2714d32427f2577f 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4066,
 /**/
     4065,
 /**/
index 963c052006842e4302cb4ac0d22410795f62bbd8..90cb2b4ffa45308f4dbdb3732c14427179d42ba4 100644 (file)
@@ -623,10 +623,12 @@ find_imported(char_u *name, size_t len, int load, cctx_T *cctx)
 
     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;
 }
index d3e19224050f6d7225b627b692dbb76eba486863..b72995c11c3e44bd6678d5cdc87d3c4a4d247a0a 100644 (file)
@@ -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: