Yegappan wrote:
> On Thu, Dec 9, 2021 at 6:24 AM Bram Moolenaar <[email protected]> wrote: > > > > > > Patch 8.2.3765 > > Problem: Vim9: cannot use a lambda for 'opfunc' and others. > > Solution: Convert the lambda to a string. > > > > *************** > > *** 2349,2359 **** > > if (s == NULL) > > s = (char_u *)""; > > } > > else > > // must be VAR_NUMBER, CHECKTYPE makes sure > > n = tv->vval.v_number; > > ! msg = set_option_value(iptr->isn_arg.storeopt.so_name, > > ! n, s, > > iptr->isn_arg.storeopt.so_flags); > > clear_tv(tv); > > if (msg != NULL) > > { > > --- 2353,2374 ---- > > if (s == NULL) > > s = (char_u *)""; > > } > > + else if (iptr->isn_type == ISN_STOREFUNCOPT) > > + { > > + SOURCING_LNUM = iptr->isn_lnum; > > + cb = get_callback(tv); > > + if (cb.cb_name == NULL || *cb.cb_name == NUL) > > + { > > + clear_tv(tv); > > + free_callback(&cb); > > + goto on_error; > > + } > > + s = cb.cb_name; > > Instead of the above, I think we should use tv2string() here to convert the > lambda/funcref to a string. The diff to do this is below. > > diff --git a/src/vim9execute.c b/src/vim9execute.c > index 874e57c58..fa31d9180 100644 > --- a/src/vim9execute.c > +++ b/src/vim9execute.c > @@ -1646,6 +1646,7 @@ exec_instructions(ectx_T *ectx) > int ret = FAIL; > int save_trylevel_at_start = ectx->ec_trylevel_at_start; > int dict_stack_len_at_start = dict_stack.ga_len; > + char_u *tofree = NULL; > > // Start execution at the first instruction. > ectx->ec_iidx = 0; > @@ -2344,6 +2345,7 @@ exec_instructions(ectx_T *ectx) > char_u *s = NULL; > char *msg; > callback_T cb = {NULL, NULL, 0}; > + char_u numbuf[NUMBUFLEN]; > > --ectx->ec_stack.ga_len; > tv = STACK_TV_BOT(0); > @@ -2356,14 +2358,11 @@ exec_instructions(ectx_T *ectx) > else if (iptr->isn_type == ISN_STOREFUNCOPT) > { > SOURCING_LNUM = iptr->isn_lnum; > - cb = get_callback(tv); > - if (cb.cb_name == NULL || *cb.cb_name == NUL) > - { > - clear_tv(tv); > - free_callback(&cb); > - goto on_error; > - } > - s = cb.cb_name; > + // If the option can be set to a function reference or > + // a lambda and the passed value is a function > + // reference, then convert it to the name (string) of > + // the function reference. > + s = tv2string(tv, &tofree, numbuf, 0); > } > else > // must be VAR_NUMBER, CHECKTYPE makes sure > @@ -4642,6 +4641,7 @@ on_fatal_error: > done: > ret = OK; > theend: > + vim_free(tofree); > dict_stack_clear(dict_stack_len_at_start); > ectx->ec_trylevel_at_start = save_trylevel_at_start; > return ret; That is simpler. Why only free "tofree" much later? It should be possible after setting the option. -- hundred-and-one symptoms of being an internet addict: 17. You turn on your intercom when leaving the room so you can hear if new e-mail arrives. /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/20211209164249.D32351C0C20%40moolenaar.net.
