aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--src/eval.c1
-rw-r--r--src/ex_cmds.c18
-rw-r--r--src/os/event.c28
-rw-r--r--src/testdir/Makefile17
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.