Mercurial > vim
comparison src/userfunc.c @ 29196:e391590249a1 v8.2.5117
patch 8.2.5117: crash when calling a Lua callback from a :def function
Commit: https://github.com/vim/vim/commit/7d149f899d423b7bf2b90d7b11ebe3e560c462b9
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jun 17 19:23:34 2022 +0100
patch 8.2.5117: crash when calling a Lua callback from a :def function
Problem: Crash when calling a Lua callback from a :def function. (Bohdan
Makohin)
Solution: Handle FC_CFUNC in call_user_func_check(). (closes #10587)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 17 Jun 2022 20:30:03 +0200 |
parents | b02044bc8c20 |
children | a74398c432a4 |
comparison
equal
deleted
inserted
replaced
29195:ee8ebed77cee | 29196:e391590249a1 |
---|---|
3019 funcexe_T *funcexe, | 3019 funcexe_T *funcexe, |
3020 dict_T *selfdict) | 3020 dict_T *selfdict) |
3021 { | 3021 { |
3022 int error; | 3022 int error; |
3023 | 3023 |
3024 #ifdef FEAT_LUA | |
3025 if (fp->uf_flags & FC_CFUNC) | |
3026 { | |
3027 cfunc_T cb = fp->uf_cb; | |
3028 | |
3029 return (*cb)(argcount, argvars, rettv, fp->uf_cb_state); | |
3030 } | |
3031 #endif | |
3032 | |
3024 if (fp->uf_flags & FC_RANGE && funcexe->fe_doesrange != NULL) | 3033 if (fp->uf_flags & FC_RANGE && funcexe->fe_doesrange != NULL) |
3025 *funcexe->fe_doesrange = TRUE; | 3034 *funcexe->fe_doesrange = TRUE; |
3026 error = check_user_func_argcount(fp, argcount); | 3035 error = check_user_func_argcount(fp, argcount); |
3027 if (error != FCERR_UNKNOWN) | 3036 if (error != FCERR_UNKNOWN) |
3028 return error; | 3037 return error; |
3582 fp = find_func(p, is_global); | 3591 fp = find_func(p, is_global); |
3583 } | 3592 } |
3584 | 3593 |
3585 if (fp != NULL && (fp->uf_flags & FC_DELETED)) | 3594 if (fp != NULL && (fp->uf_flags & FC_DELETED)) |
3586 error = FCERR_DELETED; | 3595 error = FCERR_DELETED; |
3587 #ifdef FEAT_LUA | |
3588 else if (fp != NULL && (fp->uf_flags & FC_CFUNC)) | |
3589 { | |
3590 cfunc_T cb = fp->uf_cb; | |
3591 | |
3592 error = (*cb)(argcount, argvars, rettv, fp->uf_cb_state); | |
3593 } | |
3594 #endif | |
3595 else if (fp != NULL) | 3596 else if (fp != NULL) |
3596 { | 3597 { |
3597 if (funcexe->fe_argv_func != NULL) | 3598 if (funcexe->fe_argv_func != NULL) |
3598 // postponed filling in the arguments, do it now | 3599 // postponed filling in the arguments, do it now |
3599 argcount = funcexe->fe_argv_func(argcount, argvars, | 3600 argcount = funcexe->fe_argv_func(argcount, argvars, |