[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] use indirect dispatch instead of m4_case
From: |
Paolo Bonzini |
Subject: |
[PATCH] use indirect dispatch instead of m4_case |
Date: |
Fri, 5 Oct 2007 09:57:59 +0200 |
Just as an experiment, I tried replacing m4_case with indirect dispatch
in _AT_CHECK. It *is* faster by about 10%.
There is no more duplicate code in general.m4 than there was before.
2007-10-04 Paolo Bonzini <address@hidden>
* general.m4 (AT_DIFF_STDERR(...), AT_DIFF_STDOUT(...): New,
extracted from _AT_CHECK.
(_AT_CHECK): Replace m4_case with m4_ifdef/m4_indir.
---
ChangeLog | 6 ++++++
lib/autotest/general.m4 | 31 +++++++++++++++++--------------
2 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/lib/autotest/general.m4 b/lib/autotest/general.m4
index b87ba96..1065d0b 100644
--- a/lib/autotest/general.m4
+++ b/lib/autotest/general.m4
@@ -1486,6 +1486,19 @@ m4_popdef([at_lf])[]dnl
m4_popdef([at_reason])])
+# AT_DIFF_STDERR/AT_DIFF_STDOUT
+# -----------------------------
+# These are subroutines of AT_CHECK. Using indirect dispatch is a tad
+# faster than using m4_case, and these are called very frequently.
+m4_define([AT_DIFF_STDERR(stderr)], [echo stderr:; tee stderr <"$at_stderr"])
+m4_define([AT_DIFF_STDERR(ignore)], [echo stderr:; cat "$at_stderr"])
+m4_define([AT_DIFF_STDERR(experr)], [$at_diff experr "$at_stderr" ||
at_failed=:])
+m4_define([AT_DIFF_STDERR()], [at_diff_devnull "$at_stderr" ||
at_failed=:])
+m4_define([AT_DIFF_STDOUT(stdout)], [echo stdout:; tee stdout <"$at_stdout"])
+m4_define([AT_DIFF_STDOUT(ignore)], [echo stdout:; cat "$at_stdout"])
+m4_define([AT_DIFF_STDOUT(expout)], [$at_diff expout "$at_stdout" ||
at_failed=:])
+m4_define([AT_DIFF_STDOUT()], [at_diff_devnull "$at_stdout" ||
at_failed=:])
+
# _AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
# [RUN-IF-FAIL], [RUN-IF-PASS], SHELL_ESCAPE_IO)
# ---------------------------------------------------------
@@ -1532,20 +1545,10 @@ else
fi
at_status=$?
at_failed=false
-dnl Check stderr.
-m4_case([$4],
- stderr, [echo stderr:; tee stderr <"$at_stderr"],
- ignore, [echo stderr:; cat "$at_stderr"],
- experr, [$at_diff experr "$at_stderr" || at_failed=:],
- [], [at_diff_devnull "$at_stderr" || at_failed=:],
- [echo >>"$at_stderr";
AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$4])],[$4])"]) | $at_diff - "$at_stderr" ||
at_failed=:])
-dnl Check stdout.
-m4_case([$3],
- stdout, [echo stdout:; tee stdout <"$at_stdout"],
- ignore, [echo stdout:; cat "$at_stdout"],
- expout, [$at_diff expout "$at_stdout" || at_failed=:],
- [], [at_diff_devnull "$at_stdout" || at_failed=:],
- [echo >>"$at_stdout";
AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$3])],[$3])"]) | $at_diff - "$at_stdout" ||
at_failed=:])
+m4_ifdef([AT_DIFF_STDERR($4)], [m4_indir([AT_DIFF_STDERR($4)])],
+ [echo >>"$at_stderr";
AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$4])],[$4])"]) | $at_diff - "$at_stderr" ||
at_failed=:])
+m4_ifdef([AT_DIFF_STDOUT($3)], [m4_indir([AT_DIFF_STDOUT($3)])],
+ [echo >>"$at_stdout";
AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$3])],[$3])"]) | $at_diff - "$at_stdout" ||
at_failed=:])
m4_if([$2], [ignore], [at_check_skip], [at_check_status m4_default([$2],
[0])]) $at_status "$at_srcdir/AT_LINE"
AS_IF($at_failed, [$5], [$6])
$at_failed && at_log_failure AT_capture_files
--
1.5.2.4