Mercurial > vim
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;