Patch 8.2.3793

6 views
Skip to first unread message

Bram Moolenaar

unread,
Dec 12, 2021, 4:02:44 PM12/12/21
to vim...@googlegroups.com

Patch 8.2.3793
Problem: Using "g:Func" as a funcref does not work in script context
because "g:" is dropped.
Solution: Keep "g:" in the name. Also add parenthesis to avoid confusing
operator prececence. (closes #9336)
Files: src/evalvars.c, src/testdir/test_vim9_func.vim


*** ../vim-8.2.3792/src/evalvars.c 2021-12-12 16:26:35.864627610 +0000
--- src/evalvars.c 2021-12-12 21:00:52.013246907 +0000
***************
*** 1414,1420 ****
n = (long)tv_get_number(tv);
}

! if (opt_p_flags & P_FUNC && (tv->v_type == VAR_PARTIAL
|| tv->v_type == VAR_FUNC))
{
// If the option can be set to a function reference or a lambda
--- 1414,1420 ----
n = (long)tv_get_number(tv);
}

! if ((opt_p_flags & P_FUNC) && (tv->v_type == VAR_PARTIAL
|| tv->v_type == VAR_FUNC))
{
// If the option can be set to a function reference or a lambda
***************
*** 2723,2729 ****
if (rettv != NULL)
{
rettv->v_type = VAR_FUNC;
! rettv->vval.v_string = vim_strsave(ufunc->uf_name);
if (rettv->vval.v_string != NULL)
func_ref(ufunc->uf_name);
}
--- 2723,2734 ----
if (rettv != NULL)
{
rettv->v_type = VAR_FUNC;
! if (STRNCMP(name, "g:", 2) == 0)
! // Keep the "g:", otherwise script-local may be
! // assumed.
! rettv->vval.v_string = vim_strsave(name);
! else
! rettv->vval.v_string = vim_strsave(ufunc->uf_name);
if (rettv->vval.v_string != NULL)
func_ref(ufunc->uf_name);
}
*** ../vim-8.2.3792/src/testdir/test_vim9_func.vim 2021-12-11 16:13:32.231721218 +0000
--- src/testdir/test_vim9_func.vim 2021-12-12 21:00:06.053206248 +0000
***************
*** 1224,1229 ****
--- 1224,1248 ----
CheckScriptSuccess(lines)
enddef

+ def Test_set_opfunc_to_global_function()
+ var lines =<< trim END
+ vim9script
+ def g:CountSpaces(type = ''): string
+ normal! '[V']y
+ g:result = getreg('"')->count(' ')
+ return ''
+ enddef
+ &operatorfunc = g:CountSpaces
+ new
+ 'a b c d e'->setline(1)
+ feedkeys("g@_", 'x')
+ assert_equal(4, g:result)
+ bwipe!
+ END
+ CheckScriptSuccess(lines)
+ &operatorfunc = ''
+ enddef
+
def Test_lambda_type_allocated()
# Check that unreferencing a partial using a lambda can use the variable type
# after the lambda has been freed and does not leak memory.
*** ../vim-8.2.3792/src/version.c 2021-12-12 20:07:58.724337327 +0000
--- src/version.c 2021-12-12 21:00:17.249216652 +0000
***************
*** 755,756 ****
--- 755,758 ----
{ /* Add new patch number below this line */
+ /**/
+ 3793,
/**/

--
I am also told that there is a logical proof out there somewhere
that demonstrates that there is no task which duct tape cannot handle.
-- Paul Brannan

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages