Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1))



>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".

Yes, I think this is preferable.  As we are introducing a new block,
there should be a new indentation level for it, and the braces make it
clearer.  And there's a bonus with this syntax:

    PERMALLOC
	some_function();
    LASTALLOC;

is legal, matching other bits of C syntax.  I think the size of the
resulting patch should not be a consideration.

>} #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.

Curious.  It's a perfectly legal expression, so any compiler that can't
grok it is broken.  However, if a common compiler barfs on that, maybe
we could have global_{heap,perm}alloc() return 0, so the comma operator
is unnecessary and there are no void subexpressions.

>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

Cleaner, I think, to have

#define ALLOC_RESTORE \
    ( nonlocal_useheap ? global_heapalloc() : global_permalloc() )
#define LASTALLOC_RETURN if(ALLOC_RESTORE, 0) ; else return

but the semantics of these two are identical.  ("ALLOC_RESTORE;" is a
legal statement in both cases.)

>	if (getmeoutofhere()) {
>	    ALLOC_RESTORE;
>	    return(-1);
>	}

I'd rather have the convenience of LASTALLOC_RETURN -- at least, if
this is often required.

-zefram




Messages sorted by: Reverse Date, Date, Thread, Author