diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-09 14:08:44 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-09 14:08:44 +0000 |
commit | c1b6623d50f7f529f5c9135fc989f683f628f038 (patch) | |
tree | b67485a68e46fde7b7d44642f8af9498d8fe9b03 /gcc/java/except.c | |
parent | fd663a4f644536104e6a20f9a1d26e3f68ac1824 (diff) | |
download | gcc-c1b6623d50f7f529f5c9135fc989f683f628f038.tar.gz |
2000-01-25 Andrew Haley <aph@cygnus.com>
* java-except.h (struct eh_range): Add `expanded' field.
(maybe_start_try): Add end_pc arg.
(maybe_end_try): Ditto.
* java-tree.h (force_poplevels): new function.
* expr.c (expand_byte_code): Don't call maybe_start_try or
maybe_end_try.
* except.c (add_handler): Reset expanded.
(expand_start_java_handler): Set expanded.
(check_start_handlers): Don't expand a start handler that's
already been expanded.
(maybe_start_try): Add end_pc arg. Only expand a handler which
ends after end_pc.
(expand_end_java_handler): call force_poplevels.
(force_poplevels): new function.
* decl.c (binding_level): Add start_pc of binding level.
(maybe_pushlevels): Call maybe_start_try when pushing binding
levels.
(maybe_poplevels): Call maybe_end_try when popping binding levels.
(LARGEST_PC): Define.
(clear_binding_level): Use LARGEST_PC.
* java-tree.h (DEBUG_JAVA_BINDING_LEVELS): new define.
* decl.c (DEBUG_JAVA_BINDING_LEVELS): new define.
(binding_depth, is_class_level, current_pc): new variables.
(struct binding_level): ditto.
(indent): new function.
(push_jvm_slot): add debugging info.
(maybe_pushlevels): ditto.
(maybe_poplevels): ditto.
(pushlevel): ditto.
(poplevel): ditto.
(start_java_method): ditto.
(give_name_to_locals): comment only.
* except.c (binding_depth, is_class_level, current_pc):
new variables.
(expand_start_java_handler): add debugging info.
(expand_end_java_handler): ditto.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31861 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/except.c')
-rw-r--r-- | gcc/java/except.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/gcc/java/except.c b/gcc/java/except.c index f44f07270f8..1fb59345d88 100644 --- a/gcc/java/except.c +++ b/gcc/java/except.c @@ -42,7 +42,6 @@ static void expand_end_java_handler PARAMS ((struct eh_range *)); static struct eh_range *find_handler_in_range PARAMS ((int, struct eh_range *, struct eh_range *)); static void link_handler PARAMS ((struct eh_range *, struct eh_range *)); -static void check_start_handlers PARAMS ((struct eh_range *, int)); extern struct obstack permanent_obstack; @@ -62,6 +61,14 @@ static struct eh_range *cache_next_child; struct eh_range whole_range; +#if defined(DEBUG_JAVA_BINDING_LEVELS) +int binding_depth; +int is_class_level; +int current_pc; +extern void indent (); + +#endif + /* Search for the most specific eh_range containing PC. Assume PC is within RANGE. CHILD is a list of children of RANGE such that any @@ -278,6 +285,7 @@ add_handler (start_pc, end_pc, handler, type) h->outer = NULL; h->handlers = build_tree_list (type, handler); h->next_sibling = NULL; + h->expanded = 0; if (prev == NULL) whole_range.first_child = h; @@ -289,8 +297,14 @@ add_handler (start_pc, end_pc, handler, type) /* if there are any handlers for this range, issue start of region */ static void expand_start_java_handler (range) - struct eh_range *range ATTRIBUTE_UNUSED; + struct eh_range *range; { +#if defined(DEBUG_JAVA_BINDING_LEVELS) + indent (); + fprintf (stderr, "expand start handler pc %d --> %d\n", + current_pc, range->end_pc); +#endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */ + range->expanded = 1; push_obstacks (&permanent_obstack, &permanent_obstack); expand_eh_region_start (); pop_obstacks (); @@ -327,8 +341,9 @@ prepare_eh_table_type (type) static void expand_end_java_handler (range) struct eh_range *range; -{ +{ tree handler = range->handlers; + force_poplevels (range->start_pc); push_obstacks (&permanent_obstack, &permanent_obstack); expand_start_all_catch (); pop_obstacks (); @@ -341,6 +356,11 @@ expand_end_java_handler (range) end_catch_handler (); } expand_end_all_catch (); +#if defined(DEBUG_JAVA_BINDING_LEVELS) + indent (); + fprintf (stderr, "expand end handler pc %d <-- %d\n", + current_pc, range->start_pc); +#endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */ } /* Recursive helper routine for maybe_start_handlers. */ @@ -353,35 +373,48 @@ check_start_handlers (range, pc) if (range != NULL_EH_RANGE && range->start_pc == pc) { check_start_handlers (range->outer, pc); - expand_start_java_handler (range); + if (!range->expanded) + expand_start_java_handler (range); } } -struct eh_range *current_range; -/* Emit any start-of-try-range start at PC. */ +static struct eh_range *current_range; + +/* Emit any start-of-try-range starting at start_pc and ending after + end_pc. */ void -maybe_start_try (pc) - int pc; +maybe_start_try (start_pc, end_pc) + int start_pc; + int end_pc; { + struct eh_range *range; if (! doing_eh (1)) return; - current_range = find_handler (pc); - check_start_handlers (current_range, pc); + range = find_handler (start_pc); + while (range != NULL_EH_RANGE && range->start_pc == start_pc + && range->end_pc < end_pc) + range = range->outer; + + current_range = range; + check_start_handlers (range, start_pc, end_pc); } -/* Emit any end-of-try-range end at PC. */ +/* Emit any end-of-try-range ending at end_pc and starting before + start_pc. */ void -maybe_end_try (pc) - int pc; +maybe_end_try (start_pc, end_pc) + int start_pc; + int end_pc; { if (! doing_eh (1)) return; - while (current_range != NULL_EH_RANGE && current_range->end_pc <= pc) + while (current_range != NULL_EH_RANGE && current_range->end_pc <= end_pc + && current_range->start_pc >= start_pc) { expand_end_java_handler (current_range); current_range = current_range->outer; |