diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-09-11 12:56:46 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-11 12:56:46 -0700 |
commit | 7652904f79f6e434568e0b8e5946cfcafc9aa767 (patch) | |
tree | 3c5f0f83308102190ed9e3209900b222d17ed808 /src | |
parent | c8223e1618c4510f9eff13df509c6da95f869cc6 (diff) | |
download | rneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.tar.gz rneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.tar.bz2 rneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.zip |
eval: wait(): always spin up dummy-timer #10990
This avoids getting "stuck". If user actually _wants_ to get stuck
forever, they could use `:sleep` or specify a really big `interval`.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 41 |
1 files changed, 16 insertions, 25 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index b067e03c2f..f9d346ea68 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -10910,31 +10910,24 @@ static void f_wait(typval_T *argvars, typval_T *rettv, FunPtr fptr) EMSG2(_(e_invargval), "1"); return; } + if ((argvars[2].v_type != VAR_NUMBER && argvars[2].v_type != VAR_UNKNOWN) + || (argvars[2].v_type == VAR_NUMBER && argvars[2].vval.v_number <= 0)) { + EMSG2(_(e_invargval), "3"); + return; + } int timeout = argvars[0].vval.v_number; typval_T expr = argvars[1]; + int interval = argvars[2].v_type == VAR_NUMBER + ? argvars[2].vval.v_number + : 200; // Default. + TimeWatcher *tw = xmalloc(sizeof(TimeWatcher)); - int interval = -1; - typval_T *tv_interval = &argvars[2]; - - TimeWatcher *tw = NULL; - - if (tv_interval->v_type == VAR_NUMBER) { - interval = tv_interval->vval.v_number; - if (interval <= 0) { - EMSG2(_(e_invargval), "3"); - return; - } - // Start dummy timer - tw = xmalloc(sizeof(TimeWatcher)); - time_watcher_init(&main_loop, tw, NULL); - tw->events = main_loop.events; - tw->blockable = true; - time_watcher_start(tw, dummy_timer_due_cb, interval, interval); - } else if (tv_interval->v_type != VAR_UNKNOWN) { - EMSG2(_(e_invargval), "3"); - return; - } + // Start dummy timer. + time_watcher_init(&main_loop, tw, NULL); + tw->events = main_loop.events; + tw->blockable = true; + time_watcher_start(tw, dummy_timer_due_cb, interval, interval); typval_T argv = TV_INITIAL_VALUE; typval_T exprval = TV_INITIAL_VALUE; @@ -10960,10 +10953,8 @@ static void f_wait(typval_T *argvars, typval_T *rettv, FunPtr fptr) called_emsg = save_called_emsg; // Stop dummy timer - if (tw) { - time_watcher_stop(tw); - time_watcher_close(tw, dummy_timer_close_cb); - } + time_watcher_stop(tw); + time_watcher_close(tw, dummy_timer_close_cb); } // "win_screenpos()" function |