diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-02-28 21:55:55 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-28 21:55:55 +0800 |
commit | f289fc4abb8e7c02acfd2dfc834cc6447193a67e (patch) | |
tree | 4790d7d0eb363611d524dad5b09e2687bec2a1ec /src/nvim/eval/funcs.c | |
parent | faa5d5be4b998427b3378d16ea5ce6ef6f5ddfd0 (diff) | |
parent | 278aeee3aed753d1084597378e653395bd472c42 (diff) | |
download | rneovim-f289fc4abb8e7c02acfd2dfc834cc6447193a67e.tar.gz rneovim-f289fc4abb8e7c02acfd2dfc834cc6447193a67e.tar.bz2 rneovim-f289fc4abb8e7c02acfd2dfc834cc6447193a67e.zip |
Merge pull request #22456 from zeertzjq/vim-9.0.0430
vim-patch:8.2.{4668,4670},9.0.0430: cannot use repeat() with a blob
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r-- | src/nvim/eval/funcs.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 5da6233e38..4208c5ca46 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -5976,6 +5976,37 @@ static void f_repeat(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) while (n-- > 0) { tv_list_extend(rettv->vval.v_list, argvars[0].vval.v_list, NULL); } + } else if (argvars[0].v_type == VAR_BLOB) { + tv_blob_alloc_ret(rettv); + if (argvars[0].vval.v_blob == NULL || n <= 0) { + return; + } + + const int slen = argvars[0].vval.v_blob->bv_ga.ga_len; + const int len = (int)(slen * n); + if (len <= 0) { + return; + } + + ga_grow(&rettv->vval.v_blob->bv_ga, len); + + rettv->vval.v_blob->bv_ga.ga_len = len; + + int i; + for (i = 0; i < slen; i++) { + if (tv_blob_get(argvars[0].vval.v_blob, i) != 0) { + break; + } + } + + if (i == slen) { + // No need to copy since all bytes are already zero + return; + } + + for (i = 0; i < n; i++) { + tv_blob_set_range(rettv->vval.v_blob, i * slen, (i + 1) * slen - 1, argvars); + } } else { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; |