patch 8.2.4934: string interpolation fails when not evaluating
Problem: String interpolation fails when not evaluating.
Solution: Skip the expression when not evaluating. (closes #10398)
diff --git a/src/evalvars.c b/src/evalvars.c
index d8ee216..e83c50d 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -605,10 +605,11 @@
/*
* Evaluate one Vim expression {expr} in string "p" and append the
* resulting string to "gap". "p" points to the opening "{".
+ * When "evaluate" is FALSE only skip over the expression.
* Return a pointer to the character after "}", NULL for an error.
*/
char_u *
-eval_one_expr_in_str(char_u *p, garray_T *gap)
+eval_one_expr_in_str(char_u *p, garray_T *gap, int evaluate)
{
char_u *block_start = skipwhite(p + 1); // skip the opening {
char_u *block_end = block_start;
@@ -627,13 +628,16 @@
semsg(_(e_missing_close_curly_str), p);
return NULL;
}
- *block_end = NUL;
- expr_val = eval_to_string(block_start, TRUE);
- *block_end = '}';
- if (expr_val == NULL)
- return NULL;
- ga_concat(gap, expr_val);
- vim_free(expr_val);
+ if (evaluate)
+ {
+ *block_end = NUL;
+ expr_val = eval_to_string(block_start, TRUE);
+ *block_end = '}';
+ if (expr_val == NULL)
+ return NULL;
+ ga_concat(gap, expr_val);
+ vim_free(expr_val);
+ }
return block_end + 1;
}
@@ -691,7 +695,7 @@
}
// Evaluate the expression and append the result.
- p = eval_one_expr_in_str(p, &ga);
+ p = eval_one_expr_in_str(p, &ga, TRUE);
if (p == NULL)
{
ga_clear(&ga);
diff --git a/src/proto/evalvars.pro b/src/proto/evalvars.pro
index ce79435..4683c15 100644
--- a/src/proto/evalvars.pro
+++ b/src/proto/evalvars.pro
@@ -13,7 +13,7 @@
int get_spellword(list_T *list, char_u **pp);
void prepare_vimvar(int idx, typval_T *save_tv);
void restore_vimvar(int idx, typval_T *save_tv);
-char_u *eval_one_expr_in_str(char_u *p, garray_T *gap);
+char_u *eval_one_expr_in_str(char_u *p, garray_T *gap, int evaluate);
char_u *eval_all_expr_in_str(char_u *str);
list_T *heredoc_get(exarg_T *eap, char_u *cmd, int script_get, int vim9compile);
void ex_var(exarg_T *eap);
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 202bb58..bbe39d1 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2156,6 +2156,13 @@
->split($'x{x}x')
->map((_, v: string) => v =~ 'bar')
assert_equal([false, true, false], vl)
+
+ # interpolated string in a lambda
+ lines =<< trim END
+ assert_equal(['gnome-256color', 'xterm-256color'], ['gnome', 'xterm']
+ ->map((_, term: string) => $'{term}-256color'))
+ END
+ v9.CheckDefAndScriptSuccess(lines)
enddef
def Test_expr8_vimvar()
diff --git a/src/typval.c b/src/typval.c
index 09dc474..a266330 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -2363,7 +2363,7 @@
++*arg;
break;
}
- p = eval_one_expr_in_str(*arg, &ga);
+ p = eval_one_expr_in_str(*arg, &ga, evaluate);
if (p == NULL)
{
ret = FAIL;
diff --git a/src/version.c b/src/version.c
index cffc703..80f631b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4934,
+/**/
4933,
/**/
4932,