diff src/vim9expr.c @ 28287:dc68c111cf7a v8.2.4669

patch 8.2.4669: in compiled code len('string') is not inlined Commit: https://github.com/vim/vim/commit/58f331a05f5b7bdddf04e68b6e51a827fd0c43f0 Author: LemonBoy <thatlemon@gmail.com> Date: Sat Apr 2 21:59:06 2022 +0100 patch 8.2.4669: in compiled code len('string') is not inlined Problem: In compiled code len('string') is not inlined. Solution: Compute the length at compile time if possible. (closes https://github.com/vim/vim/issues/10065)
author Bram Moolenaar <Bram@vim.org>
date Sat, 02 Apr 2022 23:00:05 +0200
parents c84f4e34ba16
children d550054e1328
line wrap: on
line diff
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -724,13 +724,16 @@ compile_call(
     }
 
     // We can evaluate "has('name')" at compile time.
+    // We can evaluate "len('string')" at compile time.
     // We always evaluate "exists_compiled()" at compile time.
-    if ((varlen == 3 && STRNCMP(*arg, "has", 3) == 0)
+    if ((varlen == 3
+	     && (STRNCMP(*arg, "has", 3) == 0 || STRNCMP(*arg, "len", 3) == 0))
 	    || (varlen == 15 && STRNCMP(*arg, "exists_compiled", 6) == 0))
     {
 	char_u	    *s = skipwhite(*arg + varlen + 1);
 	typval_T    argvars[2];
 	int	    is_has = **arg == 'h';
+	int	    is_len = **arg == 'l';
 
 	argvars[0].v_type = VAR_UNKNOWN;
 	if (*s == '"')
@@ -750,6 +753,8 @@ compile_call(
 	    tv->vval.v_number = 0;
 	    if (is_has)
 		f_has(argvars, tv);
+	    else if (is_len)
+		f_len(argvars, tv);
 	    else
 		f_exists(argvars, tv);
 	    clear_tv(&argvars[0]);
@@ -757,7 +762,7 @@ compile_call(
 	    return OK;
 	}
 	clear_tv(&argvars[0]);
-	if (!is_has)
+	if (!is_has && !is_len)
 	{
 	    emsg(_(e_argument_of_exists_compiled_must_be_literal_string));
 	    return FAIL;