(POPSTACK): Pop discarded elts off all the stacks as we go.

From-SVN: r2383
This commit is contained in:
Richard Stallman 1992-10-09 16:59:32 +00:00
parent cb00f51acf
commit 6ed1d6c5ed
1 changed files with 23 additions and 7 deletions

View File

@ -332,6 +332,8 @@ struct nesting
/* Chain of all pending binding contours. */
struct nesting *block_stack;
/* If any new stacks are added here, add them to POPSTACKS too. */
/* Chain of all pending binding contours that restore stack levels
or have cleanups. */
struct nesting *stack_block_stack;
@ -360,17 +362,31 @@ int nesting_depth;
#define ALLOC_NESTING() \
(struct nesting *) obstack_alloc (&stmt_obstack, sizeof (struct nesting))
/* Pop one of the sub-stacks, such as `loop_stack' or `cond_stack';
and pop off `nesting_stack' down to the same level. */
/* Pop the nesting stack element by element until we pop off
the element which is at the top of STACK.
Update all the other stacks, popping off elements from them
as we pop them from nesting_stack. */
#define POPSTACK(STACK) \
do { int initial_depth = nesting_stack->depth; \
do { struct nesting *this = STACK; \
STACK = this->next; \
do { struct nesting *target = STACK; \
struct nesting *this; \
do { this = nesting_stack; \
if (loop_stack == this) \
loop_stack = loop_stack->next; \
if (cond_stack == this) \
cond_stack = cond_stack->next; \
if (block_stack == this) \
block_stack = block_stack->next; \
if (stack_block_stack == this) \
stack_block_stack = stack_block_stack->next; \
if (case_stack == this) \
case_stack = case_stack->next; \
if (except_stack == this) \
except_stack = except_stack->next; \
nesting_depth = nesting_stack->depth - 1; \
nesting_stack = this->all; \
nesting_depth = this->depth; \
obstack_free (&stmt_obstack, this); } \
while (nesting_depth > initial_depth); } while (0)
while (this != target); } while (0)
/* In some cases it is impossible to generate code for a forward goto
until the label definition is seen. This happens when it may be necessary