comparison src/evalvars.c @ 19609:fe827d6267c2 v8.2.0361

patch 8.2.0361: internal error when using "0" for a callback Commit: https://github.com/vim/vim/commit/14e57909e662a43a42438e2701654af48af49b03 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 7 16:59:25 2020 +0100 patch 8.2.0361: internal error when using "0" for a callback Problem: Internal error when using "0" for a callback. Solution: Give a normal error. (closes https://github.com/vim/vim/issues/5743)
author Bram Moolenaar <Bram@vim.org>
date Sat, 07 Mar 2020 17:00:06 +0100
parents 48e71f948360
children 2ef25a007bb7
comparison
equal deleted inserted replaced
19608:2f6e8d14ad36 19609:fe827d6267c2
3641 * "cb_name" is set to NULL for an invalid argument. 3641 * "cb_name" is set to NULL for an invalid argument.
3642 */ 3642 */
3643 callback_T 3643 callback_T
3644 get_callback(typval_T *arg) 3644 get_callback(typval_T *arg)
3645 { 3645 {
3646 callback_T res; 3646 callback_T res;
3647 int r = OK;
3647 3648
3648 res.cb_free_name = FALSE; 3649 res.cb_free_name = FALSE;
3649 if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL) 3650 if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL)
3650 { 3651 {
3651 res.cb_partial = arg->vval.v_partial; 3652 res.cb_partial = arg->vval.v_partial;
3653 res.cb_name = partial_name(res.cb_partial); 3654 res.cb_name = partial_name(res.cb_partial);
3654 } 3655 }
3655 else 3656 else
3656 { 3657 {
3657 res.cb_partial = NULL; 3658 res.cb_partial = NULL;
3658 if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING) 3659 if (arg->v_type == VAR_STRING && arg->vval.v_string != NULL
3660 && isdigit(*arg->vval.v_string))
3661 r = FAIL;
3662 else if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING)
3659 { 3663 {
3660 // Note that we don't make a copy of the string. 3664 // Note that we don't make a copy of the string.
3661 res.cb_name = arg->vval.v_string; 3665 res.cb_name = arg->vval.v_string;
3662 func_ref(res.cb_name); 3666 func_ref(res.cb_name);
3663 } 3667 }
3664 else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) 3668 else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0)
3665 {
3666 res.cb_name = (char_u *)""; 3669 res.cb_name = (char_u *)"";
3667 }
3668 else 3670 else
3671 r = FAIL;
3672
3673 if (r == FAIL)
3669 { 3674 {
3670 emsg(_("E921: Invalid callback argument")); 3675 emsg(_("E921: Invalid callback argument"));
3671 res.cb_name = NULL; 3676 res.cb_name = NULL;
3672 } 3677 }
3673 } 3678 }