forked from aniani/vim
patch 8.2.3187: Vim9: popup timer callback is not compiled
Problem: Vim9: popup timer callback is not compiled. Solution: Compile the callback when creating the timer.
This commit is contained in:
@@ -383,8 +383,8 @@ popup_add_timeout(win_T *wp, int time)
|
|||||||
typval_T tv;
|
typval_T tv;
|
||||||
|
|
||||||
vim_snprintf((char *)cbbuf, sizeof(cbbuf),
|
vim_snprintf((char *)cbbuf, sizeof(cbbuf),
|
||||||
"{_ -> popup_close(%d)}", wp->w_id);
|
"(_) => popup_close(%d)", wp->w_id);
|
||||||
if (get_lambda_tv(&ptr, &tv, FALSE, &EVALARG_EVALUATE) == OK)
|
if (get_lambda_tv_and_compile(&ptr, &tv, FALSE, &EVALARG_EVALUATE) == OK)
|
||||||
{
|
{
|
||||||
wp->w_popup_timer = create_timer(time, 0);
|
wp->w_popup_timer = create_timer(time, 0);
|
||||||
wp->w_popup_timer->tr_callback = get_callback(&tv);
|
wp->w_popup_timer->tr_callback = get_callback(&tv);
|
||||||
|
@@ -11,6 +11,7 @@ char_u *peek_next_line_from_context(cctx_T *cctx);
|
|||||||
char_u *next_line_from_context(cctx_T *cctx, int skip_comment);
|
char_u *next_line_from_context(cctx_T *cctx, int skip_comment);
|
||||||
char_u *to_name_end(char_u *arg, int use_namespace);
|
char_u *to_name_end(char_u *arg, int use_namespace);
|
||||||
char_u *to_name_const_end(char_u *arg);
|
char_u *to_name_const_end(char_u *arg);
|
||||||
|
int get_lambda_tv_and_compile(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg);
|
||||||
exprtype_T get_compare_type(char_u *p, int *len, int *type_is);
|
exprtype_T get_compare_type(char_u *p, int *len, int *type_is);
|
||||||
void error_white_both(char_u *op, int len);
|
void error_white_both(char_u *op, int len);
|
||||||
void fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx);
|
void fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx);
|
||||||
|
@@ -755,6 +755,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 */
|
||||||
|
/**/
|
||||||
|
3187,
|
||||||
/**/
|
/**/
|
||||||
3186,
|
3186,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -3670,6 +3670,47 @@ compile_lambda(char_u **arg, cctx_T *cctx)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a lambda and compile it. Uses Vim9 syntax.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
get_lambda_tv_and_compile(
|
||||||
|
char_u **arg,
|
||||||
|
typval_T *rettv,
|
||||||
|
int types_optional,
|
||||||
|
evalarg_T *evalarg)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
ufunc_T *ufunc;
|
||||||
|
int save_sc_version = current_sctx.sc_version;
|
||||||
|
|
||||||
|
// Get the funcref in "rettv".
|
||||||
|
current_sctx.sc_version = SCRIPT_VERSION_VIM9;
|
||||||
|
r = get_lambda_tv(arg, rettv, types_optional, evalarg);
|
||||||
|
current_sctx.sc_version = save_sc_version;
|
||||||
|
if (r != OK)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
// "rettv" will now be a partial referencing the function.
|
||||||
|
ufunc = rettv->vval.v_partial->pt_func;
|
||||||
|
|
||||||
|
// Compile it here to get the return type. The return type is optional,
|
||||||
|
// when it's missing use t_unknown. This is recognized in
|
||||||
|
// compile_return().
|
||||||
|
if (ufunc->uf_ret_type == NULL || ufunc->uf_ret_type->tt_type == VAR_VOID)
|
||||||
|
ufunc->uf_ret_type = &t_unknown;
|
||||||
|
compile_def_function(ufunc, FALSE, CT_NONE, NULL);
|
||||||
|
|
||||||
|
if (ufunc->uf_def_status == UF_COMPILED)
|
||||||
|
{
|
||||||
|
// The return type will now be known.
|
||||||
|
set_function_type(ufunc);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
clear_tv(rettv);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* parse a dict: {key: val, [key]: val}
|
* parse a dict: {key: val, [key]: val}
|
||||||
* "*arg" points to the '{'.
|
* "*arg" points to the '{'.
|
||||||
|
Reference in New Issue
Block a user