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/vim9execute.c b/src/vim9execute.c
index 10da178..a738aa1 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -492,7 +492,7 @@
case ISN_LOADSCRIPT:
{
scriptitem_T *si =
- &SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
+ SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
svar_T *sv;
sv = ((svar_T *)si->sn_var_vals.ga_data)
@@ -598,7 +598,7 @@
// store script-local variable
case ISN_STORESCRIPT:
{
- scriptitem_T *si = &SCRIPT_ITEM(
+ scriptitem_T *si = SCRIPT_ITEM(
iptr->isn_arg.script.script_sid);
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data)
+ iptr->isn_arg.script.script_idx;
@@ -1551,7 +1551,7 @@
case ISN_LOADSCRIPT:
{
scriptitem_T *si =
- &SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
+ SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data)
+ iptr->isn_arg.script.script_idx;
@@ -1561,7 +1561,7 @@
break;
case ISN_LOADS:
{
- scriptitem_T *si = &SCRIPT_ITEM(iptr->isn_arg.loads.ls_sid);
+ scriptitem_T *si = SCRIPT_ITEM(iptr->isn_arg.loads.ls_sid);
smsg("%4d LOADS s:%s from %s", current,
iptr->isn_arg.string, si->sn_name);
@@ -1589,7 +1589,7 @@
case ISN_STORESCRIPT:
{
scriptitem_T *si =
- &SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
+ SCRIPT_ITEM(iptr->isn_arg.script.script_sid);
svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data)
+ iptr->isn_arg.script.script_idx;