except.h: Add outer_context_label_stack.
* except.h: Add outer_context_label_stack. * except.c: Likewise. (expand_start_all_catch): Push the outer_context for the try block onto outer_context_label_stack. (expand_end_all_catch): Use it and pop it. From-SVN: r16645
This commit is contained in:
parent
e9295d5321
commit
1418bb67a3
|
@ -1,3 +1,11 @@
|
||||||
|
Fri Nov 21 12:18:51 1997 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* except.h: Add outer_context_label_stack.
|
||||||
|
* except.c: Likewise.
|
||||||
|
(expand_start_all_catch): Push the outer_context for the try block
|
||||||
|
onto outer_context_label_stack.
|
||||||
|
(expand_end_all_catch): Use it and pop it.
|
||||||
|
|
||||||
Fri Nov 21 10:13:11 1997 Robert Lipe (robertl@dgii.com)
|
Fri Nov 21 10:13:11 1997 Robert Lipe (robertl@dgii.com)
|
||||||
|
|
||||||
* i386/sco5.h (HAVE_ATEXIT): Revert last change.
|
* i386/sco5.h (HAVE_ATEXIT): Revert last change.
|
||||||
|
|
15
gcc/except.c
15
gcc/except.c
|
@ -483,12 +483,15 @@ static tree protect_list;
|
||||||
|
|
||||||
/* Keeps track of the label to resume to should one want to resume
|
/* Keeps track of the label to resume to should one want to resume
|
||||||
normal control flow out of a handler (instead of, say, returning to
|
normal control flow out of a handler (instead of, say, returning to
|
||||||
the caller of the current function or exiting the program). Also
|
the caller of the current function or exiting the program). */
|
||||||
used as the context of a throw to rethrow an exception to the outer
|
|
||||||
exception region. */
|
|
||||||
|
|
||||||
struct label_node *caught_return_label_stack = NULL;
|
struct label_node *caught_return_label_stack = NULL;
|
||||||
|
|
||||||
|
/* Keeps track of the label used as the context of a throw to rethrow an
|
||||||
|
exception to the outer exception region. */
|
||||||
|
|
||||||
|
struct label_node *outer_context_label_stack = NULL;
|
||||||
|
|
||||||
/* A random data area for the front end's own use. */
|
/* A random data area for the front end's own use. */
|
||||||
|
|
||||||
struct label_node *false_label_stack = NULL;
|
struct label_node *false_label_stack = NULL;
|
||||||
|
@ -1254,6 +1257,9 @@ expand_start_all_catch ()
|
||||||
if (! doing_eh (1))
|
if (! doing_eh (1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
push_label_entry (&outer_context_label_stack,
|
||||||
|
ehstack.top->entry->outer_context, NULL_TREE);
|
||||||
|
|
||||||
/* End the try block. */
|
/* End the try block. */
|
||||||
expand_eh_region_end (integer_zero_node);
|
expand_eh_region_end (integer_zero_node);
|
||||||
|
|
||||||
|
@ -1372,7 +1378,7 @@ expand_end_all_catch ()
|
||||||
thrown from) so that the outer EH region can then try to process
|
thrown from) so that the outer EH region can then try to process
|
||||||
the exception. */
|
the exception. */
|
||||||
|
|
||||||
expand_internal_throw (DECL_RTL (top_label_entry (&caught_return_label_stack)));
|
expand_internal_throw (outer_context_label_stack->u.rlabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we have the complete catch sequence. */
|
/* Now we have the complete catch sequence. */
|
||||||
|
@ -1382,6 +1388,7 @@ expand_end_all_catch ()
|
||||||
/* This level of catch blocks is done, so set up the successful
|
/* This level of catch blocks is done, so set up the successful
|
||||||
catch jump label for the next layer of catch blocks. */
|
catch jump label for the next layer of catch blocks. */
|
||||||
pop_label_entry (&caught_return_label_stack);
|
pop_label_entry (&caught_return_label_stack);
|
||||||
|
pop_label_entry (&outer_context_label_stack);
|
||||||
|
|
||||||
/* Add the new sequence of catches to the main one for this function. */
|
/* Add the new sequence of catches to the main one for this function. */
|
||||||
push_to_sequence (catch_clauses);
|
push_to_sequence (catch_clauses);
|
||||||
|
|
|
@ -227,6 +227,11 @@ extern void check_exception_handler_labels PROTO((void));
|
||||||
|
|
||||||
extern struct label_node *caught_return_label_stack;
|
extern struct label_node *caught_return_label_stack;
|
||||||
|
|
||||||
|
/* Keeps track of the label used as the context of a throw to rethrow an
|
||||||
|
exception to the outer exception region. */
|
||||||
|
|
||||||
|
extern struct label_node *outer_context_label_stack;
|
||||||
|
|
||||||
/* A random area used for purposes elsewhere. */
|
/* A random area used for purposes elsewhere. */
|
||||||
|
|
||||||
extern struct label_node *false_label_stack;
|
extern struct label_node *false_label_stack;
|
||||||
|
|
Loading…
Reference in New Issue