mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.1.0627: Python cannot handle function name of script-local function
Problem: Python cannot handle function name of script-local function. Solution: Use <SNR> instead of the special byte code. (Ozaki Kiichi, closes #3681)
This commit is contained in:
@@ -2922,8 +2922,7 @@ FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv,
|
|||||||
{
|
{
|
||||||
FunctionObject *self;
|
FunctionObject *self;
|
||||||
|
|
||||||
self = (FunctionObject *) subtype->tp_alloc(subtype, 0);
|
self = (FunctionObject *)subtype->tp_alloc(subtype, 0);
|
||||||
|
|
||||||
if (self == NULL)
|
if (self == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -2938,15 +2937,36 @@ FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv,
|
|||||||
self->name = vim_strsave(name);
|
self->name = vim_strsave(name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ((self->name = get_expanded_name(name,
|
{
|
||||||
vim_strchr(name, AUTOLOAD_CHAR) == NULL))
|
char_u *p;
|
||||||
== NULL)
|
|
||||||
|
if ((p = get_expanded_name(name,
|
||||||
|
vim_strchr(name, AUTOLOAD_CHAR) == NULL)) == NULL)
|
||||||
{
|
{
|
||||||
PyErr_FORMAT(PyExc_ValueError,
|
PyErr_FORMAT(PyExc_ValueError,
|
||||||
N_("function %s does not exist"), name);
|
N_("function %s does not exist"), name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p[0] == K_SPECIAL && p[1] == KS_EXTRA && p[2] == (int)KE_SNR)
|
||||||
|
{
|
||||||
|
char_u *np;
|
||||||
|
size_t len = STRLEN(p) + 1;
|
||||||
|
|
||||||
|
if ((np = alloc(len + 2)) == NULL)
|
||||||
|
{
|
||||||
|
vim_free(p);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mch_memmove(np, "<SNR>", 5);
|
||||||
|
mch_memmove(np + 5, p + 3, len - 3);
|
||||||
|
vim_free(p);
|
||||||
|
self->name = np;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
self->name = p;
|
||||||
|
}
|
||||||
|
|
||||||
func_ref(self->name);
|
func_ref(self->name);
|
||||||
self->argc = argc;
|
self->argc = argc;
|
||||||
self->argv = argv;
|
self->argv = argv;
|
||||||
|
@@ -36,3 +36,30 @@ func Test_set_cursor()
|
|||||||
normal j
|
normal j
|
||||||
call assert_equal([2, 6], [line('.'), col('.')])
|
call assert_equal([2, 6], [line('.'), col('.')])
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_vim_function()
|
||||||
|
" Check creating vim.Function object
|
||||||
|
py import vim
|
||||||
|
|
||||||
|
func s:foo()
|
||||||
|
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
|
||||||
|
endfunc
|
||||||
|
let name = '<SNR>' . s:foo()
|
||||||
|
|
||||||
|
try
|
||||||
|
py f = vim.bindeval('function("s:foo")')
|
||||||
|
call assert_equal(name, pyeval('f.name'))
|
||||||
|
catch
|
||||||
|
call assert_false(v:exception)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
try
|
||||||
|
py f = vim.Function('\x80\xfdR' + vim.eval('s:foo()'))
|
||||||
|
call assert_equal(name, pyeval('f.name'))
|
||||||
|
catch
|
||||||
|
call assert_false(v:exception)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
py del f
|
||||||
|
delfunc s:foo
|
||||||
|
endfunc
|
||||||
|
@@ -36,3 +36,30 @@ func Test_set_cursor()
|
|||||||
normal j
|
normal j
|
||||||
call assert_equal([2, 6], [line('.'), col('.')])
|
call assert_equal([2, 6], [line('.'), col('.')])
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_vim_function()
|
||||||
|
" Check creating vim.Function object
|
||||||
|
py3 import vim
|
||||||
|
|
||||||
|
func s:foo()
|
||||||
|
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
|
||||||
|
endfunc
|
||||||
|
let name = '<SNR>' . s:foo()
|
||||||
|
|
||||||
|
try
|
||||||
|
py3 f = vim.bindeval('function("s:foo")')
|
||||||
|
call assert_equal(name, py3eval('f.name'))
|
||||||
|
catch
|
||||||
|
call assert_false(v:exception)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
try
|
||||||
|
py3 f = vim.Function(b'\x80\xfdR' + vim.eval('s:foo()').encode())
|
||||||
|
call assert_equal(name, py3eval('f.name'))
|
||||||
|
catch
|
||||||
|
call assert_false(v:exception)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
py3 del f
|
||||||
|
delfunc s:foo
|
||||||
|
endfunc
|
||||||
|
@@ -799,6 +799,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
627,
|
||||||
/**/
|
/**/
|
||||||
626,
|
626,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user