autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: AC_DEFUN_ONCE semantics


From: Eric Blake
Subject: Re: AC_DEFUN_ONCE semantics
Date: Thu, 29 Jan 2009 00:17:21 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Eric Blake <ebb9 <at> byu.net> writes:

> The new definition of m4_defun_once (which is an alias to AC_DEFUN_ONCE) used 
> in this patch exploits internal knowledge of m4sugar primitives for optimal 
m4 
> speed; the version of the patch that I am submitting to gnulib does the same 
> thing, but with a bit more overhead, because it only uses public API 
available 
> since at least 2.59.

That patch produced a spurious blank line if you require'd a defun_once macro 
inside the body of a defun'd macro [1], but not if you directly expanded it 
[2]; and inconsistent with defun'd macros [3]:

m4_defun_once([a],[1])dnl
m4_defun_once([b],[2])dnl
m4_defun([c],[3])dnl
m4_defun([d],[m4_require([a])b[]m4_require([c])4])dnl
d
1

2
3
4

I'm applying this, which normalizes the number of newlines when a defun_once 
macro is hoisted, whether that hoisting occurred from direct expansion or a 
require.  This patch also has the benefit of fewer repetitions of the macro 
body, for definite memory savings and a slight speedup.

More and more, I get the impression that my m4sugar code looks like black magic 
to the casual onlooker.  Apologies to those who think I don't comment my code 
enough for all the tricks I pull off.

Meanwhile, I've applied the patch that fixes Ralf's report about another false 
positive expand-before-require (in part, because detecting whether we are in a 
nested require vs. direct expansion in this patch relied on using the variables 
introduced in the patch for Ralf's issue).  I'm also applying the first of my 2-
patch series that uses AC_DEFUN_ONCE in more places (ie. AC_CANONICAL_HOST and 
AC_USE_SYSTEM_EXTENSIONS, but not AC_PROG_MKDIR_P).


From: Eric Blake <address@hidden>
Date: Wed, 28 Jan 2009 16:14:13 -0700
Subject: [PATCH] Reduce blank lines in AC_DEFUN_ONCE macros.

* lib/m4sugar/m4sugar.m4 (m4_defun_once): Avoid redundant blank
line when a defun_once macro is required.
(_m4_defun_once): New helper macro, for less memory use.
* tests/m4sugar.at (m4@&address@hidden: nested): Adjust test.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog              |    6 ++++++
 lib/m4sugar/m4sugar.m4 |   18 ++++++++++++------
 tests/m4sugar.at       |    5 +----
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e50376e..33cadf8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2009-01-28  Eric Blake  <address@hidden>
 
+       Reduce blank lines in AC_DEFUN_ONCE macros.
+       * lib/m4sugar/m4sugar.m4 (m4_defun_once): Avoid redundant blank
+       line when a defun_once macro is required.
+       (_m4_defun_once): New helper macro, for less memory use.
+       * tests/m4sugar.at (m4@&address@hidden: nested): Adjust test.
+
        Silence another false positive expand-before-require.
        * lib/m4sugar/m4sugar.m4 (_m4_defun_pro_outer)
        (_m4_defun_epi_outer, _m4_require_call, m4_provide): Track name
diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4
index 0af1f56..55dc644 100644
--- a/lib/m4sugar/m4sugar.m4
+++ b/lib/m4sugar/m4sugar.m4
@@ -1939,12 +1939,17 @@ m4_define([m4_defun_init],
 #
 # If _m4_divert_dump is empty, we are called at the top level;
 # otherwise, we must ensure that we are required in front of the
-# current defun'd macro.
+# current defun'd macro.  Use a helper macro so that EXPANSION need
+# only occur once in the definition of NAME, since it might be large.
 m4_define([m4_defun_once],
 [m4_define([m4_location($1)], m4_location)]dnl
-[m4_define([$1], [m4_pushdef([$1])m4_if(_m4_divert_dump, [],
-  [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])],
-  [_m4_require_call([$1], [$2[]m4_provide([$1])], _m4_divert_dump)])])])
+[m4_define([$1], [_m4_defun_once([$1], [$2], m4_if(_m4_divert_dump, [],
+  [[_m4_defun_pro([$1])m4_unquote(], [)_m4_defun_epi([$1])]],
+m4_ifdef([_m4_diverting([$1])], [-]), [-], [[m4_unquote(], [)]],
+  [[_m4_require_call([$1],], [, _m4_divert_dump)]]))])])
+
+m4_define([_m4_defun_once],
+[m4_pushdef([$1])$3[$2[]m4_provide([$1])]$4])
 
 
 # m4_pattern_forbid(ERE, [WHY])
@@ -1978,8 +1983,9 @@ m4_define([m4_before],
 # -----------------------------------------------------------
 # If NAME-TO-CHECK has never been expanded (actually, if it is not
 # m4_provide'd), expand BODY-TO-EXPAND *before* the current macro
-# expansion.  Once expanded, emit it in _m4_divert_dump.  Keep track
-# of the m4_require chain in _m4_expansion_stack.
+# expansion; follow the expansion with a newline.  Once expanded, emit
+# it in _m4_divert_dump.  Keep track of the m4_require chain in
+# _m4_expansion_stack.
 #
 # The normal cases are:
 #
diff --git a/tests/m4sugar.at b/tests/m4sugar.at
index 5f3c01f..6286af2 100644
--- a/tests/m4sugar.at
+++ b/tests/m4sugar.at
@@ -461,8 +461,7 @@ dnl Check m4_defun_once behavior
 AT_CHECK_M4SUGAR_TEXT([[
 m4_defun_once([a], [[a]])dnl
 m4_defun([b], [[b]m4_require([a])])dnl
-m4_defun([c], [[c]
-a[]m4_require([b])])dnl
+m4_defun([c], [[c]a[]m4_require([b])])dnl
 c
 a
 m4_defun_once([d], [[d]m4_require([a])])dnl
@@ -475,10 +474,8 @@ a
 b
 c
 
-
 d
 e
-
 f
 ]])
 
-- 
1.6.0.4







reply via email to

[Prev in Thread] Current Thread [Next in Thread]