diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2015-04-07 20:04:35 -0400 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2015-04-07 20:04:35 -0400 |
commit | 95db8df682ea7ac392a1e9a6de45a6ccc0727df1 (patch) | |
tree | 924e999ed5c962eac1d54b114b9989ef7e496caa | |
parent | ee3af18640a61d7b3191cc490c824b23cb8278f9 (diff) | |
parent | 3c57f5a0e18455cb54974780b02a9903b043b725 (diff) | |
download | rneovim-95db8df682ea7ac392a1e9a6de45a6ccc0727df1.tar.gz rneovim-95db8df682ea7ac392a1e9a6de45a6ccc0727df1.tar.bz2 rneovim-95db8df682ea7ac392a1e9a6de45a6ccc0727df1.zip |
Merge #2303 'Fix clang analysis warnings. (9)'
-rw-r--r-- | src/nvim/eval.c | 65 | ||||
-rw-r--r-- | src/nvim/terminal.c | 10 | ||||
-rw-r--r-- | src/nvim/window.c | 2 |
3 files changed, 43 insertions, 34 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 4ab31985b5..231b92db3c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -5942,18 +5942,23 @@ dictitem_T *dict_find(dict_T *d, char_u *key, int len) return HI2DI(hi); } -// Get a function from a dictionary -static ufunc_T *get_dict_callback(dict_T *d, char *key) +/// Get a function from a dictionary +/// @param[out] result The address where a pointer to the wanted callback +/// will be left. +/// @return true/false on success/failure. +static bool get_dict_callback(dict_T *d, char *key, ufunc_T **result) { dictitem_T *di = dict_find(d, (uint8_t *)key, -1); if (di == NULL) { - return NULL; + *result = NULL; + return true; } if (di->di_tv.v_type != VAR_FUNC && di->di_tv.v_type != VAR_STRING) { EMSG(_("Argument is not a function or function name")); - return NULL; + *result = NULL; + return false; } uint8_t *name = di->di_tv.vval.v_string; @@ -5970,11 +5975,13 @@ static ufunc_T *get_dict_callback(dict_T *d, char *key) if (!rv) { EMSG2(_("Function %s doesn't exist"), name); - return NULL; + *result = NULL; + return false; } rv->uf_refcount++; - return rv; + *result = rv; + return true; } /* @@ -10810,6 +10817,8 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv) return; } + assert(args->lv_first); + if (!os_can_exe(args->lv_first->li_tv.vval.v_string, NULL)) { // String is not executable EMSG2(e_jobexe, args->lv_first->li_tv.vval.v_string); @@ -10820,8 +10829,7 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv) ufunc_T *on_stdout = NULL, *on_stderr = NULL, *on_exit = NULL; if (argvars[1].v_type == VAR_DICT) { job_opts = argvars[1].vval.v_dict; - common_job_callbacks(job_opts, &on_stdout, &on_stderr, &on_exit); - if (did_emsg) { + if (!common_job_callbacks(job_opts, &on_stdout, &on_stderr, &on_exit)) { return; } } @@ -15077,8 +15085,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv) dict_T *job_opts = NULL; if (argvars[1].v_type == VAR_DICT) { job_opts = argvars[1].vval.v_dict; - common_job_callbacks(job_opts, &on_stdout, &on_stderr, &on_exit); - if (did_emsg) { + if (!common_job_callbacks(job_opts, &on_stdout, &on_stderr, &on_exit)) { return; } } @@ -20051,27 +20058,27 @@ static inline JobOptions common_job_options(char **argv, ufunc_T *on_stdout, return opts; } -static inline void common_job_callbacks(dict_T *vopts, ufunc_T **on_stdout, - ufunc_T **on_stderr, ufunc_T **on_exit) +/// Return true/false on success/failure. +static inline bool common_job_callbacks(dict_T *vopts, ufunc_T **on_stdout, + ufunc_T **on_stderr, ufunc_T **on_exit) { - *on_stdout = get_dict_callback(vopts, "on_stdout"); - *on_stderr = get_dict_callback(vopts, "on_stderr"); - *on_exit = get_dict_callback(vopts, "on_exit"); - if (did_emsg) { - if (*on_stdout) { - user_func_unref(*on_stdout); - } - if (*on_stderr) { - user_func_unref(*on_stderr); - } - if (*on_exit) { - user_func_unref(*on_exit); - } - return; + if (get_dict_callback(vopts, "on_stdout", on_stdout) + && get_dict_callback(vopts, "on_stderr", on_stderr) + && get_dict_callback(vopts, "on_exit", on_exit)) { + vopts->internal_refcount++; + vopts->dv_refcount++; + return true; } - - vopts->internal_refcount++; - vopts->dv_refcount++; + if (*on_stdout) { + user_func_unref(*on_stdout); + } + if (*on_stderr) { + user_func_unref(*on_stderr); + } + if (*on_exit) { + user_func_unref(*on_exit); + } + return false; } static inline Job *common_job_start(JobOptions opts, typval_T *rettv) diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index daba7b943f..dda5cf69ab 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -1047,7 +1047,7 @@ static void redraw(bool restore_cursor) setcursor(); } else if (restore_cursor) { ui_cursor_goto(save_row, save_col); - } else { + } else if (term) { // exiting terminal focus, put the window cursor in a valid position int height, width; vterm_get_size(term->vt, &height, &width); @@ -1099,28 +1099,30 @@ static bool is_focused(Terminal *term) do { \ Error err; \ o = dict_get_value(t->buf->b_vars, cstr_as_string(k), &err); \ - if (obj.type == kObjectTypeNil) { \ + if (o.type == kObjectTypeNil) { \ o = dict_get_value(&globvardict, cstr_as_string(k), &err); \ } \ } while (0) static char *get_config_string(Terminal *term, char *key) { - Object obj = OBJECT_INIT; + Object obj; GET_CONFIG_VALUE(term, key, obj); if (obj.type == kObjectTypeString) { return obj.data.string.data; } + api_free_object(obj); return NULL; } static int get_config_int(Terminal *term, char *key) { - Object obj = OBJECT_INIT; + Object obj; GET_CONFIG_VALUE(term, key, obj); if (obj.type == kObjectTypeInteger) { return (int)obj.data.integer; } + api_free_object(obj); return 0; } diff --git a/src/nvim/window.c b/src/nvim/window.c index 9f07f2bddc..9c56cc5b82 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -1766,7 +1766,7 @@ static int close_last_window_tabpage(win_T *win, int free_buf, tabpage_T *prev_c } buf_T *old_curbuf = curbuf; - Terminal *term = win->w_buffer->terminal; + Terminal *term = win->w_buffer ? win->w_buffer->terminal : NULL; if (term) { // Don't free terminal buffers free_buf = false; |