From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by melb.werple.net.au (8.7.5/8.7.3/2) with ESMTP id EAA08046 for ; Wed, 3 Jul 1996 04:01:40 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id NAA29796; Tue, 2 Jul 1996 13:52:13 -0400 (EDT) Resent-Date: Tue, 2 Jul 1996 13:52:13 -0400 (EDT) From: "Bart Schaefer" Message-Id: <960702105235.ZM4305@candle.brasslantern.com> Date: Tue, 2 Jul 1996 10:52:32 -0700 In-Reply-To: Zefram "Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1))" (Jul 2, 8:24am) References: <1822.199607020724@stone.dcs.warwick.ac.uk> Reply-To: schaefer@nbn.com X-Mailer: Z-Mail (4.0b.607 07jun96) To: Zefram Subject: Re: Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1)) Cc: hzoli@cs.elte.hu, zsh-workers@math.gatech.edu MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Resent-Message-ID: <"o6tis1.0.UH7.D7Msn"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/1509 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu On Jul 2, 8:24am, Zefram wrote: } Subject: Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1)) } } Bart wrote: } >2. Introduce macros for heapalloc/permalloc that start with an open } > brace, and a macro for lastalloc that ends with a close brace, so } > it's syntatically required that every heapalloc/permalloc have a } > matching lastalloc. } } Probably a good idea, but as these macros now introduce new syntax } let's make them *look* like syntax, rather than function calls. I would normally have done so, but I was trying to make the change as minimal as possible. If that's not a concern, I'd probably do something like this: #define ALLOC_BEGIN do { int nonlocal_useheap = useheap; 0 #define ALLOC_RESTORE do { \ if (nonlocal_useheap) global_heapalloc(); \ else global_permalloc(); \ } while (0) #define ALLOC_END ALLOC_RESTORE; } while (0) #define HEAPALLOC ALLOC_BEGIN; global_heapalloc(); do #define PERMALLOC ALLOC_BEGIN; global_permalloc(); do #define LASTALLOC while (0); ALLOC_END And then I'd write: HEAPALLOC { /* ... stuff ... */ } LASTALLOC; That makes the block context obvious. The macros are upper-case because I don't like introducing new "keywords". However, the above implies changing indentation and all sorts of stuff. I didn't want the patch to come out that large. So it could be: #define HEAPALLOC ALLOC_BEGIN; global_heapalloc() #define PERMALLOC ALLOC_BEGIN; global_permalloc() #define LASTALLOC ALLOC_END Then write: HEAPALLOC; /* ... stuff ... */ LASTALLOC; } :+ # define lastalloc_return \ } :+ if (nonlocal_useheap) global_heapalloc(); \ } :+ else global_permalloc(); \ } :+ return That's not in my original patch; Zoltan must have come up with it ... } This won't work as the body of an if or while. The following is always } safe: } } #define lastalloc_return \ } if( (nonlocal_useheap ? global_heapalloc() : global_permalloc()) , 0 ) \ } ; \ } else \ } return Hmm ... I seem to recall that some compilers don't like having void expressions (e.g. (?:) where both branches are void functions) used anywhere in a comma-expression. In particular, I think AIX either rejects this or compiles it wrong. However, I could be confusing that with something else ... I know for a fact that AIX could not handle an `if (x,y)' construct we used in zmail, forcing us to rewrite it as `if (x?0:y)' -- which doesn't work in general, it just happened that for us x was always 0 to begin with. If I'm confused and the comma-expression above turns out to be OK, I'd change ALLOC_RESTORE and add LASTALLOC_RETURN: #define ALLOC_RESTORE \ ((nonlocal_useheap ? global_heapalloc() : global_permalloc()), 0) #define LASTALLOC_RETURN if (ALLOC_RESTORE); else return Otherwise, I'd just leave it up to the programmer to write: HEAPALLOC; /* ... stuff ... */ if (getmeoutofhere()) { ALLOC_RESTORE; return(-1); } /* ... more stuff ... */ LASTALLOC; -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.nbn.com/people/lantern New male in /home/schaefer: >N 2 Justin William Schaefer Sat May 11 03:43 53/4040 "Happy Birthday"