Mercurial > vim
diff src/userfunc.c @ 30333:fc0830246f49 v9.0.0502
patch 9.0.0502: a closure in a nested loop in a :def function does not work
Commit: https://github.com/vim/vim/commit/cc34181f9994d64f8c8fa2f5845eaf0cc963067f
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Sep 19 15:54:34 2022 +0100
patch 9.0.0502: a closure in a nested loop in a :def function does not work
Problem: A closure in a nested loop in a :def function does not work.
Solution: Use an array of loopvars, one per loop level.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 19 Sep 2022 17:00:07 +0200 |
parents | 61a688be1899 |
children | c2ef8f0f8ba1 |
line wrap: on
line diff
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -2453,11 +2453,10 @@ func_clear_free(ufunc_T *fp, int force) */ int copy_lambda_to_global_func( - char_u *lambda, - char_u *global, - short loop_var_idx, - short loop_var_count, - ectx_T *ectx) + char_u *lambda, + char_u *global, + loopvarinfo_T *loopvarinfo, + ectx_T *ectx) { ufunc_T *ufunc = find_func_even_dead(lambda, FFED_IS_GLOBAL); ufunc_T *fp = NULL; @@ -2524,14 +2523,12 @@ copy_lambda_to_global_func( if (pt == NULL) goto failed; - if (fill_partial_and_closure(pt, ufunc, loop_var_idx, loop_var_count, - ectx) == FAIL) + if (fill_partial_and_closure(pt, ufunc, loopvarinfo, ectx) == FAIL) { vim_free(pt); goto failed; } ufunc->uf_partial = pt; - --pt->pt_refcount; // not actually referenced here } return OK;