From 046debb9359c85e2f2bc5c6d9481dac0025c6a80 Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 29 Apr 2014 16:55:27 +0200 Subject: vim-patch:7.4.268 Problem: Using exists() on a funcref for a script-local function does not work. Solution: Translate to the special byte sequence. Add a test. https://code.google.com/p/vim/source/detail?r=1a5ed2626b26a982e307a206572121a557adf709 --- src/eval.c | 7 +++++++ src/testdir/test_eval.in | 5 ++++- src/testdir/test_eval.ok | 4 ++++ src/testdir/test_eval_func.vim | 12 ++++++++++++ src/version.c | 2 +- 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/testdir/test_eval_func.vim (limited to 'src') diff --git a/src/eval.c b/src/eval.c index a4727127f6..93d33a2c96 100644 --- a/src/eval.c +++ b/src/eval.c @@ -17883,6 +17883,13 @@ trans_function_name ( if (name != NULL) { name = vim_strsave(name); *pp = end; + if (strncmp((char *)name, "", 5) == 0) { + // Change "" to the byte sequence. + name[0] = K_SPECIAL; + name[1] = KS_EXTRA; + name[2] = (int)KE_SNR; + memmove(name + 3, name + 5, strlen((char *)name + 5) + 1); + } goto theend; } diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in index 3ab85301cf..09932261af 100644 --- a/src/testdir/test_eval.in +++ b/src/testdir/test_eval.in @@ -36,7 +36,10 @@ STARTTEST :echo g:Foo(2) :echo Foo(3) -:$-5,$w! test.out +:" script-local function used in Funcref must exist. +:so test_eval_func.vim + +:$-9,$w! test.out :q! ENDTEST diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok index c8f6dc7591..c7620836f7 100644 --- a/src/testdir/test_eval.ok +++ b/src/testdir/test_eval.ok @@ -4,3 +4,7 @@ Vim(function):E128: Function name must start with a capital or "s:": b:test() called Foo(1) called Foo(2) called Foo(3) +s:Testje exists: 0 +func s:Testje exists: 1 +Bar exists: 1 +func Bar exists: 1 diff --git a/src/testdir/test_eval_func.vim b/src/testdir/test_eval_func.vim new file mode 100644 index 0000000000..48d01df27d --- /dev/null +++ b/src/testdir/test_eval_func.vim @@ -0,0 +1,12 @@ +" Vim script used in test_eval.in. Needed for script-local function. + +func! s:Testje() + return "foo" +endfunc + +let Bar = function('s:Testje') + +$put ='s:Testje exists: ' . exists('s:Testje') +$put ='func s:Testje exists: ' . exists('*s:Testje') +$put ='Bar exists: ' . exists('Bar') +$put ='func Bar exists: ' . exists('*Bar') diff --git a/src/version.c b/src/version.c index e59e7fe8a4..6e41f41c97 100644 --- a/src/version.c +++ b/src/version.c @@ -204,7 +204,7 @@ static int included_patches[] = { // Add new patch number below this line //270, 269, - //268, + 268, //267, 266, 265, -- cgit