diff src/vim9compile.c @ 24834:adcd50a18236 v8.2.2955

patch 8.2.2955: Vim9: using filter in compiled command does not work Commit: https://github.com/vim/vim/commit/e729ce294f9756165020ad86e3b98b4112e1a6ab Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 6 21:38:09 2021 +0200 patch 8.2.2955: Vim9: using filter in compiled command does not work Problem: Vim9: using filter in compiled command does not work. Solution: Generate EXEC including the command modifier.
author Bram Moolenaar <Bram@vim.org>
date Sun, 06 Jun 2021 21:45:03 +0200
parents a8d64f1a223b
children 3c8bd1d392d1
line wrap: on
line diff
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -8536,13 +8536,30 @@ compile_put(char_u *arg, exarg_T *eap, c
     static char_u *
 compile_exec(char_u *line, exarg_T *eap, cctx_T *cctx)
 {
-    char_u  *p;
-    int	    has_expr = FALSE;
-    char_u  *nextcmd = (char_u *)"";
+    char_u	*p;
+    int		has_expr = FALSE;
+    char_u	*nextcmd = (char_u *)"";
 
     if (cctx->ctx_skip == SKIP_YES)
 	goto theend;
 
+    // If there was a prececing command modifier, drop it and include it in the
+    // EXEC command.
+    if (cctx->ctx_has_cmdmod)
+    {
+	garray_T	*instr = &cctx->ctx_instr;
+	isn_T		*isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1;
+
+	if (isn->isn_type == ISN_CMDMOD)
+	{
+	    vim_regfree(isn->isn_arg.cmdmod.cf_cmdmod
+					       ->cmod_filter_regmatch.regprog);
+	    vim_free(isn->isn_arg.cmdmod.cf_cmdmod);
+	    --instr->ga_len;
+	    cctx->ctx_has_cmdmod = FALSE;
+	}
+    }
+
     if (eap->cmdidx >= 0 && eap->cmdidx < CMD_SIZE)
     {
 	long	argt = eap->argt;