patch 8.2.2791: Vim9: memory leak when using \=expr in :substitute
Problem: Vim9: memory leak when using \=expr in :substitute.
Solution: Do not allocate a new instruction list.
diff --git a/src/version.c b/src/version.c
index 539d7d5..fa2dfae 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2791,
+/**/
2790,
/**/
2789,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 279a8c3..ade86aa 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -8544,9 +8544,7 @@
cmd = skipwhite(cmd);
trailing_error = *cmd != delimiter && *cmd != NUL;
- instr_count = cctx->ctx_instr.ga_len;
- instr = ALLOC_MULT(isn_T, instr_count + 1);
- if (trailing_error || instr == NULL)
+ if (trailing_error || ga_grow(&cctx->ctx_instr, 1) == FAIL)
{
if (trailing_error)
semsg(_(e_trailing_arg), cmd);
@@ -8559,8 +8557,8 @@
// Move the generated instructions into the ISN_SUBSTITUTE
// instructions, then restore the list of instructions before
// adding the ISN_SUBSTITUTE instruction.
- mch_memmove(instr, cctx->ctx_instr.ga_data,
- instr_count * sizeof(isn_T));
+ instr_count = cctx->ctx_instr.ga_len;
+ instr = cctx->ctx_instr.ga_data;
instr[instr_count].isn_type = ISN_FINISH;
cctx->ctx_instr = save_ga;