diff options
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 79 |
1 files changed, 53 insertions, 26 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index de510a8bca..9f56b42fba 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -622,8 +622,7 @@ void eval_clear(void) for (size_t i = 0; i < ARRAY_SIZE(vimvars); i++) { p = &vimvars[i]; if (p->vv_di.di_tv.v_type == VAR_STRING) { - xfree(p->vv_str); - p->vv_str = NULL; + XFREE_CLEAR(p->vv_str); } else if (p->vv_di.di_tv.v_type == VAR_LIST) { tv_list_unref(p->vv_list); p->vv_list = NULL; @@ -842,15 +841,12 @@ void var_redir_stop(void) clear_lval(redir_lval); } - /* free the collected output */ - xfree(redir_ga.ga_data); - redir_ga.ga_data = NULL; + // free the collected output + XFREE_CLEAR(redir_ga.ga_data); - xfree(redir_lval); - redir_lval = NULL; + XFREE_CLEAR(redir_lval); } - xfree(redir_varname); - redir_varname = NULL; + XFREE_CLEAR(redir_varname); } int eval_charconvert(const char *const enc_from, const char *const enc_to, @@ -3201,8 +3197,7 @@ char_u *get_user_var_name(expand_T *xp, int idx) return cat_prefix_varname('v', (char_u *)vimvars[vidx++].vv_name); } - xfree(varnamebuf); - varnamebuf = NULL; + XFREE_CLEAR(varnamebuf); varnamebuflen = 0; return NULL; } @@ -5942,8 +5937,7 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate) // Next try expanding things like $VIM and ${HOME}. string = expand_env_save(name - 1); if (string != NULL && *string == '$') { - xfree(string); - string = NULL; + XFREE_CLEAR(string); } } name[len] = cc; @@ -6535,7 +6529,7 @@ static void api_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr) Object result = fn(VIML_INTERNAL_CALL, args, &err); if (ERROR_SET(&err)) { - nvim_err_writeln(cstr_as_string(err.msg)); + emsgf_multiline((const char *)e_api_error, err.msg); goto end; } @@ -8874,8 +8868,8 @@ static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr) } else { len = strlen(fname); size_t usedlen = 0; - (void)modify_fname((char_u *)mods, &usedlen, (char_u **)&fname, &fbuf, - &len); + (void)modify_fname((char_u *)mods, false, &usedlen, + (char_u **)&fname, &fbuf, &len); } rettv->v_type = VAR_STRING; @@ -13815,8 +13809,7 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) if (*q != NUL) { STRMOVE(remain, q - 1); } else { - xfree(remain); - remain = NULL; + XFREE_CLEAR(remain); } } @@ -14125,8 +14118,11 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr) Error err = ERROR_INIT; - Object result = rpc_send_call((uint64_t)argvars[0].vval.v_number, - tv_get_string(&argvars[1]), args, &err); + + uint64_t chan_id = (uint64_t)argvars[0].vval.v_number; + const char *method = tv_get_string(&argvars[1]); + + Object result = rpc_send_call(chan_id, method, args, &err); if (l_provider_call_nesting) { current_SID = save_current_SID; @@ -14139,7 +14135,20 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr) } if (ERROR_SET(&err)) { - nvim_err_writeln(cstr_as_string(err.msg)); + const char *name = NULL; + Channel *chan = find_channel(chan_id); + if (chan) { + name = rpc_client_name(chan); + } + msg_ext_set_kind("rpc_error"); + if (name) { + emsgf_multiline("Error invoking '%s' on channel %"PRIu64" (%s):\n%s", + method, chan_id, name, err.msg); + } else { + emsgf_multiline("Error invoking '%s' on channel %"PRIu64":\n%s", + method, chan_id, err.msg); + } + goto end; } @@ -17879,6 +17888,25 @@ static void f_winheight(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } +// "winlayout()" function +static void f_winlayout(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + tabpage_T *tp; + + tv_list_alloc_ret(rettv, 2); + + if (argvars[0].v_type == VAR_UNKNOWN) { + tp = curtab; + } else { + tp = find_tabpage((int)tv_get_number(&argvars[0])); + if (tp == NULL) { + return; + } + } + + get_framelayout(tp->tp_topframe, rettv->vval.v_list, true); +} + /* * "winline()" function */ @@ -20391,8 +20419,7 @@ void ex_function(exarg_T *eap) /* between ":append" and "." and between ":python <<EOF" and "EOF" * don't check for ":endfunc". */ if (STRCMP(theline, skip_until) == 0) { - xfree(skip_until); - skip_until = NULL; + XFREE_CLEAR(skip_until); } } else { /* skip ':' and blanks*/ @@ -20550,8 +20577,7 @@ void ex_function(exarg_T *eap) // redefine existing function ga_clear_strings(&(fp->uf_args)); ga_clear_strings(&(fp->uf_lines)); - xfree(name); - name = NULL; + XFREE_CLEAR(name); } } } else { @@ -22632,6 +22658,7 @@ void reset_v_option_vars(void) int modify_fname( char_u *src, // string with modifiers + bool tilde_file, // "~" is a file name, not $HOME size_t *usedlen, // characters after src that are used char_u **fnamep, // file name so far char_u **bufp, // buffer for allocated file name or NULL @@ -22661,8 +22688,8 @@ repeat: || (*fnamep)[1] == '\\' # endif || (*fnamep)[1] == NUL) - #endif + && !(tilde_file && (*fnamep)[1] == NUL) ) { *fnamep = expand_env_save(*fnamep); xfree(*bufp); /* free any allocated file name */ |