diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | src/eval.c | 1 | ||||
-rw-r--r-- | src/ex_cmds.c | 18 | ||||
-rw-r--r-- | src/os/event.c | 28 | ||||
-rw-r--r-- | src/testdir/Makefile | 17 |
5 files changed, 47 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore index 7e079cd84a..6d9272c92b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ /src/testdir/*.failed /src/testdir/X* /src/testdir/valgrind.* +/src/testdir/.gdbinit # Folder generated by the unit tests /test/includes/post/ diff --git a/src/eval.c b/src/eval.c index eb0a14eaca..df097d5e37 100644 --- a/src/eval.c +++ b/src/eval.c @@ -10252,6 +10252,7 @@ static void f_has(typval_T *argvars, typval_T *rettv) "extra_search", "farsi", "file_in_path", + "filterpipe", "find_in_path", "float", "folding", diff --git a/src/ex_cmds.c b/src/ex_cmds.c index b0919f3b30..d0e4c9eccd 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1024,7 +1024,23 @@ do_filter ( if (do_out) shell_flags |= SHELL_DOOUT; - if ((do_in && (itmp = vim_tempname('i')) == NULL) + if (!do_in && do_out && !p_stmp) { + // Use a pipe to fetch stdout of the command, do not use a temp file. + shell_flags |= SHELL_READ; + curwin->w_cursor.lnum = line2; + } else if (do_in && !do_out && !p_stmp) { + // Use a pipe to write stdin of the command, do not use a temp file. + shell_flags |= SHELL_WRITE; + curbuf->b_op_start.lnum = line1; + curbuf->b_op_end.lnum = line2; + } else if (do_in && do_out && !p_stmp) { + // Use a pipe to write stdin and fetch stdout of the command, do not + // use a temp file. + shell_flags |= SHELL_READ|SHELL_WRITE; + curbuf->b_op_start.lnum = line1; + curbuf->b_op_end.lnum = line2; + curwin->w_cursor.lnum = line2; + } else if ((do_in && (itmp = vim_tempname('i')) == NULL) || (do_out && (otmp = vim_tempname('o')) == NULL)) { EMSG(_(e_notmp)); goto filterend; diff --git a/src/os/event.c b/src/os/event.c index 0a7d2c096c..ce630d5318 100644 --- a/src/os/event.c +++ b/src/os/event.c @@ -6,8 +6,10 @@ #include "os/event.h" #include "os/input.h" -static uv_timer_t timer_req; +static uv_timer_t timer; +static uv_prepare_t timer_prepare; static void timer_cb(uv_timer_t *handle, int); +static void timer_prepare_cb(uv_prepare_t *, int); void event_init() { @@ -15,7 +17,9 @@ void event_init() input_init(); /* Timer to wake the event loop if a timeout argument is passed to * `event_poll` */ - uv_timer_init(uv_default_loop(), &timer_req); + uv_timer_init(uv_default_loop(), &timer); + /* This prepare handle that actually starts the timer */ + uv_prepare_init(uv_default_loop(), &timer_prepare); } /* Wait for some event */ @@ -33,10 +37,12 @@ bool event_poll(int32_t ms) timed_out = false; if (ms > 0) { - /* Timeout passed as argument, start the libuv timer to wake us up and - * set our local flag */ - timer_req.data = &timed_out; - uv_timer_start(&timer_req, timer_cb, ms, 0); + /* Timeout passed as argument to the timer */ + timer.data = &timed_out; + /* We only start the timer after the loop is running, for that we + * use an prepare handle(pass the interval as data to it) */ + timer_prepare.data = &ms; + uv_prepare_start(&timer_prepare, timer_prepare_cb); } else if (ms == 0) { /* * For ms == 0, we need to do a non-blocking event poll by @@ -58,10 +64,11 @@ bool event_poll(int32_t ms) input_stop(); - if (!timed_out && ms > 0) { + if (ms > 0) { /* Timer event did not trigger, stop the watcher since we no longer * care about it */ - uv_timer_stop(&timer_req); + uv_timer_stop(&timer); + uv_prepare_stop(&timer_prepare); } return input_ready(); @@ -72,3 +79,8 @@ static void timer_cb(uv_timer_t *handle, int status) { *((bool *)handle->data) = true; } + +static void timer_prepare_cb(uv_prepare_t *handle, int status) +{ + uv_timer_start(&timer, timer_cb, *(uint32_t *)handle->data, 0); +} diff --git a/src/testdir/Makefile b/src/testdir/Makefile index 6605a0f049..06223de8c5 100644 --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -27,12 +27,8 @@ SCRIPTS := test1.out test2.out test3.out test4.out test5.out test6.out \ SCRIPTS_GUI := test16.out -ifdef VALGRIND_GDB -VGDB := --vgdb=yes --vgdb-error=0 -endif - -ifdef VALGRIND_CHECK -VALGRIND = valgrind --suppressions=../../.valgrind.supp --leak-check=full --error-exitcode=123 --log-file=valgrind.$* $(VGDB) +ifdef USE_GDB +GDB = gdb --args endif ifdef TESTNUM @@ -45,6 +41,9 @@ nongui: nolog $(SCRIPTS) report gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report +.gdbinit: + echo 'set $$_exitcode = -1\nrun\nif $$_exitcode != -1\n quit\nend' > .gdbinit + report: @echo @echo 'Test results:' @@ -57,12 +56,12 @@ $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) RM_ON_RUN = test.out X* viminfo RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok -RUN_VIM = $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in +RUN_VIM = $(GDB) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in clean: -rm -rf *.out *.failed *.rej *.orig test.log $(RM_ON_RUN) $(RM_ON_START) valgrind.* -test1.out: test1.in +test1.out: .gdbinit test1.in -rm -rf $*.failed $(RM_ON_RUN) $(RM_ON_START) wrongtermsize $(RUN_VIM) $*.in @/bin/sh -c "if test -e wrongtermsize; \ @@ -76,7 +75,7 @@ test1.out: test1.in echo; exit 1; fi" -rm -rf X* viminfo -.in.out: +.in.out: .gdbinit -rm -rf $*.failed test.ok $(RM_ON_RUN) cp $*.ok test.ok # Sleep a moment to avoid that the xterm title is messed up. |