patch 8.2.0154: reallocating the list of scripts is inefficient
Problem: Reallocating the list of scripts is inefficient.
Solution: Instead of using a growarray of scriptitem_T, store pointers and
allocate each scriptitem_T separately. Also avoids that the
growarray pointers change when sourcing a new script.
diff --git a/src/vim9script.c b/src/vim9script.c
index 4596ce3..fb19258 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -32,7 +32,7 @@
void
ex_vim9script(exarg_T *eap)
{
- scriptitem_T *si = &SCRIPT_ITEM(current_sctx.sc_sid);
+ scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
if (!getline_equal(eap->getline, eap->cookie, getsourceline))
{
@@ -114,7 +114,7 @@
void
free_imports(int sid)
{
- scriptitem_T *si = &SCRIPT_ITEM(sid);
+ scriptitem_T *si = SCRIPT_ITEM(sid);
int idx;
for (idx = 0; idx < si->sn_imports.ga_len; ++idx)
@@ -226,7 +226,7 @@
if (*tv.vval.v_string == '.')
{
size_t len;
- scriptitem_T *si = &SCRIPT_ITEM(current_sctx.sc_sid);
+ scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
char_u *tail = gettail(si->sn_name);
char_u *from_name;
@@ -279,7 +279,7 @@
if (*arg_start == '*')
{
imported_T *imported = new_imported(gap != NULL ? gap
- : &SCRIPT_ITEM(import_sid).sn_imports);
+ : &SCRIPT_ITEM(import_sid)->sn_imports);
if (imported == NULL)
return NULL;
@@ -289,7 +289,7 @@
}
else
{
- scriptitem_T *script = &SCRIPT_ITEM(sid);
+ scriptitem_T *script = SCRIPT_ITEM(sid);
arg = arg_start;
if (*arg == '{')
@@ -358,7 +358,7 @@
}
imported = new_imported(gap != NULL ? gap
- : &SCRIPT_ITEM(import_sid).sn_imports);
+ : &SCRIPT_ITEM(import_sid)->sn_imports);
if (imported == NULL)
return NULL;