aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c79
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 */