summaryrefslogtreecommitdiff
path: root/gcc/java/except.c
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2000-02-09 14:08:44 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2000-02-09 14:08:44 +0000
commitc1b6623d50f7f529f5c9135fc989f683f628f038 (patch)
treeb67485a68e46fde7b7d44642f8af9498d8fe9b03 /gcc/java/except.c
parentfd663a4f644536104e6a20f9a1d26e3f68ac1824 (diff)
downloadgcc-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.c61
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;